aboutsummaryrefslogtreecommitdiff
path: root/source/thread_support.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/thread_support.cpp')
-rw-r--r--source/thread_support.cpp121
1 files changed, 121 insertions, 0 deletions
diff --git a/source/thread_support.cpp b/source/thread_support.cpp
new file mode 100644
index 0000000..1b03629
--- /dev/null
+++ b/source/thread_support.cpp
@@ -0,0 +1,121 @@
+///////////////////////////////////////////////////////////////////////////////
+// Copyright (c) Electronic Arts Inc. All rights reserved.
+///////////////////////////////////////////////////////////////////////////////
+
+
+#include <EASTL/internal/config.h>
+#include <EASTL/internal/thread_support.h>
+#include <EASTL/type_traits.h>
+#include <EASTL/memory.h>
+
+#if defined(EA_PLATFORM_MICROSOFT)
+ EA_DISABLE_ALL_VC_WARNINGS();
+ #ifndef WIN32_LEAN_AND_MEAN
+ #define WIN32_LEAN_AND_MEAN
+ #endif
+ #include <Windows.h>
+ EA_RESTORE_ALL_VC_WARNINGS();
+#endif
+
+
+namespace eastl
+{
+ namespace Internal
+ {
+ #if EASTL_CPP11_MUTEX_ENABLED
+ // We use the C++11 Standard Library mutex as-is.
+ #else
+ /////////////////////////////////////////////////////////////////
+ // mutex
+ /////////////////////////////////////////////////////////////////
+
+ mutex::mutex()
+ {
+ #if defined(EA_PLATFORM_MICROSOFT)
+ static_assert(sizeof(mMutexBuffer) == sizeof(CRITICAL_SECTION), "mMutexBuffer size failure");
+ //static_assert(EA_ALIGN_OF(mMutexBuffer) >= EA_ALIGN_OF(CRITICAL_SECTION), "mMutexBuffer alignment failure"); // Enabling this causes the VS2012 compiler to crash.
+
+ #if !defined(_WIN32_WINNT) || (_WIN32_WINNT < 0x0403)
+ InitializeCriticalSection((CRITICAL_SECTION*)mMutexBuffer);
+ #elif !EA_WINAPI_FAMILY_PARTITION(EA_WINAPI_PARTITION_DESKTOP)
+ BOOL result = InitializeCriticalSectionEx((CRITICAL_SECTION*)mMutexBuffer, 10, 0);
+ EASTL_ASSERT(result != 0); EA_UNUSED(result);
+ #else
+ BOOL result = InitializeCriticalSectionAndSpinCount((CRITICAL_SECTION*)mMutexBuffer, 10);
+ EASTL_ASSERT(result != 0); EA_UNUSED(result);
+ #endif
+
+ #elif defined(EA_PLATFORM_POSIX)
+ pthread_mutexattr_t attr;
+
+ pthread_mutexattr_init(&attr);
+ pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_PRIVATE);
+ pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
+ pthread_mutex_init(&mMutex, &attr);
+ pthread_mutexattr_destroy(&attr);
+ #endif
+ }
+
+ mutex::~mutex()
+ {
+ #if defined(EA_PLATFORM_MICROSOFT)
+ DeleteCriticalSection((CRITICAL_SECTION*)mMutexBuffer);
+ #elif defined(EA_PLATFORM_POSIX)
+ pthread_mutex_destroy(&mMutex);
+ #endif
+ }
+
+ void mutex::lock()
+ {
+ #if defined(EA_PLATFORM_MICROSOFT)
+ EnterCriticalSection((CRITICAL_SECTION*)mMutexBuffer);
+ #elif defined(EA_PLATFORM_POSIX)
+ pthread_mutex_lock(&mMutex);
+ #else
+ EASTL_FAIL_MSG("EASTL thread safety is not implemented yet. See EAThread for how to do this for the given platform.");
+ #endif
+ }
+
+ void mutex::unlock()
+ {
+ #if defined(EA_PLATFORM_MICROSOFT)
+ LeaveCriticalSection((CRITICAL_SECTION*)mMutexBuffer);
+ #elif defined(EA_PLATFORM_POSIX)
+ pthread_mutex_unlock(&mMutex);
+ #endif
+ }
+ #endif
+
+
+ /////////////////////////////////////////////////////////////////
+ // shared_ptr_auto_mutex
+ /////////////////////////////////////////////////////////////////
+
+ // We could solve this by having single global mutex for all shared_ptrs, a set of mutexes for shared_ptrs,
+ // a single mutex for every shared_ptr, or have a template parameter that enables mutexes for just some shared_ptrs.
+ eastl::late_constructed<mutex, true> gSharedPtrMutex;
+
+ shared_ptr_auto_mutex::shared_ptr_auto_mutex(const void* /*pSharedPtr*/)
+ : auto_mutex(*gSharedPtrMutex.get())
+ {
+ }
+
+
+ } // namespace Internal
+
+} // namespace eastl
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+