aboutsummaryrefslogtreecommitdiff
path: root/Src/Wasabi/bfc/critsec.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Src/Wasabi/bfc/critsec.cpp')
-rw-r--r--Src/Wasabi/bfc/critsec.cpp73
1 files changed, 73 insertions, 0 deletions
diff --git a/Src/Wasabi/bfc/critsec.cpp b/Src/Wasabi/bfc/critsec.cpp
new file mode 100644
index 00000000..e7506371
--- /dev/null
+++ b/Src/Wasabi/bfc/critsec.cpp
@@ -0,0 +1,73 @@
+#include "precomp_wasabi_bfc.h"
+#include "critsec.h"
+// uncomment this if needed
+//#define CS_DEBUG
+
+CriticalSection::CriticalSection() {
+#ifdef WIN32
+ InitializeCriticalSection(&cs);
+#elif defined(__APPLE__)
+ MPCreateCriticalRegion(&cr);
+#elif defined(LINUX)
+ pthread_mutex_t recursive = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP;
+ cs.mutex = recursive;
+#endif
+
+#ifdef ASSERTS_ENABLED
+#ifdef CS_DEBUG
+ within = 0;
+#endif
+#endif
+}
+
+CriticalSection::~CriticalSection() {
+#ifdef CS_DEBUG
+#ifdef ASSERTS_ENABLED
+ ASSERT(!within);
+#endif
+#endif
+#ifdef WIN32
+ DeleteCriticalSection(&cs);
+#elif defined(__APPLE__)
+ MPDeleteCriticalRegion(cr);
+#elif defined(LINUX)
+ pthread_mutex_destroy(&cs.mutex);
+#endif
+}
+
+void CriticalSection::enter() {
+#ifdef WIN32
+ EnterCriticalSection(&cs);
+#elif defined(__APPLE__)
+ MPEnterCriticalRegion(cr, kDurationForever);
+#elif defined(LINUX)
+ pthread_mutex_lock(&cs.mutex);
+#endif
+
+#ifdef CS_DEBUG
+#ifdef ASSERTS_ENABLED
+ ASSERT(!within);
+ within = 1;
+#endif
+#endif
+}
+
+void CriticalSection::leave() {
+#if defined(CS_DEBUG) && defined(ASSERTS_ENABLED)
+ ASSERT(within);
+ within = 0;
+#endif
+
+#ifdef WIN32
+ LeaveCriticalSection(&cs);
+#elif defined(__APPLE__)
+ MPExitCriticalRegion(cr);
+#elif defined(LINUX)
+ pthread_mutex_unlock(&cs.mutex);
+#endif
+}
+
+void CriticalSection::inout() {
+ enter();
+ leave();
+}