00001 #ifndef MUTEX_H
00002 #define MUTEX_H
00003 #include <pthread.h>
00004
00007
00008
00009 #ifdef DEBUG_MUTEX
00010 #define MUTEX_LOCK(m) \
00011 printf("%s:%i Locking %s %p (by %lu)\n", __FILE__, __LINE__, #m, m.mutex, pthread_self()); \
00012 (m).Lock(); \
00013 printf("%s:%i Locking Done %s %p (by %lu)\n", __FILE__, __LINE__, #m, m.mutex, pthread_self());
00014 #else
00015 #define MUTEX_LOCK(m) m.Lock();
00016 #endif
00017
00018 #ifdef DEBUG_MUTEX
00019 #define MUTEX_UNLOCK(m) \
00020 printf("%s:%i Unlocking %s %p (by %lu)\n", __FILE__, __LINE__, #m, m.mutex, pthread_self()); \
00021 (m).Unlock(); \
00022 printf("%s:%i Unlocking Done %s %p (by %lu)\n", __FILE__, __LINE__, #m, m.mutex, pthread_self());
00023 #else
00024 #define MUTEX_UNLOCK(m) (m).Unlock();
00025 #endif
00026
00028 enum MutexType
00029 {
00033 NORMAL_MUTEX,
00035 RECURSIVE_MUTEX
00036 };
00037
00039 class Mutex
00040 {
00041 private:
00042 #ifndef DEBUG_MUTEX
00043 pthread_mutex_t* mutex;
00044 #endif
00045 MutexType type;
00046
00047 void Init(enum MutexType _type = NORMAL_MUTEX);
00048 public:
00049 #ifdef DEBUG_MUTEX
00050 pthread_mutex_t* mutex;
00051 #endif
00052
00053 Mutex(enum MutexType _type = NORMAL_MUTEX);
00054 Mutex(const Mutex &m);
00055 ~Mutex();
00056
00058 void Lock();
00060 void Unlock();
00064 bool TryLock();
00065 };
00066
00067 #endif