|
- /***************************************************/
- /*! \class Mutex
- \brief STK mutex class.
-
- This class provides a uniform interface for
- cross-platform mutex use. On Linux and IRIX
- systems, the pthread library is used. Under
- Windows, critical sections are used.
-
- by Perry R. Cook and Gary P. Scavone, 1995--2017.
- */
- /***************************************************/
-
- #include "Mutex.h"
-
- namespace stk {
-
- Mutex :: Mutex()
- {
-
- #if (defined(__OS_IRIX__) || defined(__OS_LINUX__) || defined(__OS_MACOSX__))
-
- pthread_mutex_init(&mutex_, NULL);
- pthread_cond_init(&condition_, NULL);
-
- #elif defined(__OS_WINDOWS__)
-
- InitializeCriticalSection(&mutex_);
- condition_ = CreateEvent(NULL, // no security
- true, // manual-reset
- false, // non-signaled initially
- NULL); // unnamed
-
- #endif
- }
-
- Mutex :: ~Mutex()
- {
- #if (defined(__OS_IRIX__) || defined(__OS_LINUX__) || defined(__OS_MACOSX__))
-
- pthread_mutex_destroy(&mutex_);
- pthread_cond_destroy(&condition_);
-
- #elif defined(__OS_WINDOWS__)
-
- DeleteCriticalSection(&mutex_);
- CloseHandle( condition_ );
-
- #endif
- }
-
- void Mutex :: lock()
- {
- #if (defined(__OS_IRIX__) || defined(__OS_LINUX__) || defined(__OS_MACOSX__))
-
- pthread_mutex_lock(&mutex_);
-
- #elif defined(__OS_WINDOWS__)
-
- EnterCriticalSection(&mutex_);
-
- #endif
- }
-
- void Mutex :: unlock()
- {
- #if (defined(__OS_IRIX__) || defined(__OS_LINUX__) || defined(__OS_MACOSX__))
-
- pthread_mutex_unlock(&mutex_);
-
- #elif defined(__OS_WINDOWS__)
-
- LeaveCriticalSection(&mutex_);
-
- #endif
- }
-
- void Mutex :: wait()
- {
- #if (defined(__OS_IRIX__) || defined(__OS_LINUX__) || defined(__OS_MACOSX__))
-
- pthread_cond_wait(&condition_, &mutex_);
-
- #elif defined(__OS_WINDOWS__)
-
- WaitForMultipleObjects(1, &condition_, false, INFINITE);
-
- #endif
- }
-
- void Mutex :: signal()
- {
- #if (defined(__OS_IRIX__) || defined(__OS_LINUX__) || defined(__OS_MACOSX__))
-
- pthread_cond_signal(&condition_);
-
- #elif defined(__OS_WINDOWS__)
-
- SetEvent( condition_ );
-
- #endif
- }
-
- } // stk namespace
|