diff --git a/headers/private/kernel/condition_variable.h b/headers/private/kernel/condition_variable.h index c05b1e2242..938a00adc6 100644 --- a/headers/private/kernel/condition_variable.h +++ b/headers/private/kernel/condition_variable.h @@ -63,9 +63,6 @@ public: static void NotifyOne(const void* object, status_t result); static void NotifyAll(const void* object, status_t result); - // (both methods) caller must ensure that - // the variable is not unpublished - // concurrently void Add(ConditionVariableEntry* entry); @@ -81,6 +78,7 @@ public: void Dump() const; private: + static void _Notify(const void* object, bool all, status_t result); void _Notify(bool all, status_t result); void _NotifyLocked(bool all, status_t result); diff --git a/src/system/kernel/condition_variable.cpp b/src/system/kernel/condition_variable.cpp index 5f06535b7c..69e53fbe11 100644 --- a/src/system/kernel/condition_variable.cpp +++ b/src/system/kernel/condition_variable.cpp @@ -362,26 +362,29 @@ ConditionVariable::Wait(recursive_lock* lock, uint32 flags, bigtime_t timeout) /*static*/ void ConditionVariable::NotifyOne(const void* object, status_t result) { - InterruptsReadSpinLocker locker(sConditionVariableHashLock); - ConditionVariable* variable = sConditionVariableHash.Lookup(object); - locker.Unlock(); - if (variable == NULL) - return; - - variable->NotifyOne(result); + _Notify(object, false, result); } /*static*/ void ConditionVariable::NotifyAll(const void* object, status_t result) { - InterruptsReadSpinLocker locker(sConditionVariableHashLock); + _Notify(object, true, result); +} + + +/*static*/ void +ConditionVariable::_Notify(const void* object, bool all, status_t result) +{ + InterruptsLocker ints; + ReadSpinLocker hashLocker(sConditionVariableHashLock); ConditionVariable* variable = sConditionVariableHash.Lookup(object); - locker.Unlock(); if (variable == NULL) return; + SpinLocker variableLocker(variable->fLock); + hashLocker.Unlock(); - variable->NotifyAll(result); + variable->_NotifyLocked(all, result); }