Example #1
0
void
VsyncAlarmHandler(OSAlarm *alarm, OSContext *context)
{
   gLastVsync = OSGetSystemTime();
   OSWakeupThread(gVsyncThreadQueue);
   auto callback = gEventCallbacks[GX2EventCallback::Vsync];

   if (callback.func) {
      callback.func(GX2EventCallback::Vsync, callback.data);
   }
}
Example #2
0
/**
 * 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;
}
Example #3
0
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;
}
Example #4
0
void
OSSignalCond(OSCondition *condition)
{
   assert(condition && condition->tag == OSCondition::Tag);
   OSWakeupThread(&condition->queue);
}
Example #5
0
/**
 * 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));
}
Example #6
0
/**
 * 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);
}