1 /* 2 SDL - Simple DirectMedia Layer 3 Copyright (C) 1997-2012 Sam Lantinga 4 5 This library is free software; you can redistribute it and/or 6 modify it under the terms of the GNU Lesser General Public 7 License as published by the Free Software Foundation; either 8 version 2.1 of the License, or (at your option) any later version. 9 10 This library is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 Lesser General Public License for more details. 14 15 You should have received a copy of the GNU Lesser General Public 16 License along with this library; if not, write to the Free Software 17 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 18 19 Sam Lantinga 20 slouken (at) libsdl.org 21 */ 22 #include "SDL_config.h" 23 24 /* Mutex functions using the Win32 API */ 25 26 #define WIN32_LEAN_AND_MEAN 27 #include <windows.h> 28 29 #include "SDL_mutex.h" 30 31 32 struct SDL_mutex { 33 HANDLE id; 34 }; 35 36 /* Create a mutex */ 37 SDL_mutex *SDL_CreateMutex(void) 38 { 39 SDL_mutex *mutex; 40 41 /* Allocate mutex memory */ 42 mutex = (SDL_mutex *)SDL_malloc(sizeof(*mutex)); 43 if ( mutex ) { 44 /* Create the mutex, with initial value signaled */ 45 mutex->id = CreateMutex(NULL, FALSE, NULL); 46 if ( ! mutex->id ) { 47 SDL_SetError("Couldn't create mutex"); 48 SDL_free(mutex); 49 mutex = NULL; 50 } 51 } else { 52 SDL_OutOfMemory(); 53 } 54 return(mutex); 55 } 56 57 /* Free the mutex */ 58 void SDL_DestroyMutex(SDL_mutex *mutex) 59 { 60 if ( mutex ) { 61 if ( mutex->id ) { 62 CloseHandle(mutex->id); 63 mutex->id = 0; 64 } 65 SDL_free(mutex); 66 } 67 } 68 69 /* Lock the mutex */ 70 int SDL_mutexP(SDL_mutex *mutex) 71 { 72 if ( mutex == NULL ) { 73 SDL_SetError("Passed a NULL mutex"); 74 return -1; 75 } 76 if ( WaitForSingleObject(mutex->id, INFINITE) == WAIT_FAILED ) { 77 SDL_SetError("Couldn't wait on mutex"); 78 return -1; 79 } 80 return(0); 81 } 82 83 /* Unlock the mutex */ 84 int SDL_mutexV(SDL_mutex *mutex) 85 { 86 if ( mutex == NULL ) { 87 SDL_SetError("Passed a NULL mutex"); 88 return -1; 89 } 90 if ( ReleaseMutex(mutex->id) == FALSE ) { 91 SDL_SetError("Couldn't release mutex"); 92 return -1; 93 } 94 return(0); 95 } 96