Home | History | Annotate | Download | only in win32
      1 /*
      2     SDL - Simple DirectMedia Layer
      3     Copyright (C) 1997-2006 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