// Configuration
#define DEBUG_TRACE_TICKETS 0 // Trace ticket counts
#define DEBUG_TRACE_STATE 0 // Trace state changes (sleep/wake)
-#define SEMAPHORE_DEBUG 0
+#define SEMAPHORE_DEBUG 0 // Debug semaphores
// --- Schedulers ---
#define SCHED_UNDEF 0
}
break;
- // Brains!... You cannot kill
+ // Brains!... You cannot kill something that is already dead
case THREAD_STAT_ZOMBIE:
Log_Warning("Threads", "Threads_Kill - Thread %p(%i,%s) is undead, you cannot kill it",
Thread, Thread->TID, Thread->ThreadName);
// Save exit status
Thread->RetStatus = Status;
-
+
+ SHORTREL( &Thread->IsLocked );
+
// Don't Zombie if we are being killed because our parent is
if(Status == -1)
{
Thread->Status = THREAD_STAT_DEAD;
Threads_AddToDelete( Thread );
+ SHORTREL( &glThreadListLock );
} else {
Thread->Status = THREAD_STAT_ZOMBIE;
+ SHORTREL( &glThreadListLock );
// Wake parent
Threads_Wake( Thread->Parent );
}
Log("Thread %i went *hurk* (%i)", Thread->TID, Status);
- // Release spinlocks
- SHORTREL( &glThreadListLock );
- SHORTREL( &Thread->IsLocked ); // TODO: We may not actually be released...
-
// And, reschedule
if(isCurThread)
{
/**
- * \fn int Threads_Wake( tThread *Thread )
* \brief Wakes a sleeping/waiting thread up
* \param Thread Thread to wake
* \return Boolean Failure (Returns ERRNO)
// Remove from sleeping queue
Threads_int_DelFromQueue(&gSleepingThreads, Thread);
+ SHORTREL( &glThreadListLock );
Threads_AddActive( Thread );
#if DEBUG_TRACE_STATE
Log("Threads_Sleep: %p (%i %s) woken", Thread, Thread->TID, Thread->ThreadName);
#endif
- SHORTREL( &glThreadListLock );
return -EOK;
case THREAD_STAT_SEMAPHORESLEEP: {
sem->LastSignaling = prev;
}
- SHORTLOCK( &glThreadListLock );
+ Thread->RetStatus = 0; // It didn't get anything
Threads_AddActive( Thread );
- SHORTREL( &glThreadListLock );
#if DEBUG_TRACE_STATE
Log("Threads_Sleep: %p(%i %s) woken from semaphore", Thread, Thread->TID, Thread->ThreadName);
#endif
SHORTREL( &Sem->Protector ); // Release first to make sure it is released
- SHORTREL( &glThreadListLock );
- while(us->Status == THREAD_STAT_SEMAPHORESLEEP) Threads_Yield();
+ SHORTREL( &glThreadListLock );
+ 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);
+ }
+ #if DEBUG_TRACE_STATE || SEMAPHORE_DEBUG
+ Log("Semaphore %p %s:%s woken", Sem, Sem->ModName, Sem->Name);
+ #endif
// We're only woken when there's something avaliable (or a signal arrives)
us->WaitPointer = NULL;
}
SHORTREL( &Sem->Protector );
+ #if DEBUG_TRACE_STATE || SEMAPHORE_DEBUG
+ Log("Semaphore %p %s:%s took %i by wait",
+ Sem, Sem->ModName, Sem->Name, taken);
+ #endif
+
return taken;
}
#endif
// Wake the sleeper
- SHORTLOCK( &glThreadListLock );
+// SHORTLOCK( &glThreadListLock );
if( toWake->Status != THREAD_STAT_ACTIVE )
Threads_AddActive(toWake);
else
Warning("Thread %p (%i %s) is already awake", toWake, toWake->TID, toWake->ThreadName);
- SHORTREL( &glThreadListLock );
+// SHORTREL( &glThreadListLock );
}
SHORTREL( &Sem->Protector );