Merge pull request #16 from finson/65894f58514a9ab61ae20e45cfde06c9d45600e4
[deb_libcec.git] / src / lib / platform / threads.cpp
index 8ba391920feb2695326b52ca6e7467f033771dd1..d168e906a671ddc8e0caab582c9ae30a58bd2853 100644 (file)
@@ -35,9 +35,9 @@
 
 using namespace CEC;
 
-CMutex::CMutex(void)
+CMutex::CMutex(bool bRecursive /* = true */)
 {
-  pthread_mutex_init(&m_mutex, NULL);
+  pthread_mutex_init(&m_mutex, bRecursive ? GetMutexAttribute() : NULL);
 }
 
 CMutex::~CMutex(void)
@@ -60,6 +60,19 @@ void CMutex::Unlock(void)
   pthread_mutex_unlock(&m_mutex);
 }
 
+static pthread_mutexattr_t g_mutexAttr;
+pthread_mutexattr_t *CMutex::GetMutexAttribute()
+{
+  static bool bAttributeInitialised = false;
+  if (!bAttributeInitialised)
+  {
+    pthread_mutexattr_init(&g_mutexAttr);
+    pthread_mutexattr_settype(&g_mutexAttr, PTHREAD_MUTEX_RECURSIVE);
+    bAttributeInitialised = true;
+  }
+  return &g_mutexAttr;
+}
+
 CLockObject::CLockObject(CMutex *mutex, bool bTryLock /* = false */) :
   m_mutex(mutex)
 {