فهرست منبع

Check for deadlocks in mutex

Daniele Bartolini 12 سال پیش
والد
کامیت
254856186e
1فایلهای تغییر یافته به همراه13 افزوده شده و 7 حذف شده
  1. 13 7
      engine/os/posix/Mutex.h

+ 13 - 7
engine/os/posix/Mutex.h

@@ -49,6 +49,7 @@ public:
 private:
 
 	pthread_mutex_t		m_mutex;
+	pthread_mutexattr_t m_attr;
 
 private:
 
@@ -63,33 +64,38 @@ private:
 inline Mutex::Mutex()
 {
 	memset(&m_mutex, 0, sizeof(pthread_mutex_t));
+	int result;
 
-	int32_t result = pthread_mutex_init(&m_mutex, NULL);
-
+	result = pthread_mutexattr_init(&m_attr);
+	CE_ASSERT(result == 0, "Failed to init mutex attr. errno: %d", result);
+	result = pthread_mutexattr_settype(&m_attr, PTHREAD_MUTEX_ERRORCHECK);
+	CE_ASSERT(result == 0, "Failed to set mutex type. errno: %d", result);
+	result = pthread_mutex_init(&m_mutex, &m_attr);
 	CE_ASSERT(result == 0, "Failed to init mutex. errno: %d", result);
 }
 
 //-----------------------------------------------------------------------------
 inline Mutex::~Mutex()
 {
-	int32_t result = pthread_mutex_destroy(&m_mutex);
+	int result;
 
+	result = pthread_mutex_destroy(&m_mutex);
 	CE_ASSERT(result == 0, "Failed to destroy mutex. errno: %d", result);
+	result = pthread_mutexattr_destroy(&m_attr);
+	CE_ASSERT(result == 0, "Failed to destroy mutex attr. errno: %d", result);
 }
 
 //-----------------------------------------------------------------------------
 inline void Mutex::lock()
 {
-	int32_t result = pthread_mutex_lock(&m_mutex);
-
+	int result = pthread_mutex_lock(&m_mutex);
 	CE_ASSERT(result == 0, "Failed to acquire lock. errno: %d", result);
 }
 
 //-----------------------------------------------------------------------------
 inline void Mutex::unlock()
 {
-	int32_t result = pthread_mutex_unlock(&m_mutex);
-
+	int result = pthread_mutex_unlock(&m_mutex);
 	CE_ASSERT(result == 0, "Failed to release lock. errno: %d", result);
 }