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

Latest commit

 

History

History
217 lines (181 loc) · 4.1 KB

SDL_syssem.c

File metadata and controls

217 lines (181 loc) · 4.1 KB
 
1
2
/*
SDL - Simple DirectMedia Layer
Feb 1, 2006
Feb 1, 2006
3
Copyright (C) 1997-2006 Sam Lantinga
4
5
This library is free software; you can redistribute it and/or
Feb 1, 2006
Feb 1, 2006
6
modify it under the terms of the GNU Lesser General Public
7
License as published by the Free Software Foundation; either
Feb 1, 2006
Feb 1, 2006
8
version 2.1 of the License, or (at your option) any later version.
9
10
11
12
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
Feb 1, 2006
Feb 1, 2006
13
Lesser General Public License for more details.
14
Feb 1, 2006
Feb 1, 2006
15
16
17
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
18
19
20
21
Sam Lantinga
slouken@libsdl.org
*/
Feb 21, 2006
Feb 21, 2006
22
#include "SDL_config.h"
23
Jul 21, 2005
Jul 21, 2005
24
/* RISC OS semiphores based on linux code */
25
26
27
28
29
30
#include "SDL_timer.h"
#include "SDL_thread.h"
#include "SDL_systhread_c.h"
Feb 16, 2006
Feb 16, 2006
31
#if !SDL_THREADS_DISABLED
32
May 28, 2006
May 28, 2006
33
SDL_sem *
May 29, 2006
May 29, 2006
34
SDL_CreateSemaphore(Uint32 initial_value)
35
{
May 29, 2006
May 29, 2006
36
SDL_SetError("SDL not configured with thread support");
May 28, 2006
May 28, 2006
37
return (SDL_sem *) 0;
38
39
}
May 28, 2006
May 28, 2006
40
void
May 29, 2006
May 29, 2006
41
SDL_DestroySemaphore(SDL_sem * sem)
42
{
May 28, 2006
May 28, 2006
43
return;
44
45
}
May 28, 2006
May 28, 2006
46
int
May 29, 2006
May 29, 2006
47
SDL_SemTryWait(SDL_sem * sem)
48
{
May 29, 2006
May 29, 2006
49
SDL_SetError("SDL not configured with thread support");
May 28, 2006
May 28, 2006
50
return -1;
51
52
}
May 28, 2006
May 28, 2006
53
int
May 29, 2006
May 29, 2006
54
SDL_SemWaitTimeout(SDL_sem * sem, Uint32 timeout)
55
{
May 29, 2006
May 29, 2006
56
SDL_SetError("SDL not configured with thread support");
May 28, 2006
May 28, 2006
57
return -1;
58
59
}
May 28, 2006
May 28, 2006
60
int
May 29, 2006
May 29, 2006
61
SDL_SemWait(SDL_sem * sem)
62
{
May 29, 2006
May 29, 2006
63
SDL_SetError("SDL not configured with thread support");
May 28, 2006
May 28, 2006
64
return -1;
65
66
}
May 28, 2006
May 28, 2006
67
Uint32
May 29, 2006
May 29, 2006
68
SDL_SemValue(SDL_sem * sem)
69
{
May 28, 2006
May 28, 2006
70
return 0;
71
72
}
May 28, 2006
May 28, 2006
73
int
May 29, 2006
May 29, 2006
74
SDL_SemPost(SDL_sem * sem)
75
{
May 29, 2006
May 29, 2006
76
SDL_SetError("SDL not configured with thread support");
May 28, 2006
May 28, 2006
77
return -1;
78
79
80
81
}
#else
Jul 21, 2005
Jul 21, 2005
82
May 28, 2006
May 28, 2006
83
#include <unistd.h> /* For getpid() */
Jul 21, 2005
Jul 21, 2005
84
85
86
#include <pthread.h>
#include <semaphore.h>
May 28, 2006
May 28, 2006
87
88
89
90
struct SDL_semaphore
{
sem_t *sem;
sem_t sem_data;
91
92
};
Jul 21, 2005
Jul 21, 2005
93
/* Create a semaphore, initialized with value */
May 28, 2006
May 28, 2006
94
SDL_sem *
May 29, 2006
May 29, 2006
95
SDL_CreateSemaphore(Uint32 initial_value)
96
{
May 29, 2006
May 29, 2006
97
SDL_sem *sem = (SDL_sem *) SDL_malloc(sizeof(SDL_sem));
May 28, 2006
May 28, 2006
98
if (sem) {
May 29, 2006
May 29, 2006
99
100
101
if (sem_init(&sem->sem_data, 0, initial_value) < 0) {
SDL_SetError("sem_init() failed");
SDL_free(sem);
May 28, 2006
May 28, 2006
102
103
104
105
106
sem = NULL;
} else {
sem->sem = &sem->sem_data;
}
} else {
May 29, 2006
May 29, 2006
107
SDL_OutOfMemory();
May 28, 2006
May 28, 2006
108
109
}
return sem;
110
111
}
May 28, 2006
May 28, 2006
112
void
May 29, 2006
May 29, 2006
113
SDL_DestroySemaphore(SDL_sem * sem)
114
{
May 28, 2006
May 28, 2006
115
if (sem) {
May 29, 2006
May 29, 2006
116
117
sem_destroy(sem->sem);
SDL_free(sem);
May 28, 2006
May 28, 2006
118
}
119
120
}
May 28, 2006
May 28, 2006
121
int
May 29, 2006
May 29, 2006
122
SDL_SemTryWait(SDL_sem * sem)
123
{
May 28, 2006
May 28, 2006
124
125
126
int retval;
if (!sem) {
May 29, 2006
May 29, 2006
127
SDL_SetError("Passed a NULL semaphore");
May 28, 2006
May 28, 2006
128
129
130
return -1;
}
retval = SDL_MUTEX_TIMEDOUT;
May 29, 2006
May 29, 2006
131
if (sem_trywait(sem->sem) == 0) {
May 28, 2006
May 28, 2006
132
133
134
retval = 0;
}
return retval;
Jul 21, 2005
Jul 21, 2005
135
136
}
May 28, 2006
May 28, 2006
137
int
May 29, 2006
May 29, 2006
138
SDL_SemWait(SDL_sem * sem)
Jul 21, 2005
Jul 21, 2005
139
{
May 28, 2006
May 28, 2006
140
141
142
int retval;
if (!sem) {
May 29, 2006
May 29, 2006
143
SDL_SetError("Passed a NULL semaphore");
May 28, 2006
May 28, 2006
144
145
146
return -1;
}
May 29, 2006
May 29, 2006
147
retval = sem_wait(sem->sem);
May 28, 2006
May 28, 2006
148
if (retval < 0) {
May 29, 2006
May 29, 2006
149
SDL_SetError("sem_wait() failed");
May 28, 2006
May 28, 2006
150
151
}
return retval;
152
153
}
May 28, 2006
May 28, 2006
154
int
May 29, 2006
May 29, 2006
155
SDL_SemWaitTimeout(SDL_sem * sem, Uint32 timeout)
156
{
May 28, 2006
May 28, 2006
157
158
159
int retval;
if (!sem) {
May 29, 2006
May 29, 2006
160
SDL_SetError("Passed a NULL semaphore");
May 28, 2006
May 28, 2006
161
162
163
164
165
return -1;
}
/* Try the easy cases first */
if (timeout == 0) {
May 29, 2006
May 29, 2006
166
return SDL_SemTryWait(sem);
May 28, 2006
May 28, 2006
167
168
}
if (timeout == SDL_MUTEX_MAXWAIT) {
May 29, 2006
May 29, 2006
169
return SDL_SemWait(sem);
May 28, 2006
May 28, 2006
170
171
172
}
/* Ack! We have to busy wait... */
May 29, 2006
May 29, 2006
173
timeout += SDL_GetTicks();
May 28, 2006
May 28, 2006
174
do {
May 29, 2006
May 29, 2006
175
retval = SDL_SemTryWait(sem);
May 28, 2006
May 28, 2006
176
177
178
if (retval == 0) {
break;
}
May 29, 2006
May 29, 2006
179
SDL_Delay(1);
May 28, 2006
May 28, 2006
180
}
May 29, 2006
May 29, 2006
181
while (SDL_GetTicks() < timeout);
May 28, 2006
May 28, 2006
182
183
return retval;
184
185
}
May 28, 2006
May 28, 2006
186
Uint32
May 29, 2006
May 29, 2006
187
SDL_SemValue(SDL_sem * sem)
188
{
May 28, 2006
May 28, 2006
189
190
int ret = 0;
if (sem) {
May 29, 2006
May 29, 2006
191
sem_getvalue(sem->sem, &ret);
May 28, 2006
May 28, 2006
192
193
194
195
196
if (ret < 0) {
ret = 0;
}
}
return (Uint32) ret;
197
198
}
May 28, 2006
May 28, 2006
199
int
May 29, 2006
May 29, 2006
200
SDL_SemPost(SDL_sem * sem)
201
{
May 28, 2006
May 28, 2006
202
203
204
int retval;
if (!sem) {
May 29, 2006
May 29, 2006
205
SDL_SetError("Passed a NULL semaphore");
May 28, 2006
May 28, 2006
206
207
208
return -1;
}
May 29, 2006
May 29, 2006
209
retval = sem_post(sem->sem);
May 28, 2006
May 28, 2006
210
if (retval < 0) {
May 29, 2006
May 29, 2006
211
SDL_SetError("sem_post() failed");
May 28, 2006
May 28, 2006
212
213
}
return retval;
214
215
}
Feb 16, 2006
Feb 16, 2006
216
#endif /* !SDL_THREADS_DISABLED */
May 28, 2006
May 28, 2006
217
/* vi: set ts=4 sw=4 expandtab: */