示例#1
0
	virtual void handleResult(PendingInterrupt& pend)
	{
		int result = currentMIPS->r[MIPS_REG_V0];

		int alarmID = triggeredAlarm.front();
		triggeredAlarm.pop_front();

		// A non-zero result means to reschedule.
		if (result > 0)
		{
			DEBUG_LOG(HLE, "Rescheduling alarm %08x for +%dms", alarmID, result);
			u32 error;
			Alarm *alarm = kernelObjects.Get<Alarm>(alarmID, error);
			__KernelScheduleAlarm(alarm, (u64) usToCycles(result));
		}
		else
		{
			if (result < 0)
				WARN_LOG(HLE, "Alarm requested reschedule for negative value %u, ignoring", (unsigned) result);

			DEBUG_LOG(HLE, "Finished alarm %08x", alarmID);

			// Delete the alarm if it's not rescheduled.
			kernelObjects.Destroy<Alarm>(alarmID);
		}
	}
示例#2
0
	virtual void handleResult(int result)
	{
		// A non-zero result means to reschedule.
		// TODO: Do sysclock alarms return a different value unit?
		if (result > 0)
			__KernelScheduleAlarm(alarm, usToCycles(result));
		else if (result < 0)
			WARN_LOG(HLE, "Alarm requested reschedule for negative value %u, ignoring", (unsigned) result);
	}
示例#3
0
SceUID __KernelSetAlarm(u64 ticks, u32 handlerPtr, u32 commonPtr)
{
	if (!Memory::IsValidAddress(handlerPtr))
		return SCE_KERNEL_ERROR_ILLEGAL_ADDR;

	Alarm *alarm = new Alarm;
	SceUID uid = kernelObjects.Create(alarm);

	alarm->alm.size = NATIVEALARM_SIZE;
	alarm->alm.handlerPtr = handlerPtr;
	alarm->alm.commonPtr = commonPtr;

	__KernelScheduleAlarm(alarm, ticks);
	return uid;
}
示例#4
0
	virtual void handleResult(int result)
	{
		// A non-zero result means to reschedule.
		if (result > 0)
		{
			u32 error;
			Alarm *alarm = kernelObjects.Get<Alarm>(alarmID, error);
			__KernelScheduleAlarm(alarm, (u64) usToCycles(result));
		}
		else
		{
			if (result < 0)
				WARN_LOG(HLE, "Alarm requested reschedule for negative value %u, ignoring", (unsigned) result);

			// Delete the alarm if it's not rescheduled.
			kernelObjects.Destroy<Alarm>(alarmID);
			__ReleaseSubIntrHandler(PSP_SYSTIMER0_INTR, alarmID);
		}
	}
示例#5
0
SceUID __KernelSetAlarm(u64 ticks, u32 handlerPtr, u32 commonPtr)
{
	if (!alarmInitComplete)
		__KernelAlarmInit();

	Alarm *alarm = new Alarm;
	SceUID uid = kernelObjects.Create(alarm);

	alarm->alm.size = sizeof(NativeAlarm);
	alarm->alm.schedule = CoreTiming::GetTicks() + ticks;
	alarm->alm.handlerPtr = handlerPtr;
	alarm->alm.commonPtr = commonPtr;

	u32 error = __RegisterSubInterruptHandler(PSP_SYSTIMER0_INTR, uid, new AlarmIntrHandler(alarm));
	if (error != 0)
		return error;

	__KernelScheduleAlarm(alarm, (int) ticks);
	return uid;
}
示例#6
0
SceUID __KernelSetAlarm(u64 ticks, u32 handlerPtr, u32 commonPtr)
{
	if (!Memory::IsValidAddress(handlerPtr))
		return SCE_KERNEL_ERROR_ILLEGAL_ADDR;

	Alarm *alarm = new Alarm;
	SceUID uid = kernelObjects.Create(alarm);

	alarm->alm.size = NATIVEALARM_SIZE;
	alarm->alm.handlerPtr = handlerPtr;
	alarm->alm.commonPtr = commonPtr;

	u32 error;
	AlarmIntrHandler *handler = (AlarmIntrHandler *) __RegisterSubIntrHandler(PSP_SYSTIMER0_INTR, uid, error);
	if (error != 0)
	{
		kernelObjects.Destroy<Alarm>(uid);
		return error;
	}

	handler->setAlarm(alarm);
	__KernelScheduleAlarm(alarm, ticks);
	return uid;
}