X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;ds=sidebyside;f=KernelLand%2FKernel%2Fsemaphore.c;h=1111967a46ae4ecc22676fbee7de50aeaa505a0f;hb=950126c76c539e76574f6349b833f41c70ed6573;hp=ce7d4ba05f4ef40f37583a47ec5c310658c39fe1;hpb=7ba570fe3cc5418f42decf5b72ac2295cce9e60f;p=tpg%2Facess2.git diff --git a/KernelLand/Kernel/semaphore.c b/KernelLand/Kernel/semaphore.c index ce7d4ba0..1111967a 100644 --- a/KernelLand/Kernel/semaphore.c +++ b/KernelLand/Kernel/semaphore.c @@ -79,17 +79,11 @@ int Semaphore_Wait(tSemaphore *Sem, int MaxToTake) SHORTREL( &Sem->Protector ); // Release first to make sure it is released SHORTREL( &glThreadListLock ); // Sleep until woken (either by getting what we need, or a timer event) - while( us->Status == THREAD_STAT_SEMAPHORESLEEP ) - { - Threads_Yield(); - if(us->Status == THREAD_STAT_SEMAPHORESLEEP) - Log_Warning("Threads", "Semaphore %p %s:%s re-schedulued while asleep", - Sem, Sem->ModName, Sem->Name); - } + Threads_int_WaitForStatusEnd( THREAD_STAT_SEMAPHORESLEEP ); + // We're only woken when there's something avaliable (or a signal arrives) #if DEBUG_TRACE_STATE || SEMAPHORE_DEBUG - Log("Semaphore %p %s:%s woken", Sem, Sem->ModName, Sem->Name); + Log("Semaphore %p %s:%s woken from wait", Sem, Sem->ModName, Sem->Name); #endif - // We're only woken when there's something avaliable (or a signal arrives) us->WaitPointer = NULL; taken = us->RetStatus; @@ -191,7 +185,7 @@ int Semaphore_Signal(tSemaphore *Sem, int AmmountToAdd) SHORTREL( &glThreadListLock ); SHORTREL( &Sem->Protector ); - while(us->Status == THREAD_STAT_SEMAPHORESLEEP) Threads_Yield(); + Threads_int_WaitForStatusEnd(THREAD_STAT_SEMAPHORESLEEP); // We're only woken when there's something avaliable us->WaitPointer = NULL;