diff --git a/src/system/kernel/thread.cpp b/src/system/kernel/thread.cpp index 1035dd3a1e..4e1cb2195e 100644 --- a/src/system/kernel/thread.cpp +++ b/src/system/kernel/thread.cpp @@ -540,21 +540,21 @@ undertaker(void* /*args*/) { while (true) { // wait for a thread to bury - ConditionVariableEntry conditionEntry; - InterruptsSpinLocker locker(thread_spinlock); - sUndertakerCondition.Add(&conditionEntry); - locker.Unlock(); - conditionEntry.Wait(); + while (sUndertakerEntries.IsEmpty()) { + ConditionVariableEntry conditionEntry; + sUndertakerCondition.Add(&conditionEntry); + locker.Unlock(); + + conditionEntry.Wait(); + + locker.Lock(); + } - locker.Lock(); UndertakerEntry* _entry = sUndertakerEntries.RemoveHead(); locker.Unlock(); - if (_entry == NULL) - continue; - UndertakerEntry entry = *_entry; // we need a copy, since the original entry is on the thread's stack