diff options
author | kwolekr <kwolekr@minetest.net> | 2015-10-31 16:31:43 -0400 |
---|---|---|
committer | kwolekr <kwolekr@minetest.net> | 2015-11-01 11:32:05 -0500 |
commit | 52e5b513ed9dc143c967c733423fe751e1b663d1 (patch) | |
tree | 524462147e28889f655cb2ae867ebb412d9c75e3 /src/threading | |
parent | d198e420ec54be47fe2285b3205953282ec06742 (diff) | |
download | minetest-52e5b513ed9dc143c967c733423fe751e1b663d1.tar.gz minetest-52e5b513ed9dc143c967c733423fe751e1b663d1.tar.bz2 minetest-52e5b513ed9dc143c967c733423fe751e1b663d1.zip |
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.
Diffstat (limited to 'src/threading')
-rw-r--r-- | src/threading/mutex.cpp | 16 | ||||
-rw-r--r-- | src/threading/mutex.h | 2 |
2 files changed, 14 insertions, 4 deletions
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(); |