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 // TODO: Does it matter if the thread is locked here?
36 LOG("Waking thread %p(%i %s)", Thread, Thread->TID, Thread->ThreadName);
37 Threads_AddActive(Thread);
41 SHORTREL( &Thread->IsLocked );
46 * \brief Wait for an event to occur
48 Uint32 Threads_WaitEvents(Uint32 EventMask)
51 tThread *us = Proc_GetCurThread();
53 ENTER("xEventMask", EventMask);
62 LOG("us = %p(%i %s)", us, us->TID, us->ThreadName);
64 // Check if a wait is needed
65 SHORTLOCK( &us->IsLocked );
66 while( !(us->EventState & EventMask) )
68 LOG("Locked and preparing for wait");
70 us->RetStatus = EventMask; // HACK: Store EventMask in RetStatus
71 SHORTLOCK( &glThreadListLock );
72 us = Threads_RemActive();
73 us->Status = THREAD_STAT_EVENTSLEEP;
74 // Note stored anywhere because we're woken using other means
75 SHORTREL( &glThreadListLock );
76 SHORTREL( &us->IsLocked );
77 while(us->Status == THREAD_STAT_EVENTSLEEP) Threads_Yield();
78 // Woken when lock is acquired
79 SHORTLOCK( &us->IsLocked );
82 // Get return value and clear changed event bits
83 rv = us->EventState & EventMask;
84 us->EventState &= ~EventMask;
86 SHORTREL( &us->IsLocked );