From d19194bc8ae78acce9d9e7b39763ca1a00f67ab7 Mon Sep 17 00:00:00 2001 From: hfriederich Date: Sat, 8 Sep 2007 08:40:58 +0000 Subject: [PATCH] Make PTRACE pthread_mutex recursive to avoid deadlocks --- src/ptlib/common/osutils.cxx | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/src/ptlib/common/osutils.cxx b/src/ptlib/common/osutils.cxx index a18b869a..acda70dd 100644 --- a/src/ptlib/common/osutils.cxx +++ b/src/ptlib/common/osutils.cxx @@ -27,6 +27,9 @@ * Contributor(s): ______________________________________. * * $Log$ + * Revision 1.256 2007/09/08 08:40:58 hfriederich + * Make PTRACE pthread_mutex recursive to avoid deadlocks + * * Revision 1.255 2007/09/06 00:01:19 rjongbloed * Fixed recursion problem in initialising PTRACE under linux. * @@ -939,9 +942,23 @@ public: void InitMutex() { InitializeCriticalSection(&mutex); } void Lock() { EnterCriticalSection(&mutex); } void Unlock() { LeaveCriticalSection(&mutex); } -#elif defined(P_PTHREADS) +#elif defined(P_PTHREADS) && P_HAS_RECURSIVE_MUTEX pthread_mutex_t mutex; - void InitMutex() { pthread_mutex_init(&mutex, NULL); } + void InitMutex() { + // NOTE this should actually guard against various errors + // returned. + pthread_mutexattr_t attr; + pthread_mutexattr_init(&attr); + pthread_mutexattr_settype(&attr, +#if P_HAS_RECURSIVE_MUTEX == 2 +PTHREAD_MUTEX_RECURSIVE +#else +PTHREAD_MUTEX_RECURSIVE_NP +#endif + ); + pthread_mutex_init(&mutex, &attr); + pthread_mutexattr_destroy(&attr); + } void Lock() { pthread_mutex_lock(&mutex); } void Unlock() { pthread_mutex_unlock(&mutex); } #else -- 2.11.4.GIT