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_mutex * | SDL_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.

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

{
SDL_mutex *mutex;
pthread_mutexattr_t attr;
/* Allocate the structure */
mutex = (SDL_mutex *) SDL_calloc(1, sizeof(*mutex));
if (mutex) {
pthread_mutexattr_init(&attr);
#if SDL_THREAD_PTHREAD_RECURSIVE_MUTEX
pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
#elif SDL_THREAD_PTHREAD_RECURSIVE_MUTEX_NP
pthread_mutexattr_setkind_np(&attr, PTHREAD_MUTEX_RECURSIVE_NP);
#else
/* No extra attributes necessary */
#endif
if (pthread_mutex_init(&mutex->id, &attr) != 0) {
SDL_SetError("pthread_mutex_init() failed");
SDL_free(mutex);
mutex = NULL;
}
} else {
SDL_OutOfMemory();
}
return (mutex);
}
mutex
static SDL_mutex * mutex
Definition: testlock.c:23
SDL_mutex
Definition: SDL_sysmutex.c:29
SDL_free
#define SDL_free
Definition: SDL_dynapi_overrides.h:377
NULL
#define NULL
Definition: begin_code.h:164
SDL_OutOfMemory
#define SDL_OutOfMemory()
Definition: SDL_error.h:52
SDL_SetError
#define SDL_SetError
Definition: SDL_dynapi_overrides.h:30
SDL_calloc
#define SDL_calloc
Definition: SDL_dynapi_overrides.h:375
SDL_mutex::id
pthread_mutex_t id
Definition: SDL_sysmutex.c:35

## SDL_DestroyMutex()

void SDL_DestroyMutex | ( | SDL_mutex * | mutex | ) |

Destroy a mutex.

Definition at line 71 of file SDL_sysmutex.c.

References SDL_mutex::id, and SDL_free.

{
if (mutex) {
pthread_mutex_destroy(&mutex->id);
SDL_free(mutex);
}
}
SDL_free
#define SDL_free
Definition: SDL_dynapi_overrides.h:377
SDL_mutex::id
pthread_mutex_t id
Definition: SDL_sysmutex.c:35

## SDL_LockMutex()

int SDL_LockMutex | ( | SDL_mutex * | mutex | ) |

Definition at line 81 of file SDL_sysmutex.c.

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

{
#if FAKE_RECURSIVE_MUTEX
pthread_t this_thread;
#endif
if (mutex == NULL) {
return SDL_SetError("Passed a NULL mutex");
}
#if FAKE_RECURSIVE_MUTEX
this_thread = pthread_self();
if (mutex->owner == this_thread) {
++mutex->recursive;
} else {
/* The order of operations is important.
We set the locking thread id after we obtain the lock
so unlocks from other threads will fail.
*/
if (pthread_mutex_lock(&mutex->id) == 0) {
mutex->owner = this_thread;
mutex->recursive = 0;
} else {
return SDL_SetError("pthread_mutex_lock() failed");
}
}
#else
if (pthread_mutex_lock(&mutex->id) != 0) {
return SDL_SetError("pthread_mutex_lock() failed");
}
#endif
return 0;
}
NULL
#define NULL
Definition: begin_code.h:164
SDL_SetError
#define SDL_SetError
Definition: SDL_dynapi_overrides.h:30
SDL_mutex::owner
SDL_threadID owner
Definition: SDL_sysmutex.c:32
SDL_mutex::recursive
int recursive
Definition: SDL_sysmutex.c:31
SDL_mutex::id
pthread_mutex_t id
Definition: SDL_sysmutex.c:35

## 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.

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

{
int retval;
#if FAKE_RECURSIVE_MUTEX
pthread_t this_thread;
#endif
if (mutex == NULL) {
return SDL_SetError("Passed a NULL mutex");
}
retval = 0;
#if FAKE_RECURSIVE_MUTEX
this_thread = pthread_self();
if (mutex->owner == this_thread) {
++mutex->recursive;
} else {
/* The order of operations is important.
We set the locking thread id after we obtain the lock
so unlocks from other threads will fail.
*/
if (pthread_mutex_trylock(&mutex->id) == 0) {
mutex->owner = this_thread;
mutex->recursive = 0;
} else if (errno == EBUSY) {
retval = SDL_MUTEX_TIMEDOUT;
} else {
retval = SDL_SetError("pthread_mutex_trylock() failed");
}
}
#else
if (pthread_mutex_trylock(&mutex->id) != 0) {
if (errno == EBUSY) {
retval = SDL_MUTEX_TIMEDOUT;
} else {
retval = SDL_SetError("pthread_mutex_trylock() failed");
}
}
#endif
return retval;
}
SDL_MUTEX_TIMEDOUT
#define SDL_MUTEX_TIMEDOUT
Definition: SDL_mutex.h:44
retval
SDL_bool retval
Definition: testgamecontroller.c:65
NULL
#define NULL
Definition: begin_code.h:164
SDL_SetError
#define SDL_SetError
Definition: SDL_dynapi_overrides.h:30
SDL_mutex::owner
SDL_threadID owner
Definition: SDL_sysmutex.c:32
SDL_mutex::recursive
int recursive
Definition: SDL_sysmutex.c:31
SDL_mutex::id
pthread_mutex_t id
Definition: SDL_sysmutex.c:35

## SDL_UnlockMutex()

int SDL_UnlockMutex | ( | SDL_mutex * | mutex | ) |

Definition at line 159 of file SDL_sysmutex.c.

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

{
if (mutex == NULL) {
return SDL_SetError("Passed a NULL mutex");
}
#if FAKE_RECURSIVE_MUTEX
/* We can only unlock the mutex if we own it */
if (pthread_self() == mutex->owner) {
if (mutex->recursive) {
--mutex->recursive;
} else {
/* The order of operations is important.
First reset the owner so another thread doesn't lock
the mutex and set the ownership before we reset it,
then release the lock semaphore.
*/
mutex->owner = 0;
pthread_mutex_unlock(&mutex->id);
}
} else {
return SDL_SetError("mutex not owned by this thread");
}
#else
if (pthread_mutex_unlock(&mutex->id) != 0) {
return SDL_SetError("pthread_mutex_unlock() failed");
}
#endif /* FAKE_RECURSIVE_MUTEX */
return 0;
}
NULL
#define NULL
Definition: begin_code.h:164
SDL_SetError
#define SDL_SetError
Definition: SDL_dynapi_overrides.h:30
SDL_mutex::owner
SDL_threadID owner
Definition: SDL_sysmutex.c:32
SDL_mutex::recursive
int recursive
Definition: SDL_sysmutex.c:31
SDL_mutex::id
pthread_mutex_t id
Definition: SDL_sysmutex.c:35