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 Wait for an event to occur
47 Uint32 Threads_WaitEvents(Uint32 EventMask)
50 tThread *us = Proc_GetCurThread();
52 ENTER("xEventMask", EventMask);
61 LOG("us = %p(%i %s)", us, us->TID, us->ThreadName);
63 // Check if a wait is needed
64 SHORTLOCK( &us->IsLocked );
65 while( !(us->EventState & EventMask) )
67 LOG("Locked and preparing for wait");
69 us->RetStatus = EventMask; // HACK: Store EventMask in RetStatus
70 SHORTLOCK( &glThreadListLock );
71 us = Threads_RemActive();
72 us->Status = THREAD_STAT_EVENTSLEEP;
73 // Note stored anywhere because we're woken using other means
74 SHORTREL( &glThreadListLock );
75 SHORTREL( &us->IsLocked );
76 while(us->Status == THREAD_STAT_EVENTSLEEP) Threads_Yield();
77 // Woken when lock is acquired
78 SHORTLOCK( &us->IsLocked );
81 // Get return value and clear changed event bits
82 rv = us->EventState & EventMask;
83 us->EventState &= ~EventMask;
85 SHORTREL( &us->IsLocked );