This repository has been archived by the owner on Feb 11, 2021. It is now read-only.
/
SDL_syssem.c
154 lines (118 loc) · 2.99 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
#include "SDL_config.h"
23
24
/* An implementation of semaphores using mutexes and condition variables */
25
26
27
28
29
30
31
#include "SDL_thread.h"
#include "SDL_systhread_c.h"
struct SDL_semaphore
{
32
struct SignalSemaphore Sem;
33
34
};
35
#undef D
36
37
38
#define D(x)
39
SDL_sem *
40
SDL_CreateSemaphore(Uint32 initial_value)
41
{
42
SDL_sem *sem;
43
44
sem = (SDL_sem *) SDL_malloc(sizeof(*sem));
45
46
if (!sem) {
47
SDL_OutOfMemory();
48
49
return (0);
}
50
51
D(bug("Creating semaphore %lx...\n", sem));
52
53
SDL_memset(sem, 0, sizeof(*sem));
54
55
InitSemaphore(&sem->Sem);
56
57
return (sem);
58
59
}
60
void
61
SDL_DestroySemaphore(SDL_sem * sem)
62
{
63
D(bug("Destroying semaphore %lx...\n", sem));
64
65
if (sem) {
66
// Condizioni per liberare i task in attesa?
67
SDL_free(sem);
68
}
69
70
}
71
int
72
SDL_SemTryWait(SDL_sem * sem)
73
{
74
if (!sem) {
75
SDL_SetError("Passed a NULL semaphore");
76
77
return -1;
}
78
79
D(bug("TryWait semaphore...%lx\n", sem));
80
81
ObtainSemaphore(&sem->Sem);
82
// ReleaseSemaphore(&sem->Sem);
83
84
return 1;
85
86
}
87
int
88
SDL_SemWaitTimeout(SDL_sem * sem, Uint32 timeout)
89
{
90
91
92
93
int retval;
if (!sem) {
94
SDL_SetError("Passed a NULL semaphore");
95
96
97
return -1;
}
98
D(bug("WaitTimeout (%ld) semaphore...%lx\n", timeout, sem));
99
100
101
/* A timeout of 0 is an easy case */
if (timeout == 0) {
102
ObtainSemaphore(&sem->Sem);
103
104
return 1;
}
105
106
107
if (!(retval = AttemptSemaphore(&sem->Sem))) {
SDL_Delay(timeout);
retval = AttemptSemaphore(&sem->Sem);
108
109
110
111
112
113
114
115
}
if (retval == TRUE) {
// ReleaseSemaphore(&sem->Sem);
retval = 1;
}
return retval;
116
117
}
118
int
119
SDL_SemWait(SDL_sem * sem)
120
{
121
ObtainSemaphore(&sem->Sem);
122
return 0;
123
124
}
125
Uint32
126
SDL_SemValue(SDL_sem * sem)
127
{
128
129
130
131
132
133
134
135
136
137
138
Uint32 value;
value = 0;
if (sem) {
#ifdef STORMC4_WOS
value = sem->Sem.ssppc_SS.ss_NestCount;
#else
value = sem->Sem.ss_NestCount;
#endif
}
return value;
139
140
}
141
int
142
SDL_SemPost(SDL_sem * sem)
143
{
144
if (!sem) {
145
SDL_SetError("Passed a NULL semaphore");
146
147
return -1;
}
148
D(bug("SemPost semaphore...%lx\n", sem));
149
150
ReleaseSemaphore(&sem->Sem);
151
return 0;
152
153
}
154
/* vi: set ts=4 sw=4 expandtab: */