1*47d53e4dSSergey Makeev #pragma once 2*47d53e4dSSergey Makeev 3*47d53e4dSSergey Makeev #include <pthread.h> 4*47d53e4dSSergey Makeev 5*47d53e4dSSergey Makeev 6*47d53e4dSSergey Makeev namespace MT 7*47d53e4dSSergey Makeev { 8*47d53e4dSSergey Makeev class ScopedGuard; 9*47d53e4dSSergey Makeev 10*47d53e4dSSergey Makeev // 11*47d53e4dSSergey Makeev // 12*47d53e4dSSergey Makeev // 13*47d53e4dSSergey Makeev class Mutex 14*47d53e4dSSergey Makeev { 15*47d53e4dSSergey Makeev pthread_mutexattr_t mutexAttr; 16*47d53e4dSSergey Makeev pthread_mutex_t mutex; 17*47d53e4dSSergey Makeev 18*47d53e4dSSergey Makeev private: 19*47d53e4dSSergey Makeev 20*47d53e4dSSergey Makeev Mutex(const Mutex &) {} 21*47d53e4dSSergey Makeev void operator=(const Mutex &) {} 22*47d53e4dSSergey Makeev 23*47d53e4dSSergey Makeev public: 24*47d53e4dSSergey Makeev 25*47d53e4dSSergey Makeev Mutex() 26*47d53e4dSSergey Makeev { 27*47d53e4dSSergey Makeev int res = pthread_mutexattr_init(&mutexAttr); 28*47d53e4dSSergey Makeev ASSERT(res == 0, "pthread_mutexattr_init - failed"); 29*47d53e4dSSergey Makeev 30*47d53e4dSSergey Makeev res = pthread_mutexattr_settype(&mutexAttr, PTHREAD_MUTEX_RECURSIVE); 31*47d53e4dSSergey Makeev ASSERT(res == 0, "pthread_mutexattr_settype - failed"); 32*47d53e4dSSergey Makeev 33*47d53e4dSSergey Makeev res = pthread_mutex_init(&mutex, &mutexAttr); 34*47d53e4dSSergey Makeev ASSERT(res == 0, "pthread_mutex_init - failed"); 35*47d53e4dSSergey Makeev } 36*47d53e4dSSergey Makeev 37*47d53e4dSSergey Makeev ~Mutex() 38*47d53e4dSSergey Makeev { 39*47d53e4dSSergey Makeev int res = pthread_mutex_destroy(&mutex); 40*47d53e4dSSergey Makeev ASSERT(res == 0, "pthread_mutex_destroy - failed"); 41*47d53e4dSSergey Makeev 42*47d53e4dSSergey Makeev res = pthread_mutexattr_destroy(&mutexAttr); 43*47d53e4dSSergey Makeev ASSERT(res == 0, "pthread_mutexattr_destroy - failed"); 44*47d53e4dSSergey Makeev } 45*47d53e4dSSergey Makeev 46*47d53e4dSSergey Makeev friend class MT::ScopedGuard; 47*47d53e4dSSergey Makeev 48*47d53e4dSSergey Makeev private: 49*47d53e4dSSergey Makeev 50*47d53e4dSSergey Makeev void Lock() 51*47d53e4dSSergey Makeev { 52*47d53e4dSSergey Makeev int res = pthread_mutex_lock(&mutex); 53*47d53e4dSSergey Makeev ASSERT(res == 0, "pthread_mutex_lock - failed"); 54*47d53e4dSSergey Makeev } 55*47d53e4dSSergey Makeev void Unlock() 56*47d53e4dSSergey Makeev { 57*47d53e4dSSergey Makeev int res = pthread_mutex_unlock(&mutex); 58*47d53e4dSSergey Makeev ASSERT(res == 0, "pthread_mutex_unlock - failed"); 59*47d53e4dSSergey Makeev } 60*47d53e4dSSergey Makeev 61*47d53e4dSSergey Makeev }; 62*47d53e4dSSergey Makeev 63*47d53e4dSSergey Makeev 64*47d53e4dSSergey Makeev } 65*47d53e4dSSergey Makeev 66*47d53e4dSSergey Makeev 67