Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include "OVR_Atomic.h"
00019
00020 #ifdef OVR_ENABLE_THREADS
00021
00022
00023 #if defined(OVR_OS_WIN32) && defined(NTDDI_WIN8) && (NTDDI_VERSION >= NTDDI_WIN8)
00024 #include <synchapi.h>
00025 #endif
00026
00027
00028 namespace OVR {
00029
00030
00031
00032 #if defined(OVR_OS_WIN32)
00033
00034
00035
00036
00037 Lock::Lock(unsigned spinCount)
00038 {
00039 #if defined(NTDDI_WIN8) && (NTDDI_VERSION >= NTDDI_WIN8)
00040
00041 InitializeCriticalSectionEx(&cs, spinCount,
00042 OVR_DEBUG_SELECT(NULL, CRITICAL_SECTION_NO_DEBUG_INFO));
00043 #else
00044
00045 typedef BOOL (WINAPI *Function_InitializeCriticalSectionAndSpinCount)
00046 (LPCRITICAL_SECTION lpCriticalSection, DWORD dwSpinCount);
00047
00048
00049
00050
00051 static bool initTried = 0;
00052 static Function_InitializeCriticalSectionAndSpinCount pInitFn = 0;
00053
00054 if (!initTried)
00055 {
00056 HMODULE hmodule = ::LoadLibrary(OVR_STR("kernel32.dll"));
00057 pInitFn = (Function_InitializeCriticalSectionAndSpinCount)
00058 ::GetProcAddress(hmodule, "InitializeCriticalSectionAndSpinCount");
00059 initTried = true;
00060 }
00061
00062
00063 if (pInitFn)
00064 pInitFn(&cs, spinCount);
00065 else
00066 ::InitializeCriticalSection(&cs);
00067 #endif
00068
00069 }
00070
00071
00072 Lock::~Lock()
00073 {
00074 DeleteCriticalSection(&cs);
00075 }
00076
00077
00078 #endif
00079
00080 }
00081
00082 #endif // OVR_ENABLE_THREADS