Mercurial > hg > apm2s
diff stk/src/Mutex.cpp @ 0:4606bd505630 tip
first import
author | Fiore Martin <f.martin@qmul.ac.uk> |
---|---|
date | Sat, 13 Jun 2015 15:08:10 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/stk/src/Mutex.cpp Sat Jun 13 15:08:10 2015 +0100 @@ -0,0 +1,105 @@ +/***************************************************/ +/*! \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--2014. +*/ +/***************************************************/ +#pragma once + +#include "../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