00001 #include <map>
00002 #include <stdio.h>
00003 #include <stdlib.h>
00004 #include <string.h>
00005 #include <pthread.h>
00006 #include "mutex.h"
00007 #include "thread_obj.h"
00008 #include "tools/assert.h"
00009
00010 void Mutex::Init(MutexType _type)
00011 {
00012 mutex = (pthread_mutex_t*) calloc(sizeof(pthread_mutex_t), 1);
00013 type = _type;
00014
00015 pthread_mutexattr_t attr;
00016 pthread_mutexattr_init(&attr);
00017
00018 switch(type)
00019 {
00020 case NORMAL_MUTEX:
00021 #ifdef DEBUG
00022 pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_ERRORCHECK);
00023 #else
00024 pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_NORMAL);
00025 #endif
00026 break;
00027 case RECURSIVE_MUTEX:
00028 pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
00029 break;
00030 default:
00031 ASSERT(false);
00032 }
00033
00034 int r = pthread_mutex_init(mutex, &attr );
00035 ASSERT(r == 0);
00036
00037 pthread_mutexattr_destroy(&attr);
00038 }
00039
00040 Mutex::Mutex(MutexType type)
00041 {
00042 Init(type);
00043 }
00044
00045 Mutex::Mutex(const Mutex& m)
00046 {
00047 Init(m.type);
00048 }
00049
00050 Mutex::~Mutex()
00051 {
00052 int r = pthread_mutex_destroy(mutex);
00053 if(r != 0)
00054 log(LogError, "Failed to destroy mutex %p : %s", mutex, strerror(r));
00055 free(mutex);
00056 }
00057
00058 void Mutex::Lock()
00059 {
00060 int res = pthread_mutex_lock(mutex);
00061 if(res != 0)
00062 log(LogError, "Locking %p failed: %s\n", mutex, strerror(res));
00063 }
00064
00065 bool Mutex::TryLock()
00066 {
00067 return pthread_mutex_trylock(mutex) == 0;
00068 }
00069
00070 void Mutex::Unlock()
00071 {
00072 pthread_mutex_unlock(mutex);
00073 }