diff --git a/headers/private/kernel/condition_variable.h b/headers/private/kernel/condition_variable.h index 0f13257a12..914cb2cded 100644 --- a/headers/private/kernel/condition_variable.h +++ b/headers/private/kernel/condition_variable.h @@ -63,6 +63,13 @@ public: inline void NotifyAll(bool threadsLocked = false, status_t result = B_OK); + static void NotifyOne(const void* object, + bool threadsLocked = false, + status_t result = B_OK); + static void NotifyAll(const void* object, + bool threadsLocked = false, + status_t result = B_OK); + void Add(ConditionVariableEntry* entry); status_t Wait(uint32 flags = 0, bigtime_t timeout = 0); diff --git a/src/system/kernel/condition_variable.cpp b/src/system/kernel/condition_variable.cpp index d27a41124e..1883dcd76c 100644 --- a/src/system/kernel/condition_variable.cpp +++ b/src/system/kernel/condition_variable.cpp @@ -261,6 +261,34 @@ ConditionVariable::Wait(uint32 flags, bigtime_t timeout) } +void +ConditionVariable::NotifyOne(const void* object, bool threadsLocked, + status_t result) +{ + InterruptsSpinLocker locker(sConditionVariablesLock); + ConditionVariable* variable = sConditionVariableHash.Lookup(object); + locker.Unlock(); + if (variable == NULL) + return; + + variable->NotifyOne(threadsLocked, result); +} + + +void +ConditionVariable::NotifyAll(const void* object, + bool threadsLocked, status_t result) +{ + InterruptsSpinLocker locker(sConditionVariablesLock); + ConditionVariable* variable = sConditionVariableHash.Lookup(object); + locker.Unlock(); + if (variable == NULL) + return; + + variable->NotifyAll(threadsLocked, result); +} + + /*static*/ void ConditionVariable::ListAll() {