Skip to content
This repository has been archived by the owner on Feb 11, 2021. It is now read-only.

Latest commit

 

History

History
251 lines (208 loc) · 6.48 KB

SDL_mutex.h

File metadata and controls

251 lines (208 loc) · 6.48 KB
 
1
2
/*
Simple DirectMedia Layer
Feb 15, 2013
Feb 15, 2013
3
Copyright (C) 1997-2013 Sam Lantinga <slouken@libsdl.org>
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
arising from the use of this software.
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not
claim that you wrote the original software. If you use this software
in a product, an acknowledgment in the product documentation would be
appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be
misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
*/
#ifndef _SDL_mutex_h
#define _SDL_mutex_h
/**
* \file SDL_mutex.h
May 18, 2013
May 18, 2013
27
*
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
* Functions to provide thread synchronization primitives.
*/
#include "SDL_stdinc.h"
#include "SDL_error.h"
#include "begin_code.h"
/* Set up for C function definitions, even when using C++ */
#ifdef __cplusplus
extern "C" {
#endif
/**
* Synchronization functions which can time out return this value
* if they time out.
*/
May 18, 2013
May 18, 2013
44
#define SDL_MUTEX_TIMEDOUT 1
45
46
47
48
/**
* This is the timeout value which corresponds to never time out.
*/
May 18, 2013
May 18, 2013
49
#define SDL_MUTEX_MAXWAIT (~(Uint32)0)
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
/**
* \name Mutex functions
*/
/*@{*/
/* The SDL mutex structure, defined in SDL_mutex.c */
struct SDL_mutex;
typedef struct SDL_mutex SDL_mutex;
/**
* Create a mutex, initialized unlocked.
*/
extern DECLSPEC SDL_mutex *SDLCALL SDL_CreateMutex(void);
/**
* Lock the mutex.
May 18, 2013
May 18, 2013
68
*
69
70
* \return 0, or -1 on error.
*/
May 18, 2013
May 18, 2013
71
#define SDL_mutexP(m) SDL_LockMutex(m)
Mar 8, 2013
Mar 8, 2013
72
extern DECLSPEC int SDLCALL SDL_LockMutex(SDL_mutex * mutex);
Mar 5, 2013
Mar 5, 2013
74
75
/**
* Try to lock the mutex
May 18, 2013
May 18, 2013
76
*
Mar 5, 2013
Mar 5, 2013
77
78
79
80
* \return 0, SDL_MUTEX_TIMEDOUT, or -1 on error
*/
extern DECLSPEC int SDLCALL SDL_TryLockMutex(SDL_mutex * mutex);
81
82
/**
* Unlock the mutex.
May 18, 2013
May 18, 2013
83
*
84
* \return 0, or -1 on error.
May 18, 2013
May 18, 2013
85
*
86
87
88
* \warning It is an error to unlock a mutex that has not been locked by
* the current thread, and doing so results in undefined behavior.
*/
May 18, 2013
May 18, 2013
89
#define SDL_mutexV(m) SDL_UnlockMutex(m)
Mar 8, 2013
Mar 8, 2013
90
extern DECLSPEC int SDLCALL SDL_UnlockMutex(SDL_mutex * mutex);
May 18, 2013
May 18, 2013
92
/**
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
* Destroy a mutex.
*/
extern DECLSPEC void SDLCALL SDL_DestroyMutex(SDL_mutex * mutex);
/*@}*//*Mutex functions*/
/**
* \name Semaphore functions
*/
/*@{*/
/* The SDL semaphore structure, defined in SDL_sem.c */
struct SDL_semaphore;
typedef struct SDL_semaphore SDL_sem;
/**
* Create a semaphore, initialized with value, returns NULL on failure.
*/
extern DECLSPEC SDL_sem *SDLCALL SDL_CreateSemaphore(Uint32 initial_value);
/**
* Destroy a semaphore.
*/
extern DECLSPEC void SDLCALL SDL_DestroySemaphore(SDL_sem * sem);
/**
May 18, 2013
May 18, 2013
120
121
* This function suspends the calling thread until the semaphore pointed
* to by \c sem has a positive count. It then atomically decreases the
122
123
124
125
126
127
* semaphore count.
*/
extern DECLSPEC int SDLCALL SDL_SemWait(SDL_sem * sem);
/**
* Non-blocking variant of SDL_SemWait().
May 18, 2013
May 18, 2013
128
129
*
* \return 0 if the wait succeeds, ::SDL_MUTEX_TIMEDOUT if the wait would
130
131
132
133
134
135
* block, and -1 on error.
*/
extern DECLSPEC int SDLCALL SDL_SemTryWait(SDL_sem * sem);
/**
* Variant of SDL_SemWait() with a timeout in milliseconds.
May 18, 2013
May 18, 2013
136
137
*
* \return 0 if the wait succeeds, ::SDL_MUTEX_TIMEDOUT if the wait does not
138
* succeed in the allotted time, and -1 on error.
May 18, 2013
May 18, 2013
139
140
*
* \warning On some platforms this function is implemented by looping with a
141
142
143
144
145
146
* delay of 1 ms, and so should be avoided if possible.
*/
extern DECLSPEC int SDLCALL SDL_SemWaitTimeout(SDL_sem * sem, Uint32 ms);
/**
* Atomically increases the semaphore's count (not blocking).
May 18, 2013
May 18, 2013
147
*
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
* \return 0, or -1 on error.
*/
extern DECLSPEC int SDLCALL SDL_SemPost(SDL_sem * sem);
/**
* Returns the current count of the semaphore.
*/
extern DECLSPEC Uint32 SDLCALL SDL_SemValue(SDL_sem * sem);
/*@}*//*Semaphore functions*/
/**
* \name Condition variable functions
*/
/*@{*/
/* The SDL condition variable structure, defined in SDL_cond.c */
struct SDL_cond;
typedef struct SDL_cond SDL_cond;
/**
* Create a condition variable.
*
* Typical use of condition variables:
*
* Thread A:
* SDL_LockMutex(lock);
* while ( ! condition ) {
* SDL_CondWait(cond, lock);
* }
* SDL_UnlockMutex(lock);
*
* Thread B:
* SDL_LockMutex(lock);
* ...
* condition = true;
* ...
* SDL_CondSignal(cond);
* SDL_UnlockMutex(lock);
*
* There is some discussion whether to signal the condition variable
* with the mutex locked or not. There is some potential performance
* benefit to unlocking first on some platforms, but there are some
* potential race conditions depending on how your code is structured.
*
* In general it's safer to signal the condition variable while the
* mutex is locked.
*/
extern DECLSPEC SDL_cond *SDLCALL SDL_CreateCond(void);
/**
* Destroy a condition variable.
*/
extern DECLSPEC void SDLCALL SDL_DestroyCond(SDL_cond * cond);
/**
* Restart one of the threads that are waiting on the condition variable.
May 18, 2013
May 18, 2013
206
*
207
208
209
210
211
212
213
214
215
216
217
218
219
* \return 0 or -1 on error.
*/
extern DECLSPEC int SDLCALL SDL_CondSignal(SDL_cond * cond);
/**
* Restart all threads that are waiting on the condition variable.
*
* \return 0 or -1 on error.
*/
extern DECLSPEC int SDLCALL SDL_CondBroadcast(SDL_cond * cond);
/**
* Wait on the condition variable, unlocking the provided mutex.
May 18, 2013
May 18, 2013
220
*
221
* \warning The mutex must be locked before entering this function!
May 18, 2013
May 18, 2013
222
*
223
* The mutex is re-locked once the condition variable is signaled.
May 18, 2013
May 18, 2013
224
*
225
226
227
228
229
230
231
232
233
* \return 0 when it is signaled, or -1 on error.
*/
extern DECLSPEC int SDLCALL SDL_CondWait(SDL_cond * cond, SDL_mutex * mutex);
/**
* Waits for at most \c ms milliseconds, and returns 0 if the condition
* variable is signaled, ::SDL_MUTEX_TIMEDOUT if the condition is not
* signaled in the allotted time, and -1 on error.
*
May 18, 2013
May 18, 2013
234
* \warning On some platforms this function is implemented by looping with a
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
* delay of 1 ms, and so should be avoided if possible.
*/
extern DECLSPEC int SDLCALL SDL_CondWaitTimeout(SDL_cond * cond,
SDL_mutex * mutex, Uint32 ms);
/*@}*//*Condition variable functions*/
/* Ends C function definitions when using C++ */
#ifdef __cplusplus
}
#endif
#include "close_code.h"
#endif /* _SDL_mutex_h */
/* vi: set ts=4 sw=4 expandtab: */