SDL_sysmutex.c File Reference
`#include "../../SDL_internal.h"`
`#include "SDL_thread.h"`
`#include "SDL_systhread_c.h"`
Include dependency graph for SDL_sysmutex.c:

Go to the source code of this file.

## Data Structures

struct | SDL_mutex

## 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_mutexV (SDL_mutex *mutex)

## Function Documentation

## SDL_CreateMutex()

SDL_mutex* SDL_CreateMutex | ( | void |  | ) |

Create a mutex, initialized unlocked.

Definition at line 38 of file SDL_sysmutex.c.

{
SDL_mutex *mutex;
/* Allocate mutex memory */
mutex = (SDL_mutex *) SDL_malloc(sizeof(*mutex));
if (mutex) {
/* Create the mutex semaphore, with initial value 1 */
mutex->sem = SDL_CreateSemaphore(1);
mutex->recursive = 0;
mutex->owner = 0;
if (!mutex->sem) {
SDL_free(mutex);
mutex = NULL;
}
} else {
SDL_OutOfMemory();
}
return mutex;
}

References mutex, NULL, SDL_mutex::owner, SDL_mutex::recursive, SDL_CreateSemaphore, SDL_free, SDL_malloc, SDL_OutOfMemory, and SDL_mutex::sem.

## SDL_DestroyMutex()

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

Destroy a mutex.

Definition at line 61 of file SDL_sysmutex.c.

{
if (mutex) {
if (mutex->sem) {
SDL_DestroySemaphore(mutex->sem);
}
SDL_free(mutex);
}
}

References mutex, SDL_DestroySemaphore, SDL_free, and SDL_mutex::sem.

## SDL_LockMutex()

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

Definition at line 73 of file SDL_sysmutex.c.

{
#if SDL_THREADS_DISABLED
return 0;
#else
SDL_threadID this_thread;
if (mutex == NULL) {
return SDL_SetError("Passed a NULL mutex");
}
this_thread = SDL_ThreadID();
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.
*/
SDL_SemWait(mutex->sem);
mutex->owner = this_thread;
mutex->recursive = 0;
}
return 0;
#endif /* SDL_THREADS_DISABLED */
}

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

## SDL_mutexV()

int SDL_mutexV | ( | SDL_mutex * | mutex | ) |

Definition at line 136 of file SDL_sysmutex.c.

{
#if SDL_THREADS_DISABLED
return 0;
#else
if (mutex == NULL) {
return SDL_SetError("Passed a NULL mutex");
}
/* If we don't own the mutex, we can't unlock it */
if (SDL_ThreadID() != mutex->owner) {
return SDL_SetError("mutex not owned by this thread");
}
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;
SDL_SemPost(mutex->sem);
}
return 0;
#endif /* SDL_THREADS_DISABLED */
}

References mutex, NULL, SDL_mutex::owner, SDL_mutex::recursive, SDL_SemPost, 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 103 of file SDL_sysmutex.c.

{
#if SDL_THREADS_DISABLED
return 0;
#else
int retval = 0;
SDL_threadID this_thread;
if (mutex == NULL) {
return SDL_SetError("Passed a NULL mutex");
}
this_thread = SDL_ThreadID();
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.
*/
retval = SDL_SemWait(mutex->sem);
if (retval == 0) {
mutex->owner = this_thread;
mutex->recursive = 0;
}
}
return retval;
#endif /* SDL_THREADS_DISABLED */
}

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

SDL_CreateSemaphore
#define SDL_CreateSemaphore
Definition: SDL_dynapi_overrides.h:264
NULL
#define NULL
Definition: begin_code.h:167
SDL_mutex
Definition: SDL_sysmutex.c:29
mutex
static SDL_mutex * mutex
Definition: testlock.c:23
SDL_SemPost
#define SDL_SemPost
Definition: SDL_dynapi_overrides.h:269
retval
SDL_bool retval
Definition: testgamecontroller.c:65
SDL_free
#define SDL_free
Definition: SDL_dynapi_overrides.h:377
SDL_OutOfMemory
#define SDL_OutOfMemory()
Definition: SDL_error.h:52
SDL_mutex::sem
SDL_sem * sem
Definition: SDL_sysmutex.c:33
SDL_mutex::owner
SDL_threadID owner
Definition: SDL_sysmutex.c:32
SDL_threadID
unsigned long SDL_threadID
Definition: SDL_thread.h:49
SDL_SemWait
#define SDL_SemWait
Definition: SDL_dynapi_overrides.h:266
SDL_SetError
#define SDL_SetError
Definition: SDL_dynapi_overrides.h:30
SDL_mutex::recursive
int recursive
Definition: SDL_sysmutex.c:31
SDL_DestroySemaphore
#define SDL_DestroySemaphore
Definition: SDL_dynapi_overrides.h:265
SDL_malloc
#define SDL_malloc
Definition: SDL_dynapi_overrides.h:374
SDL_ThreadID
#define SDL_ThreadID
Definition: SDL_dynapi_overrides.h:475