diff options
Diffstat (limited to 'source/modules/asura-utils/threading/conditional.cpp')
-rw-r--r-- | source/modules/asura-utils/threading/conditional.cpp | 136 |
1 files changed, 67 insertions, 69 deletions
diff --git a/source/modules/asura-utils/threading/conditional.cpp b/source/modules/asura-utils/threading/conditional.cpp index e49bfde..c4d32d9 100644 --- a/source/modules/asura-utils/threading/conditional.cpp +++ b/source/modules/asura-utils/threading/conditional.cpp @@ -1,86 +1,84 @@ #include "conditional.h" -namespace AsuraEngine +namespace_begin(AsuraEngine) +namespace_begin(Threading) + +Conditional::Conditional() + : m_Waiting(0) + , m_Signals(0) { - namespace Threading - { +} - Conditional::Conditional() - : m_Waiting(0) - , m_Signals(0) - { - } +Conditional::~Conditional() +{ +} - Conditional::~Conditional() - { - } +void Conditional::Signal() +{ + m_Mutex.Lock(); + if (m_Waiting > m_Signals) + { + ++m_Signals; + signal(m_WaitSem); + m_Mutex.Unlock(); + wait(m_DoneSem); + } + else + { + m_Mutex.Unlock(); + } +} - void Conditional::Signal() - { - m_Mutex.Lock(); - if (m_Waiting > m_Signals) - { - ++m_Signals; - signal(m_WaitSem); - m_Mutex.Unlock(); - wait(m_DoneSem); - } - else - { - m_Mutex.Unlock(); - } +void Conditional::Broadcast() +{ + m_Mutex.Lock(); + if (m_Waiting> m_Signals) { + int i, num_waiting; + + num_waiting = (m_Waiting - m_Signals); + m_Signals = m_Waiting; + for (i = 0; i < num_waiting; ++i) { + signal(m_WaitSem); } - - void Conditional::Broadcast() - { - m_Mutex.Lock(); - if (m_Waiting> m_Signals) { - int i, num_waiting; - - num_waiting = (m_Waiting - m_Signals); - m_Signals = m_Waiting; - for (i = 0; i < num_waiting; ++i) { - signal(m_WaitSem); - } - m_Mutex.Unlock(); - for (i = 0; i < num_waiting; ++i) { - wait(m_DoneSem); - } - } - else { - m_Mutex.Unlock(); - } - + m_Mutex.Unlock(); + for (i = 0; i < num_waiting; ++i) { + wait(m_DoneSem); } + } + else { + m_Mutex.Unlock(); + } - bool Conditional::Wait(Mutex* mutex, int timeout /*= ASURA_MUTEX_MAXWAIT*/) - { - bool retval; - - m_Mutex.Lock(); - ++m_Waiting; - m_Mutex.Unlock(); - - mutex->Unlock(); +} - retval = wait(m_WaitSem, timeout); +bool Conditional::Wait(Mutex* mutex, int timeout /*= ASURA_MUTEX_MAXWAIT*/) +{ + bool retval; - m_Mutex.Lock(); - if (m_Signals > 0) { - if (!retval) { - wait(m_WaitSem); - } - signal(m_DoneSem); + m_Mutex.Lock(); + ++m_Waiting; + m_Mutex.Unlock(); - --m_Signals; - } - --m_Waiting; - m_Mutex.Unlock(); + mutex->Unlock(); - m_Mutex.Lock(); + retval = wait(m_WaitSem, timeout); - return retval; + m_Mutex.Lock(); + if (m_Signals > 0) { + if (!retval) { + wait(m_WaitSem); } + signal(m_DoneSem); + --m_Signals; } -}
\ No newline at end of file + --m_Waiting; + m_Mutex.Unlock(); + + m_Mutex.Lock(); + + return retval; +} + +namespace_end +namespace_end
\ No newline at end of file |