X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=KernelLand%2FKernel%2Fevents.c;h=84a1b0a5f3c9a859b70939806744f8e28d0605b7;hb=9a368aa87e119ec5475af456e8dc88d810b93f99;hp=da095e9e4b62db2f0a6baca06ffa84d61a44c48b;hpb=cfe6a9f2a126cc26ac74d5454e8378bd1193fcf8;p=tpg%2Facess2.git diff --git a/KernelLand/Kernel/events.c b/KernelLand/Kernel/events.c index da095e9e..84a1b0a5 100644 --- a/KernelLand/Kernel/events.c +++ b/KernelLand/Kernel/events.c @@ -26,15 +26,25 @@ void Threads_PostEvent(tThread *Thread, Uint32 EventMask) 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 ); @@ -81,7 +91,7 @@ Uint32 Threads_WaitEvents(Uint32 EventMask) // 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 ); }