3 * - By John Hodge (thePowersGang)
6 * - Thread level event handling
10 #include <threads_int.h>
14 void Threads_PostEvent(tThread *Thread, Uint32 EventMask)
17 if( !Thread ) return ;
18 if( EventMask == 0 ) return ;
19 // TODO: Check that only one bit is set?
21 ENTER("pThread xEventMask", Thread, EventMask);
23 SHORTLOCK( &Thread->IsLocked );
25 Thread->EventState |= EventMask;
26 LOG("Thread->EventState = 0x%x", Thread->EventState);
28 // Currently sleeping on an event?
29 if( Thread->Status == THREAD_STAT_EVENTSLEEP )
31 // Waiting on this event?
32 if( (Uint32)Thread->RetStatus & EventMask )
35 LOG("Waking thread %p(%i %s)", Thread, Thread->TID, Thread->ThreadName);
36 Threads_AddActive(Thread);
40 SHORTREL( &Thread->IsLocked );
45 * \brief Clear an event without waiting
47 void Threads_ClearEvent(Uint32 EventMask)
49 Proc_GetCurThread()->EventState &= ~EventMask;
53 * \brief Wait for an event to occur
55 Uint32 Threads_WaitEvents(Uint32 EventMask)
58 tThread *us = Proc_GetCurThread();
60 ENTER("xEventMask", EventMask);
69 LOG("us = %p(%i %s)", us, us->TID, us->ThreadName);
71 // Check if a wait is needed
72 SHORTLOCK( &us->IsLocked );
73 while( !(us->EventState & EventMask) )
75 LOG("Locked and preparing for wait");
77 us->RetStatus = EventMask; // HACK: Store EventMask in RetStatus
78 SHORTLOCK( &glThreadListLock );
79 us = Threads_RemActive();
80 us->Status = THREAD_STAT_EVENTSLEEP;
81 // Note stored anywhere because we're woken using other means
82 SHORTREL( &glThreadListLock );
83 SHORTREL( &us->IsLocked );
84 while(us->Status == THREAD_STAT_EVENTSLEEP) Threads_Yield();
85 // Woken when lock is acquired
86 SHORTLOCK( &us->IsLocked );
89 // Get return value and clear changed event bits
90 rv = us->EventState & EventMask;
91 us->EventState &= ~EventMask;
93 SHORTREL( &us->IsLocked );