/
SDL_syssem.c
173 lines (137 loc) · 3.36 KB
1
2
/*
SDL - Simple DirectMedia Layer
3
Copyright (C) 1997-2006 Sam Lantinga
4
5
This library is free software; you can redistribute it and/or
6
modify it under the terms of the GNU Lesser General Public
7
License as published by the Free Software Foundation; either
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
13
Lesser General Public License for more details.
14
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
Sam Lantinga
20
slouken@libsdl.org
21
22
*/
23
/* An implementation of semaphores using mutexes and condition variables */
24
25
26
27
28
29
30
31
32
#include "SDL_error.h"
#include "SDL_thread.h"
#include "SDL_systhread_c.h"
struct SDL_semaphore
{
struct SignalSemaphore Sem;
33
34
35
36
Uint32 count;
Uint32 waiters_count;
SDL_mutex *count_lock;
SDL_cond *count_nonzero;
37
38
};
39
#undef D
40
41
42
43
44
45
46
47
#define D(x)
SDL_sem *SDL_CreateSemaphore(Uint32 initial_value)
{
SDL_sem *sem;
sem = (SDL_sem *)malloc(sizeof(*sem));
48
49
50
51
52
53
54
55
if ( ! sem ) {
SDL_OutOfMemory();
return(0);
}
D(bug("Creating semaphore %lx...\n",sem));
56
57
memset(sem,0,sizeof(*sem));
58
InitSemaphore(&sem->Sem);
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
return(sem);
}
void SDL_DestroySemaphore(SDL_sem *sem)
{
D(bug("Destroying semaphore %lx...\n",sem));
if ( sem ) {
// Condizioni per liberare i task in attesa?
free(sem);
}
}
int SDL_SemTryWait(SDL_sem *sem)
{
if ( ! sem ) {
SDL_SetError("Passed a NULL semaphore");
return -1;
}
D(bug("TryWait semaphore...%lx\n",sem));
82
83
84
85
ObtainSemaphore(&sem->Sem);
// ReleaseSemaphore(&sem->Sem);
return 1;
86
87
88
89
90
91
}
int SDL_SemWaitTimeout(SDL_sem *sem, Uint32 timeout)
{
int retval;
92
93
94
95
96
97
98
99
if ( ! sem ) {
SDL_SetError("Passed a NULL semaphore");
return -1;
}
D(bug("WaitTimeout (%ld) semaphore...%lx\n",timeout,sem));
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
/* A timeout of 0 is an easy case */
if ( timeout == 0 ) {
return SDL_SemTryWait(sem);
}
/*
SDL_LockMutex(sem->count_lock);
++sem->waiters_count;
retval = 0;
while ( (sem->count == 0) && (retval != SDL_MUTEX_TIMEDOUT) ) {
retval = SDL_CondWaitTimeout(sem->count_nonzero,
sem->count_lock, timeout);
}
--sem->waiters_count;
--sem->count;
SDL_UnlockMutex(sem->count_lock);
*/
116
117
118
119
120
121
122
123
124
125
126
if(!(retval=AttemptSemaphore(&sem->Sem)))
{
SDL_Delay(timeout);
retval=AttemptSemaphore(&sem->Sem);
}
if(retval==TRUE)
{
// ReleaseSemaphore(&sem->Sem);
retval=1;
}
127
128
129
130
131
132
133
return retval;
}
int SDL_SemWait(SDL_sem *sem)
{
ObtainSemaphore(&sem->Sem);
134
135
return 0;
// return SDL_SemWaitTimeout(sem, SDL_MUTEX_MAXWAIT);
136
137
138
139
140
}
Uint32 SDL_SemValue(SDL_sem *sem)
{
Uint32 value;
141
142
143
value = 0;
if ( sem ) {
144
145
146
#ifdef STORMC4_WOS
value = sem->Sem.ssppc_SS.ss_NestCount;
#else
147
value = sem->Sem.ss_NestCount;
148
#endif
149
// SDL_UnlockMutex(sem->count_lock);
150
151
152
153
154
155
156
157
158
159
160
161
162
}
return value;
}
int SDL_SemPost(SDL_sem *sem)
{
if ( ! sem ) {
SDL_SetError("Passed a NULL semaphore");
return -1;
}
D(bug("SemPost semaphore...%lx\n",sem));
ReleaseSemaphore(&sem->Sem);
163
164
165
166
167
168
169
170
#if 0
SDL_LockMutex(sem->count_lock);
if ( sem->waiters_count > 0 ) {
SDL_CondSignal(sem->count_nonzero);
}
++sem->count;
SDL_UnlockMutex(sem->count_lock);
#endif
171
172
return 0;
}