1 //========================================================================
2 // GLFW 3.5 Win32 - www.glfw.org
3 //------------------------------------------------------------------------
4 // Copyright (c) 2002-2006 Marcus Geelnard
5 // Copyright (c) 2006-2017 Camilla Löwy <elmindreda@glfw.org>
6 //
7 // This software is provided 'as-is', without any express or implied
8 // warranty. In no event will the authors be held liable for any damages
9 // arising from the use of this software.
10 //
11 // Permission is granted to anyone to use this software for any purpose,
12 // including commercial applications, and to alter it and redistribute it
13 // freely, subject to the following restrictions:
14 //
15 // 1. The origin of this software must not be misrepresented; you must not
16 // claim that you wrote the original software. If you use this software
17 // in a product, an acknowledgment in the product documentation would
18 // be appreciated but is not required.
19 //
20 // 2. Altered source versions must be plainly marked as such, and must not
21 // be misrepresented as being the original software.
22 //
23 // 3. This notice may not be removed or altered from any source
24 // distribution.
25 //
26 //========================================================================
27
28 #include "internal.h"
29
30 #if defined(GLFW_BUILD_WIN32_THREAD)
31
32 #include <assert.h>
33
34
35 //////////////////////////////////////////////////////////////////////////
36 ////// GLFW platform API //////
37 //////////////////////////////////////////////////////////////////////////
38
_glfwPlatformCreateTls(_GLFWtls * tls)39 GLFWbool _glfwPlatformCreateTls(_GLFWtls* tls)
40 {
41 assert(tls->win32.allocated == GLFW_FALSE);
42
43 tls->win32.index = TlsAlloc();
44 if (tls->win32.index == TLS_OUT_OF_INDEXES)
45 {
46 _glfwInputError(GLFW_PLATFORM_ERROR, "Win32: Failed to allocate TLS index");
47 return GLFW_FALSE;
48 }
49
50 tls->win32.allocated = GLFW_TRUE;
51 return GLFW_TRUE;
52 }
53
_glfwPlatformDestroyTls(_GLFWtls * tls)54 void _glfwPlatformDestroyTls(_GLFWtls* tls)
55 {
56 if (tls->win32.allocated)
57 TlsFree(tls->win32.index);
58 memset(tls, 0, sizeof(_GLFWtls));
59 }
60
_glfwPlatformGetTls(_GLFWtls * tls)61 void* _glfwPlatformGetTls(_GLFWtls* tls)
62 {
63 assert(tls->win32.allocated == GLFW_TRUE);
64 return TlsGetValue(tls->win32.index);
65 }
66
_glfwPlatformSetTls(_GLFWtls * tls,void * value)67 void _glfwPlatformSetTls(_GLFWtls* tls, void* value)
68 {
69 assert(tls->win32.allocated == GLFW_TRUE);
70 TlsSetValue(tls->win32.index, value);
71 }
72
_glfwPlatformCreateMutex(_GLFWmutex * mutex)73 GLFWbool _glfwPlatformCreateMutex(_GLFWmutex* mutex)
74 {
75 assert(mutex->win32.allocated == GLFW_FALSE);
76 InitializeCriticalSection(&mutex->win32.section);
77 return mutex->win32.allocated = GLFW_TRUE;
78 }
79
_glfwPlatformDestroyMutex(_GLFWmutex * mutex)80 void _glfwPlatformDestroyMutex(_GLFWmutex* mutex)
81 {
82 if (mutex->win32.allocated)
83 DeleteCriticalSection(&mutex->win32.section);
84 memset(mutex, 0, sizeof(_GLFWmutex));
85 }
86
_glfwPlatformLockMutex(_GLFWmutex * mutex)87 void _glfwPlatformLockMutex(_GLFWmutex* mutex)
88 {
89 assert(mutex->win32.allocated == GLFW_TRUE);
90 EnterCriticalSection(&mutex->win32.section);
91 }
92
_glfwPlatformUnlockMutex(_GLFWmutex * mutex)93 void _glfwPlatformUnlockMutex(_GLFWmutex* mutex)
94 {
95 assert(mutex->win32.allocated == GLFW_TRUE);
96 LeaveCriticalSection(&mutex->win32.section);
97 }
98
99 #endif // GLFW_BUILD_WIN32_THREAD
100
101