SDL 2.0
SDL_syscond.cpp File Reference
#include "../../SDL_internal.h"
#include "SDL_thread.h"
#include <chrono>
#include <condition_variable>
#include <ratio>
#include <system_error>
#include "SDL_sysmutex_c.h"
+ Include dependency graph for SDL_syscond.cpp:

Go to the source code of this file.

Data Structures

struct  SDL_cond
 

Functions

SDL_condSDL_CreateCond (void)
 
void SDL_DestroyCond (SDL_cond *cond)
 
int SDL_CondSignal (SDL_cond *cond)
 
int SDL_CondBroadcast (SDL_cond *cond)
 
int SDL_CondWaitTimeout (SDL_cond *cond, SDL_mutex *mutex, Uint32 ms)
 
int SDL_CondWait (SDL_cond *cond, SDL_mutex *mutex)
 

Function Documentation

◆ SDL_CondBroadcast()

int SDL_CondBroadcast ( SDL_cond cond)

Restart all threads that are waiting on the condition variable.

Returns
0 or -1 on error.

Definition at line 84 of file SDL_syscond.cpp.

85{
86 if (!cond) {
87 SDL_SetError("Passed a NULL condition variable");
88 return -1;
89 }
90
91 cond->cpp_cond.notify_all();
92 return 0;
93}
#define SDL_SetError
std::condition_variable_any cpp_cond
Definition: SDL_syscond.cpp:36

References SDL_cond::cpp_cond, i, SDL_cond::lock, SDL_LockMutex, SDL_SemPost, SDL_SemWait, SDL_SetError, SDL_UnlockMutex, SDL_cond::signals, SDL_cond::wait_done, SDL_cond::wait_sem, and SDL_cond::waiting.

◆ SDL_CondSignal()

int SDL_CondSignal ( SDL_cond cond)

Restart one of the threads that are waiting on the condition variable.

Returns
0 or -1 on error.

Definition at line 70 of file SDL_syscond.cpp.

71{
72 if (!cond) {
73 SDL_SetError("Passed a NULL condition variable");
74 return -1;
75 }
76
77 cond->cpp_cond.notify_one();
78 return 0;
79}

References SDL_cond::cpp_cond, SDL_cond::lock, SDL_LockMutex, SDL_SemPost, SDL_SemWait, SDL_SetError, SDL_UnlockMutex, SDL_cond::signals, SDL_cond::wait_done, SDL_cond::wait_sem, and SDL_cond::waiting.

◆ SDL_CondWait()

int SDL_CondWait ( SDL_cond cond,
SDL_mutex mutex 
)

Wait on the condition variable, unlocking the provided mutex.

Warning
The mutex must be locked before entering this function!

The mutex is re-locked once the condition variable is signaled.

Returns
0 when it is signaled, or -1 on error.

Definition at line 159 of file SDL_syscond.cpp.

160{
162}
#define SDL_MUTEX_MAXWAIT
Definition: SDL_mutex.h:49
int SDL_CondWaitTimeout(SDL_cond *cond, SDL_mutex *mutex, Uint32 ms)
static SDL_mutex * mutex
Definition: testlock.c:23

References mutex, SDL_CondWaitTimeout(), and SDL_MUTEX_MAXWAIT.

◆ SDL_CondWaitTimeout()

int SDL_CondWaitTimeout ( SDL_cond cond,
SDL_mutex mutex,
Uint32  ms 
)

Waits for at most 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.

Warning
On some platforms this function is implemented by looping with a delay of 1 ms, and so should be avoided if possible.

Definition at line 118 of file SDL_syscond.cpp.

119{
120 if (!cond) {
121 SDL_SetError("Passed a NULL condition variable");
122 return -1;
123 }
124
125 if (!mutex) {
126 SDL_SetError("Passed a NULL mutex variable");
127 return -1;
128 }
129
130 try {
131 std::unique_lock<std::recursive_mutex> cpp_lock(mutex->cpp_mutex, std::adopt_lock_t());
132 if (ms == SDL_MUTEX_MAXWAIT) {
133 cond->cpp_cond.wait(
134 cpp_lock
135 );
136 cpp_lock.release();
137 return 0;
138 } else {
139 auto wait_result = cond->cpp_cond.wait_for(
140 cpp_lock,
141 std::chrono::duration<Uint32, std::milli>(ms)
142 );
143 cpp_lock.release();
144 if (wait_result == std::cv_status::timeout) {
145 return SDL_MUTEX_TIMEDOUT;
146 } else {
147 return 0;
148 }
149 }
150 } catch (std::system_error & ex) {
151 SDL_SetError("unable to wait on a C++ condition variable: code=%d; %s", ex.code(), ex.what());
152 return -1;
153 }
154}
#define SDL_MUTEX_TIMEDOUT
Definition: SDL_mutex.h:44
GLbitfield GLuint64 timeout
std::recursive_mutex cpp_mutex

References SDL_cond::cpp_cond, SDL_mutex::cpp_mutex, SDL_cond::lock, mutex, retval, SDL_LockMutex, SDL_MUTEX_MAXWAIT, SDL_MUTEX_TIMEDOUT, SDL_SemPost, SDL_SemWait, SDL_SemWaitTimeout, SDL_SetError, SDL_UnlockMutex, SDL_cond::signals, SDL_cond::wait_done, SDL_cond::wait_sem, and SDL_cond::waiting.

Referenced by SDL_CondWait().

◆ SDL_CreateCond()

SDL_cond * SDL_CreateCond ( void  )

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.

Definition at line 42 of file SDL_syscond.cpp.

43{
44 /* Allocate and initialize the condition variable */
45 try {
46 SDL_cond * cond = new SDL_cond;
47 return cond;
48 } catch (std::system_error & ex) {
49 SDL_SetError("unable to create a C++ condition variable: code=%d; %s", ex.code(), ex.what());
50 return NULL;
51 } catch (std::bad_alloc &) {
53 return NULL;
54 }
55}
#define SDL_OutOfMemory()
Definition: SDL_error.h:52
#define NULL
Definition: begin_code.h:167

References SDL_cond::lock, NULL, SDL_CreateMutex, SDL_CreateSemaphore, SDL_DestroyCond(), SDL_malloc, SDL_OutOfMemory, SDL_SetError, SDL_cond::signals, SDL_cond::wait_done, SDL_cond::wait_sem, and SDL_cond::waiting.

◆ SDL_DestroyCond()

void SDL_DestroyCond ( SDL_cond cond)

Destroy a condition variable.

Definition at line 60 of file SDL_syscond.cpp.

61{
62 if (cond) {
63 delete cond;
64 }
65}

References SDL_cond::lock, SDL_DestroyMutex, SDL_DestroySemaphore, SDL_free, SDL_cond::wait_done, and SDL_cond::wait_sem.