*/
ScriptApiBase::ScriptApiBase() :
- m_luastackmutex(true)
+ m_luastackmutex()
{
#ifdef SCRIPTAPI_LOCK_DEBUG
m_lock_recursion_count = 0;
void objectrefGetOrCreate(lua_State *L, ServerActiveObject *cobj);
void objectrefGet(lua_State *L, u16 id);
- Mutex m_luastackmutex;
+ RecursiveMutex m_luastackmutex;
std::string m_last_run_mod;
bool m_secure;
#ifdef SCRIPTAPI_LOCK_DEBUG
#endif
#define SCRIPTAPI_PRECHECKHEADER \
- MutexAutoLock scriptlock(this->m_luastackmutex); \
+ RecursiveMutexAutoLock scriptlock(this->m_luastackmutex); \
SCRIPTAPI_LOCK_CHECK; \
realityCheck(); \
lua_State *L = getStack(); \
#if __cplusplus >= 201103L
#include <condition_variable>
#include "threading/mutex.h"
+ #include "threading/mutex_auto_lock.h"
#elif defined(_WIN32)
#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#define UNUSED(expr) do { (void)(expr); } while (0)
+Mutex::Mutex()
+{
+ init_mutex(false);
+}
+
+
Mutex::Mutex(bool recursive)
+{
+ init_mutex(recursive);
+}
+
+void Mutex::init_mutex(bool recursive)
{
#ifdef _WIN32
// Windows critical sections are recursive by default
#endif
}
+RecursiveMutex::RecursiveMutex()
+ : Mutex(true)
+{}
+
#endif
#if __cplusplus >= 201103L && !defined(_WIN32)
#include <mutex>
using Mutex = std::mutex;
+ using RecursiveMutex = std::recursive_mutex;
#else
#ifdef _WIN32
class Mutex
{
public:
- Mutex(bool recursive=false);
+ Mutex();
~Mutex();
void lock();
void unlock();
+protected:
+ Mutex(bool recursive);
+ void init_mutex(bool recursive);
private:
#ifdef _WIN32
CRITICAL_SECTION mutex;
DISABLE_CLASS_COPY(Mutex);
};
+class RecursiveMutex : public Mutex
+{
+public:
+ RecursiveMutex();
+
+ DISABLE_CLASS_COPY(RecursiveMutex);
+};
+
#endif // C++11
#endif
#if __cplusplus >= 201103L
#include <mutex>
- using MutexAutoLock = std::lock_guard<std::mutex>;
+ using MutexAutoLock = std::unique_lock<std::mutex>;
+ using RecursiveMutexAutoLock = std::unique_lock<std::recursive_mutex>;
#else
#include "threading/mutex.h"
Mutex &mutex;
};
+class RecursiveMutexAutoLock
+{
+public:
+ RecursiveMutexAutoLock(RecursiveMutex &m) : mutex(m) { mutex.lock(); }
+ ~RecursiveMutexAutoLock() { mutex.unlock(); }
+
+private:
+ RecursiveMutex &mutex;
+};
#endif
#endif