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@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
32struct SDL_mutex {
33	HANDLE id;
34};
35
36/* Create a mutex */
37SDL_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 */
58void 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 */
70int 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 */
84int 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