SDL  2.0
SDL_syscond.c File Reference
#include "../../SDL_internal.h"
#include <sys/time.h>
#include <time.h>
#include <unistd.h>
#include <errno.h>
#include <pthread.h>
#include "SDL_thread.h"
#include "SDL_sysmutex_c.h"
+ Include dependency graph for SDL_syscond.c:

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 83 of file SDL_syscond.c.

References SDL_cond::cond, retval, and SDL_SetError.

84 {
85  int retval;
86 
87  if (!cond) {
88  return SDL_SetError("Passed a NULL condition variable");
89  }
90 
91  retval = 0;
92  if (pthread_cond_broadcast(&cond->cond) != 0) {
93  return SDL_SetError("pthread_cond_broadcast() failed");
94  }
95  return retval;
96 }
SDL_bool retval
pthread_cond_t cond
Definition: SDL_syscond.c:34
#define SDL_SetError

◆ 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 66 of file SDL_syscond.c.

References SDL_cond::cond, retval, and SDL_SetError.

67 {
68  int retval;
69 
70  if (!cond) {
71  return SDL_SetError("Passed a NULL condition variable");
72  }
73 
74  retval = 0;
75  if (pthread_cond_signal(&cond->cond) != 0) {
76  return SDL_SetError("pthread_cond_signal() failed");
77  }
78  return retval;
79 }
SDL_bool retval
pthread_cond_t cond
Definition: SDL_syscond.c:34
#define SDL_SetError

◆ 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 148 of file SDL_syscond.c.

References SDL_cond::cond, SDL_mutex::id, and SDL_SetError.

149 {
150  if (!cond) {
151  return SDL_SetError("Passed a NULL condition variable");
152  } else if (pthread_cond_wait(&cond->cond, &mutex->id) != 0) {
153  return SDL_SetError("pthread_cond_wait() failed");
154  }
155  return 0;
156 }
pthread_cond_t cond
Definition: SDL_syscond.c:34
#define SDL_SetError
pthread_mutex_t id
Definition: SDL_sysmutex.c:35

◆ 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 99 of file SDL_syscond.c.

References SDL_cond::cond, SDL_mutex::id, NULL, retval, SDL_MUTEX_TIMEDOUT, and SDL_SetError.

100 {
101  int retval;
102 #ifndef HAVE_CLOCK_GETTIME
103  struct timeval delta;
104 #endif
105  struct timespec abstime;
106 
107  if (!cond) {
108  return SDL_SetError("Passed a NULL condition variable");
109  }
110 
111 #ifdef HAVE_CLOCK_GETTIME
112  clock_gettime(CLOCK_REALTIME, &abstime);
113 
114  abstime.tv_nsec += (ms % 1000) * 1000000;
115  abstime.tv_sec += ms / 1000;
116 #else
117  gettimeofday(&delta, NULL);
118 
119  abstime.tv_sec = delta.tv_sec + (ms / 1000);
120  abstime.tv_nsec = (delta.tv_usec + (ms % 1000) * 1000) * 1000;
121 #endif
122  if (abstime.tv_nsec > 1000000000) {
123  abstime.tv_sec += 1;
124  abstime.tv_nsec -= 1000000000;
125  }
126 
127  tryagain:
128  retval = pthread_cond_timedwait(&cond->cond, &mutex->id, &abstime);
129  switch (retval) {
130  case EINTR:
131  goto tryagain;
132  /* break; -Wunreachable-code-break */
133  case ETIMEDOUT:
134  retval = SDL_MUTEX_TIMEDOUT;
135  break;
136  case 0:
137  break;
138  default:
139  retval = SDL_SetError("pthread_cond_timedwait() failed");
140  }
141  return retval;
142 }
#define SDL_MUTEX_TIMEDOUT
Definition: SDL_mutex.h:44
SDL_bool retval
pthread_cond_t cond
Definition: SDL_syscond.c:34
#define NULL
Definition: begin_code.h:164
#define SDL_SetError
pthread_mutex_t id
Definition: SDL_sysmutex.c:35

◆ 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 39 of file SDL_syscond.c.

References SDL_cond::cond, NULL, SDL_free, SDL_malloc, and SDL_SetError.

40 {
41  SDL_cond *cond;
42 
43  cond = (SDL_cond *) SDL_malloc(sizeof(SDL_cond));
44  if (cond) {
45  if (pthread_cond_init(&cond->cond, NULL) != 0) {
46  SDL_SetError("pthread_cond_init() failed");
47  SDL_free(cond);
48  cond = NULL;
49  }
50  }
51  return (cond);
52 }
#define SDL_free
pthread_cond_t cond
Definition: SDL_syscond.c:34
#define NULL
Definition: begin_code.h:164
#define SDL_SetError
#define SDL_malloc

◆ SDL_DestroyCond()

void SDL_DestroyCond ( SDL_cond cond)

Destroy a condition variable.

Definition at line 56 of file SDL_syscond.c.

References SDL_cond::cond, and SDL_free.

57 {
58  if (cond) {
59  pthread_cond_destroy(&cond->cond);
60  SDL_free(cond);
61  }
62 }
#define SDL_free
pthread_cond_t cond
Definition: SDL_syscond.c:34