diff options
author | chai <chaifix@163.com> | 2019-03-30 11:59:35 +0800 |
---|---|---|
committer | chai <chaifix@163.com> | 2019-03-30 11:59:35 +0800 |
commit | c270d033fa04873ee7a8925dbb00cae5edc4555c (patch) | |
tree | ee27a45c5b946b08dd7a726a925028f6ca3eabf1 /source/modules/asura-utils/threading/conditional.cpp | |
parent | 771df5c31cd5653467fd6e76c1a3e002ca39582c (diff) |
*misc
Diffstat (limited to 'source/modules/asura-utils/threading/conditional.cpp')
-rw-r--r-- | source/modules/asura-utils/threading/conditional.cpp | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/source/modules/asura-utils/threading/conditional.cpp b/source/modules/asura-utils/threading/conditional.cpp new file mode 100644 index 0000000..eb26e82 --- /dev/null +++ b/source/modules/asura-utils/threading/conditional.cpp @@ -0,0 +1,86 @@ +#include "conditional.h" + +namespace AsuraEngine +{ + namespace Threading + { + + Conditional::Conditional() + : mWaiting(0) + , mSignals(0) + { + } + + Conditional::~Conditional() + { + } + + void Conditional::Signal() + { + mMutex.Lock(); + if (mWaiting > mSignals) + { + ++mSignals; + signal(mWaitSem); + mMutex.Unlock(); + wait(mDoneSem); + } + else + { + mMutex.Unlock(); + } + } + + void Conditional::Broadcast() + { + mMutex.Lock(); + if (mWaiting> mSignals) { + int i, num_waiting; + + num_waiting = (mWaiting - mSignals); + mSignals = mWaiting; + for (i = 0; i < num_waiting; ++i) { + signal(mWaitSem); + } + mMutex.Unlock(); + for (i = 0; i < num_waiting; ++i) { + wait(mDoneSem); + } + } + else { + mMutex.Unlock(); + } + + } + + bool Conditional::Wait(Mutex* mutex, int timeout /*= ASURA_MUTEX_MAXWAIT*/) + { + bool retval; + + mMutex.Lock(); + ++mWaiting; + mMutex.Unlock(); + + mutex->Unlock(); + + retval = wait(mWaitSem, timeout); + + mMutex.Lock(); + if (mSignals > 0) { + if (!retval) { + wait(mWaitSem); + } + signal(mDoneSem); + + --mSignals; + } + --mWaiting; + mMutex.Unlock(); + + mMutex.Lock(); + + return retval; + } + + } +}
\ No newline at end of file |