SDL 2.0
SDL_sysmutex.c File Reference
#include "../../SDL_internal.h"
#include <errno.h>
#include <pthread.h>
#include "SDL_thread.h"
+ Include dependency graph for SDL_sysmutex.c:

Go to the source code of this file.

Data Structures

struct  SDL_mutex
 

Macros

#define FAKE_RECURSIVE_MUTEX   1
 

Functions

SDL_mutexSDL_CreateMutex (void)
 
void SDL_DestroyMutex (SDL_mutex *mutex)
 
int SDL_LockMutex (SDL_mutex *mutex)
 
int SDL_TryLockMutex (SDL_mutex *mutex)
 
int SDL_UnlockMutex (SDL_mutex *mutex)
 

Macro Definition Documentation

◆ FAKE_RECURSIVE_MUTEX

#define FAKE_RECURSIVE_MUTEX   1

Definition at line 30 of file SDL_sysmutex.c.

Function Documentation

◆ SDL_CreateMutex()

SDL_mutex * SDL_CreateMutex ( void  )

Create a mutex, initialized unlocked.

Definition at line 43 of file SDL_sysmutex.c.

44{
46 pthread_mutexattr_t attr;
47
48 /* Allocate the structure */
49 mutex = (SDL_mutex *) SDL_calloc(1, sizeof(*mutex));
50 if (mutex) {
51 pthread_mutexattr_init(&attr);
52#if SDL_THREAD_PTHREAD_RECURSIVE_MUTEX
53 pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
54#elif SDL_THREAD_PTHREAD_RECURSIVE_MUTEX_NP
55 pthread_mutexattr_setkind_np(&attr, PTHREAD_MUTEX_RECURSIVE_NP);
56#else
57 /* No extra attributes necessary */
58#endif
59 if (pthread_mutex_init(&mutex->id, &attr) != 0) {
60 SDL_SetError("pthread_mutex_init() failed");
62 mutex = NULL;
63 }
64 } else {
66 }
67 return (mutex);
68}
#define SDL_SetError
#define SDL_free
#define SDL_calloc
#define SDL_OutOfMemory()
Definition: SDL_error.h:52
#define NULL
Definition: begin_code.h:167
pthread_mutex_t id
Definition: SDL_sysmutex.c:35
static SDL_mutex * mutex
Definition: testlock.c:23

References SDL_mutex::id, mutex, NULL, SDL_calloc, SDL_free, SDL_OutOfMemory, and SDL_SetError.

◆ SDL_DestroyMutex()

void SDL_DestroyMutex ( SDL_mutex mutex)

Destroy a mutex.

Definition at line 71 of file SDL_sysmutex.c.

72{
73 if (mutex) {
74 pthread_mutex_destroy(&mutex->id);
76 }
77}

References SDL_mutex::id, mutex, and SDL_free.

◆ SDL_LockMutex()

int SDL_LockMutex ( SDL_mutex mutex)

Definition at line 81 of file SDL_sysmutex.c.

82{
83#if FAKE_RECURSIVE_MUTEX
84 pthread_t this_thread;
85#endif
86
87 if (mutex == NULL) {
88 return SDL_SetError("Passed a NULL mutex");
89 }
90
91#if FAKE_RECURSIVE_MUTEX
92 this_thread = pthread_self();
93 if (mutex->owner == this_thread) {
95 } else {
96 /* The order of operations is important.
97 We set the locking thread id after we obtain the lock
98 so unlocks from other threads will fail.
99 */
100 if (pthread_mutex_lock(&mutex->id) == 0) {
101 mutex->owner = this_thread;
102 mutex->recursive = 0;
103 } else {
104 return SDL_SetError("pthread_mutex_lock() failed");
105 }
106 }
107#else
108 if (pthread_mutex_lock(&mutex->id) != 0) {
109 return SDL_SetError("pthread_mutex_lock() failed");
110 }
111#endif
112 return 0;
113}
SDL_threadID owner
Definition: SDL_sysmutex.c:32
int recursive
Definition: SDL_sysmutex.c:31

References SDL_mutex::id, mutex, NULL, SDL_mutex::owner, SDL_mutex::recursive, SDL_SemWait, SDL_SetError, SDL_ThreadID, and SDL_mutex::sem.

◆ SDL_TryLockMutex()

int SDL_TryLockMutex ( SDL_mutex mutex)

Try to lock the mutex

Returns
0, SDL_MUTEX_TIMEDOUT, or -1 on error

Definition at line 116 of file SDL_sysmutex.c.

117{
118 int retval;
119 int result;
120#if FAKE_RECURSIVE_MUTEX
121 pthread_t this_thread;
122#endif
123
124 if (mutex == NULL) {
125 return SDL_SetError("Passed a NULL mutex");
126 }
127
128 retval = 0;
129#if FAKE_RECURSIVE_MUTEX
130 this_thread = pthread_self();
131 if (mutex->owner == this_thread) {
132 ++mutex->recursive;
133 } else {
134 /* The order of operations is important.
135 We set the locking thread id after we obtain the lock
136 so unlocks from other threads will fail.
137 */
138 result = pthread_mutex_trylock(&mutex->id);
139 if (result == 0) {
140 mutex->owner = this_thread;
141 mutex->recursive = 0;
142 } else if (result == EBUSY) {
144 } else {
145 retval = SDL_SetError("pthread_mutex_trylock() failed");
146 }
147 }
148#else
149 result = pthread_mutex_trylock(&mutex->id);
150 if (result != 0) {
151 if (result == EBUSY) {
153 } else {
154 retval = SDL_SetError("pthread_mutex_trylock() failed");
155 }
156 }
157#endif
158 return retval;
159}
#define SDL_MUTEX_TIMEDOUT
Definition: SDL_mutex.h:44
GLuint64EXT * result
SDL_bool retval

References SDL_mutex::id, mutex, NULL, SDL_mutex::owner, SDL_mutex::recursive, retval, SDL_MUTEX_TIMEDOUT, and SDL_SetError.

◆ SDL_UnlockMutex()

int SDL_UnlockMutex ( SDL_mutex mutex)

Definition at line 162 of file SDL_sysmutex.c.

163{
164 if (mutex == NULL) {
165 return SDL_SetError("Passed a NULL mutex");
166 }
167
168#if FAKE_RECURSIVE_MUTEX
169 /* We can only unlock the mutex if we own it */
170 if (pthread_self() == mutex->owner) {
171 if (mutex->recursive) {
172 --mutex->recursive;
173 } else {
174 /* The order of operations is important.
175 First reset the owner so another thread doesn't lock
176 the mutex and set the ownership before we reset it,
177 then release the lock semaphore.
178 */
179 mutex->owner = 0;
180 pthread_mutex_unlock(&mutex->id);
181 }
182 } else {
183 return SDL_SetError("mutex not owned by this thread");
184 }
185
186#else
187 if (pthread_mutex_unlock(&mutex->id) != 0) {
188 return SDL_SetError("pthread_mutex_unlock() failed");
189 }
190#endif /* FAKE_RECURSIVE_MUTEX */
191
192 return 0;
193}

References SDL_mutex::id, mutex, NULL, SDL_mutex::owner, SDL_mutex::recursive, and SDL_SetError.