This repository has been archived by the owner on Feb 11, 2021. It is now read-only.
/
SDL_syssem.c
154 lines (118 loc) · 3.03 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
40
SDL_sem *
SDL_CreateSemaphore (Uint32 initial_value)
41
{
42
SDL_sem *sem;
43
44
sem = (SDL_sem *) SDL_malloc (sizeof (*sem));
45
46
47
48
49
if (!sem) {
SDL_OutOfMemory ();
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
61
void
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
68
SDL_free (sem);
}
69
70
}
71
72
int
SDL_SemTryWait (SDL_sem * sem)
73
{
74
75
76
77
if (!sem) {
SDL_SetError ("Passed a NULL semaphore");
return -1;
}
78
79
D (bug ("TryWait semaphore...%lx\n", sem));
80
81
82
ObtainSemaphore (&sem->Sem);
// ReleaseSemaphore(&sem->Sem);
83
84
return 1;
85
86
}
87
88
int
SDL_SemWaitTimeout (SDL_sem * sem, Uint32 timeout)
89
{
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
int retval;
if (!sem) {
SDL_SetError ("Passed a NULL semaphore");
return -1;
}
D (bug ("WaitTimeout (%ld) semaphore...%lx\n", timeout, sem));
/* A timeout of 0 is an easy case */
if (timeout == 0) {
ObtainSemaphore (&sem->Sem);
return 1;
}
if (!(retval = AttemptSemaphore (&sem->Sem))) {
SDL_Delay (timeout);
retval = AttemptSemaphore (&sem->Sem);
}
if (retval == TRUE) {
// ReleaseSemaphore(&sem->Sem);
retval = 1;
}
return retval;
116
117
}
118
119
int
SDL_SemWait (SDL_sem * sem)
120
{
121
122
ObtainSemaphore (&sem->Sem);
return 0;
123
124
}
125
126
Uint32
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
142
int
SDL_SemPost (SDL_sem * sem)
143
{
144
145
146
147
148
149
150
151
if (!sem) {
SDL_SetError ("Passed a NULL semaphore");
return -1;
}
D (bug ("SemPost semaphore...%lx\n", sem));
ReleaseSemaphore (&sem->Sem);
return 0;
152
153
}
154
/* vi: set ts=4 sw=4 expandtab: */