diff --git a/src/system/kernel/sem.cpp b/src/system/kernel/sem.cpp index 1416c02c22..c6fd0f2844 100644 --- a/src/system/kernel/sem.cpp +++ b/src/system/kernel/sem.cpp @@ -919,7 +919,8 @@ release_sem_etc(sem_id id, int32 count, uint32 flags) flags |= B_RELEASE_IF_WAITING_ONLY; } - bool unblockedAny = false; + struct thread* currentThread = thread_get_current_thread(); + bool reschedule = false; SpinLocker threadLocker(gThreadSpinlock); @@ -948,7 +949,7 @@ release_sem_etc(sem_id id, int32 count, uint32 flags) sSems[slot].u.used.count += delta; sSems[slot].u.used.net_count += delta - entry->count; count -= delta; - unblockedAny = true; + reschedule |= entry->thread->priority > currentThread->priority; } else { // The thread is no longer waiting, but still queued, which // means acquiration failed and we can just remove it. @@ -966,7 +967,7 @@ release_sem_etc(sem_id id, int32 count, uint32 flags) // If we've unblocked another thread reschedule, if we've not explicitly // been told not to. - if (unblockedAny && (flags & B_DO_NOT_RESCHEDULE) == 0) { + if (reschedule && (flags & B_DO_NOT_RESCHEDULE) == 0) { semLocker.Unlock(); threadLocker.Lock(); scheduler_reschedule();