summaryrefslogtreecommitdiff
path: root/source/modules/asura-utils/threading/conditional.cpp
diff options
context:
space:
mode:
authorchai <chaifix@163.com>2019-03-30 11:59:35 +0800
committerchai <chaifix@163.com>2019-03-30 11:59:35 +0800
commitc270d033fa04873ee7a8925dbb00cae5edc4555c (patch)
treeee27a45c5b946b08dd7a726a925028f6ca3eabf1 /source/modules/asura-utils/threading/conditional.cpp
parent771df5c31cd5653467fd6e76c1a3e002ca39582c (diff)
*misc
Diffstat (limited to 'source/modules/asura-utils/threading/conditional.cpp')
-rw-r--r--source/modules/asura-utils/threading/conditional.cpp86
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