From 52e5b513ed9dc143c967c733423fe751e1b663d1 Mon Sep 17 00:00:00 2001 From: kwolekr Date: Sat, 31 Oct 2015 16:31:43 -0400 Subject: Fix Lua scripting synchronization For several years now, the lua script lock has been completely broken. This commit fixes the main issue (creation of a temporary rather than scoped object), and fixes a subsequent deadlock issue caused by nested script API calls by adding support for recursive mutexes. --- src/threading/mutex.cpp | 16 +++++++++++++--- src/threading/mutex.h | 2 +- 2 files changed, 14 insertions(+), 4 deletions(-) (limited to 'src/threading') diff --git a/src/threading/mutex.cpp b/src/threading/mutex.cpp index eb1c7d61d..e12b79185 100644 --- a/src/threading/mutex.cpp +++ b/src/threading/mutex.cpp @@ -34,15 +34,25 @@ DEALINGS IN THE SOFTWARE. #define UNUSED(expr) do { (void)(expr); } while (0) - -Mutex::Mutex() +Mutex::Mutex(bool recursive) { #ifdef _WIN32 + // Windows critical sections are recursive by default + UNUSED(recursive); + InitializeCriticalSection(&mutex); #else - int ret = pthread_mutex_init(&mutex, NULL); + pthread_mutexattr_t attr; + pthread_mutexattr_init(&attr); + + if (recursive) + pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); + + int ret = pthread_mutex_init(&mutex, &attr); assert(!ret); UNUSED(ret); + + pthread_mutexattr_destroy(&attr); #endif } diff --git a/src/threading/mutex.h b/src/threading/mutex.h index f1a4882b7..62a482787 100644 --- a/src/threading/mutex.h +++ b/src/threading/mutex.h @@ -49,7 +49,7 @@ DEALINGS IN THE SOFTWARE. class Mutex { public: - Mutex(); + Mutex(bool recursive=false); ~Mutex(); void lock(); void unlock(); -- cgit v1.2.3