X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=KernelLand%2FKernel%2Fsemaphore.c;h=e8175741d07089b77c4418f08e37067f4882961a;hb=301dc9a238658b902d9d394b6e930d1ec4832190;hp=24174735cf0837beefa66780fea95732203101ff;hpb=6b29d7427e7d1ad73f0a0d0ae771bd25da7b7f1a;p=tpg%2Facess2.git diff --git a/KernelLand/Kernel/semaphore.c b/KernelLand/Kernel/semaphore.c index 24174735..e8175741 100644 --- a/KernelLand/Kernel/semaphore.c +++ b/KernelLand/Kernel/semaphore.c @@ -50,6 +50,11 @@ int Semaphore_Wait(tSemaphore *Sem, int MaxToTake) } else { + #if 0 + Threads_int_Sleep(THREAD_STAT_SEMAPHORESLEEP, + Sem, MaxToTake, + &Sem->Waiting, &Sem->LastWaiting, &Sem->Protector); + #endif SHORTLOCK( &glThreadListLock ); // - Remove from active list @@ -75,14 +80,14 @@ int Semaphore_Wait(tSemaphore *Sem, int MaxToTake) us, us->TID, us->ThreadName, Sem, Sem->ModName, Sem->Name); #endif - - SHORTREL( &Sem->Protector ); // Release first to make sure it is released + SHORTREL( &Sem->Protector ); SHORTREL( &glThreadListLock ); + // NOTE: This can break in SMP // Sleep until woken (either by getting what we need, or a timer event) 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 us->WaitPointer = NULL;