Skip to content
This repository has been archived by the owner on Feb 11, 2021. It is now read-only.

Latest commit

 

History

History
173 lines (142 loc) · 3.75 KB

SDL_syscond.c

File metadata and controls

173 lines (142 loc) · 3.75 KB
 
Feb 21, 2006
Feb 21, 2006
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/*
SDL - Simple DirectMedia Layer
Copyright (C) 1997-2006 Sam Lantinga
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Sam Lantinga
slouken@libsdl.org
*/
#include "SDL_config.h"
24
25
26
27
28
29
30
31
32
33
34
/*
* GNU pth conditions variables
*
* Patrice Mandin
*/
#include <pth.h>
#include "SDL_thread.h"
#include "SDL_sysmutex_c.h"
Feb 16, 2006
Feb 16, 2006
35
36
struct SDL_cond
{
May 28, 2006
May 28, 2006
37
pth_cond_t condpth_p;
Feb 16, 2006
Feb 16, 2006
38
39
};
40
/* Create a condition variable */
May 28, 2006
May 28, 2006
41
SDL_cond *
May 29, 2006
May 29, 2006
42
SDL_CreateCond(void)
May 28, 2006
May 28, 2006
44
45
SDL_cond *cond;
May 29, 2006
May 29, 2006
46
cond = (SDL_cond *) SDL_malloc(sizeof(SDL_cond));
May 28, 2006
May 28, 2006
47
if (cond) {
May 29, 2006
May 29, 2006
48
49
50
if (pth_cond_init(&(cond->condpth_p)) < 0) {
SDL_SetError("pthread_cond_init() failed");
SDL_free(cond);
May 28, 2006
May 28, 2006
51
52
53
cond = NULL;
}
} else {
May 29, 2006
May 29, 2006
54
SDL_OutOfMemory();
May 28, 2006
May 28, 2006
55
56
}
return (cond);
57
58
59
}
/* Destroy a condition variable */
May 28, 2006
May 28, 2006
60
void
May 29, 2006
May 29, 2006
61
SDL_DestroyCond(SDL_cond * cond)
May 28, 2006
May 28, 2006
63
if (cond) {
May 29, 2006
May 29, 2006
64
SDL_free(cond);
May 28, 2006
May 28, 2006
65
}
66
67
68
}
/* Restart one of the threads that are waiting on the condition variable */
May 28, 2006
May 28, 2006
69
int
May 29, 2006
May 29, 2006
70
SDL_CondSignal(SDL_cond * cond)
May 28, 2006
May 28, 2006
72
73
74
int retval;
if (!cond) {
May 29, 2006
May 29, 2006
75
SDL_SetError("Passed a NULL condition variable");
May 28, 2006
May 28, 2006
76
77
78
79
return -1;
}
retval = 0;
May 29, 2006
May 29, 2006
80
81
if (pth_cond_notify(&(cond->condpth_p), FALSE) != 0) {
SDL_SetError("pth_cond_notify() failed");
May 28, 2006
May 28, 2006
82
83
84
retval = -1;
}
return retval;
85
86
87
}
/* Restart all threads that are waiting on the condition variable */
May 28, 2006
May 28, 2006
88
int
May 29, 2006
May 29, 2006
89
SDL_CondBroadcast(SDL_cond * cond)
May 28, 2006
May 28, 2006
91
92
93
int retval;
if (!cond) {
May 29, 2006
May 29, 2006
94
SDL_SetError("Passed a NULL condition variable");
May 28, 2006
May 28, 2006
95
96
97
98
return -1;
}
retval = 0;
May 29, 2006
May 29, 2006
99
100
if (pth_cond_notify(&(cond->condpth_p), TRUE) != 0) {
SDL_SetError("pth_cond_notify() failed");
May 28, 2006
May 28, 2006
101
102
103
retval = -1;
}
return retval;
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
}
/* Wait on the condition variable for at most 'ms' milliseconds.
The mutex must be locked before entering this function!
The mutex is unlocked during the wait, and locked again after the wait.
Typical use:
Thread A:
SDL_LockMutex(lock);
while ( ! condition ) {
SDL_CondWait(cond);
}
SDL_UnlockMutex(lock);
Thread B:
SDL_LockMutex(lock);
...
condition = true;
...
SDL_UnlockMutex(lock);
*/
May 28, 2006
May 28, 2006
126
int
May 29, 2006
May 29, 2006
127
SDL_CondWaitTimeout(SDL_cond * cond, SDL_mutex * mutex, Uint32 ms)
128
{
May 28, 2006
May 28, 2006
129
130
131
int retval;
pth_event_t ev;
int sec;
132
May 28, 2006
May 28, 2006
133
if (!cond) {
May 29, 2006
May 29, 2006
134
SDL_SetError("Passed a NULL condition variable");
May 28, 2006
May 28, 2006
135
136
return -1;
}
137
May 28, 2006
May 28, 2006
138
retval = 0;
139
May 28, 2006
May 28, 2006
140
sec = ms / 1000;
May 29, 2006
May 29, 2006
141
142
ev = pth_event(PTH_EVENT_TIME,
pth_timeout(sec, (ms - sec * 1000) * 1000));
143
May 29, 2006
May 29, 2006
144
145
if (pth_cond_await(&(cond->condpth_p), &(mutex->mutexpth_p), ev) != 0) {
SDL_SetError("pth_cond_await() failed");
May 28, 2006
May 28, 2006
146
147
retval = -1;
}
148
May 29, 2006
May 29, 2006
149
pth_event_free(ev, PTH_FREE_ALL);
150
May 28, 2006
May 28, 2006
151
return retval;
152
153
154
}
/* Wait on the condition variable forever */
May 28, 2006
May 28, 2006
155
int
May 29, 2006
May 29, 2006
156
SDL_CondWait(SDL_cond * cond, SDL_mutex * mutex)
157
{
May 28, 2006
May 28, 2006
158
159
160
int retval;
if (!cond) {
May 29, 2006
May 29, 2006
161
SDL_SetError("Passed a NULL condition variable");
May 28, 2006
May 28, 2006
162
163
164
165
return -1;
}
retval = 0;
May 29, 2006
May 29, 2006
166
167
if (pth_cond_await(&(cond->condpth_p), &(mutex->mutexpth_p), NULL) != 0) {
SDL_SetError("pth_cond_await() failed");
May 28, 2006
May 28, 2006
168
169
170
retval = -1;
}
return retval;
171
}
May 28, 2006
May 28, 2006
172
173
/* vi: set ts=4 sw=4 expandtab: */