github.com/Konstantin8105/c4go@v0.0.0-20240505174241-768bb1c65a51/tests/raylib/external/glfw/src/win32_thread.c (about)

     1  //========================================================================
     2  // GLFW 3.4 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  // Please use C89 style variable declarations in this file because VS 2010
    28  //========================================================================
    29  
    30  #include "internal.h"
    31  
    32  #include <assert.h>
    33  
    34  
    35  //////////////////////////////////////////////////////////////////////////
    36  //////                       GLFW platform API                      //////
    37  //////////////////////////////////////////////////////////////////////////
    38  
    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  
    54  void _glfwPlatformDestroyTls(_GLFWtls* tls)
    55  {
    56      if (tls->win32.allocated)
    57          TlsFree(tls->win32.index);
    58      memset(tls, 0, sizeof(_GLFWtls));
    59  }
    60  
    61  void* _glfwPlatformGetTls(_GLFWtls* tls)
    62  {
    63      assert(tls->win32.allocated == GLFW_TRUE);
    64      return TlsGetValue(tls->win32.index);
    65  }
    66  
    67  void _glfwPlatformSetTls(_GLFWtls* tls, void* value)
    68  {
    69      assert(tls->win32.allocated == GLFW_TRUE);
    70      TlsSetValue(tls->win32.index, value);
    71  }
    72  
    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  
    80  void _glfwPlatformDestroyMutex(_GLFWmutex* mutex)
    81  {
    82      if (mutex->win32.allocated)
    83          DeleteCriticalSection(&mutex->win32.section);
    84      memset(mutex, 0, sizeof(_GLFWmutex));
    85  }
    86  
    87  void _glfwPlatformLockMutex(_GLFWmutex* mutex)
    88  {
    89      assert(mutex->win32.allocated == GLFW_TRUE);
    90      EnterCriticalSection(&mutex->win32.section);
    91  }
    92  
    93  void _glfwPlatformUnlockMutex(_GLFWmutex* mutex)
    94  {
    95      assert(mutex->win32.allocated == GLFW_TRUE);
    96      LeaveCriticalSection(&mutex->win32.section);
    97  }
    98