void VsyncAlarmHandler(OSAlarm *alarm, OSContext *context) { gLastVsync = OSGetSystemTime(); OSWakeupThread(gVsyncThreadQueue); auto callback = gEventCallbacks[GX2EventCallback::Vsync]; if (callback.func) { callback.func(GX2EventCallback::Vsync, callback.data); } }
/** * Internal alarm cancel. * * Reset the alarm state to cancelled. * Wakes up all threads waiting on the alarm. * Removes the alarm from any queue it is in. */ static BOOL cancelAlarmNoLock(OSAlarm *alarm) { if (alarm->state != OSAlarmState::Set) { return FALSE; } alarm->state = OSAlarmState::Cancelled; alarm->nextFire = 0; alarm->period = 0; if (alarm->alarmQueue) { OSEraseFromQueue<OSAlarmQueue>(alarm->alarmQueue, alarm); alarm->alarmQueue = nullptr; } OSWakeupThread(&alarm->threadQueue); return TRUE; }
static bool OSTriggerAlarmNoLock(OSAlarm *alarm, OSContext *context) { alarm->context = context; if (alarm->callback && alarm->state != OSAlarmState::Cancelled) { alarm->callback(alarm, context); } OSWakeupThread(&alarm->threadQueue); if (alarm->period) { alarm->nextFire = OSGetTime() + alarm->period; alarm->state = OSAlarmState::Set; } else { alarm->nextFire = 0; alarm->state = OSAlarmState::None; OSEraseFromQueue(static_cast<OSAlarmQueue*>(alarm->alarmQueue), alarm); } return alarm->nextFire == 0; }
void OSSignalCond(OSCondition *condition) { assert(condition && condition->tag == OSCondition::Tag); OSWakeupThread(&condition->queue); }
/** * Will wake up any threads waiting on the condition with OSWaitCond. * * Similar to <a href="http://en.cppreference.com/w/cpp/thread/condition_variable/notify_all">std::condition_variable::notify_all</a>. */ void OSSignalCond(virt_ptr<OSCondition> condition) { OSWakeupThread(virt_addrof(condition->queue)); }
/** * Will wake up any threads waiting on the condition with OSWaitCond. * * Similar to <a href="http://en.cppreference.com/w/cpp/thread/condition_variable/notify_all">std::condition_variable::notify_all</a>. */ void OSSignalCond(OSCondition *condition) { decaf_check(condition && condition->tag == OSCondition::Tag); OSWakeupThread(&condition->queue); }