LOG("Thread->EventState = 0x%x", Thread->EventState);
// Currently sleeping on an event?
- if( Thread->Status == THREAD_STAT_EVENTSLEEP )
+ switch(Thread->Status)
{
- // Waiting on this event?
+ // Waiting on this event?
+ case THREAD_STAT_EVENTSLEEP:
if( (Uint32)Thread->RetStatus & EventMask )
{
// Wake up
LOG("Waking thread %p(%i %s)", Thread, Thread->TID, Thread->ThreadName);
Threads_AddActive(Thread);
}
+ break;
+ case THREAD_STAT_SEMAPHORESLEEP:
+ if( EventMask & THREAD_EVENT_TIMER )
+ {
+ LOG("Waking %p(%i %s) from semaphore on timer",
+ Thread, Thread->TID, Thread->ThreadName);
+ Semaphore_ForceWake(Thread);
+ }
+ break;
}
SHORTREL( &Thread->IsLocked );
LEAVE('-');
}
+/**
+ * \brief Clear an event without waiting
+ */
+void Threads_ClearEvent(Uint32 EventMask)
+{
+ Proc_GetCurThread()->EventState &= ~EventMask;
+}
+
/**
* \brief Wait for an event to occur
*/
// Note stored anywhere because we're woken using other means
SHORTREL( &glThreadListLock );
SHORTREL( &us->IsLocked );
- while(us->Status == THREAD_STAT_EVENTSLEEP) Threads_Yield();
+ Threads_int_WaitForStatusEnd(THREAD_STAT_EVENTSLEEP);
// Woken when lock is acquired
SHORTLOCK( &us->IsLocked );
}