From fe19cba8f06ac099d9731551380ef372bc96ae9a Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Sun, 17 Feb 2008 14:38:23 +0000 Subject: [PATCH] axeld + bonefish: Before starting to wait on a condition variable check for pending signals first, if the call is interruptable. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@23980 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/system/kernel/condition_variable.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/system/kernel/condition_variable.cpp b/src/system/kernel/condition_variable.cpp index 45593dabe2..a2c1bc898b 100644 --- a/src/system/kernel/condition_variable.cpp +++ b/src/system/kernel/condition_variable.cpp @@ -156,8 +156,16 @@ PrivateConditionVariableEntry::Wait(uint32 flags) entry = entry->fThreadNext; } - // all entries are unnotified -- wait + // When interruptable, check pending signals first struct thread* thread = thread_get_current_thread(); + if (((flags & B_CAN_INTERRUPT) + && (thread->sig_pending & ~thread->sig_block_mask) != 0) + || ((flags & B_KILL_CAN_INTERRUPT) + && (thread->sig_pending & KILL_SIGNALS))) { + return B_INTERRUPTED; + } + + // wait thread->next_state = B_THREAD_WAITING; thread->condition_variable_entry = firstEntry; thread->sem.blocking = -1;