comparison src/thread/riscos/SDL_syssem.c @ 1662:782fd950bd46 SDL-1.3

Revamp of the video system in progress - adding support for multiple displays, multiple windows, and a full video mode selection API. WARNING: None of the video drivers have been updated for the new API yet! The API is still under design and very fluid. The code is now run through a consistent indent format: indent -i4 -nut -nsc -br -ce The headers are being converted to automatically generate doxygen documentation.
author Sam Lantinga <slouken@libsdl.org>
date Sun, 28 May 2006 13:04:16 +0000
parents d910939febfa
children 4da1ee79c9af
comparison
equal deleted inserted replaced
1661:281d3f4870e5 1662:782fd950bd46
28 #include "SDL_thread.h" 28 #include "SDL_thread.h"
29 #include "SDL_systhread_c.h" 29 #include "SDL_systhread_c.h"
30 30
31 #if !SDL_THREADS_DISABLED 31 #if !SDL_THREADS_DISABLED
32 32
33 SDL_sem *SDL_CreateSemaphore(Uint32 initial_value) 33 SDL_sem *
34 { 34 SDL_CreateSemaphore (Uint32 initial_value)
35 SDL_SetError("SDL not configured with thread support"); 35 {
36 return (SDL_sem *)0; 36 SDL_SetError ("SDL not configured with thread support");
37 } 37 return (SDL_sem *) 0;
38 38 }
39 void SDL_DestroySemaphore(SDL_sem *sem) 39
40 { 40 void
41 return; 41 SDL_DestroySemaphore (SDL_sem * sem)
42 } 42 {
43 43 return;
44 int SDL_SemTryWait(SDL_sem *sem) 44 }
45 { 45
46 SDL_SetError("SDL not configured with thread support"); 46 int
47 return -1; 47 SDL_SemTryWait (SDL_sem * sem)
48 } 48 {
49 49 SDL_SetError ("SDL not configured with thread support");
50 int SDL_SemWaitTimeout(SDL_sem *sem, Uint32 timeout) 50 return -1;
51 { 51 }
52 SDL_SetError("SDL not configured with thread support"); 52
53 return -1; 53 int
54 } 54 SDL_SemWaitTimeout (SDL_sem * sem, Uint32 timeout)
55 55 {
56 int SDL_SemWait(SDL_sem *sem) 56 SDL_SetError ("SDL not configured with thread support");
57 { 57 return -1;
58 SDL_SetError("SDL not configured with thread support"); 58 }
59 return -1; 59
60 } 60 int
61 61 SDL_SemWait (SDL_sem * sem)
62 Uint32 SDL_SemValue(SDL_sem *sem) 62 {
63 { 63 SDL_SetError ("SDL not configured with thread support");
64 return 0; 64 return -1;
65 } 65 }
66 66
67 int SDL_SemPost(SDL_sem *sem) 67 Uint32
68 { 68 SDL_SemValue (SDL_sem * sem)
69 SDL_SetError("SDL not configured with thread support"); 69 {
70 return -1; 70 return 0;
71 }
72
73 int
74 SDL_SemPost (SDL_sem * sem)
75 {
76 SDL_SetError ("SDL not configured with thread support");
77 return -1;
71 } 78 }
72 79
73 #else 80 #else
74 81
75 82
76 #include <unistd.h> /* For getpid() */ 83 #include <unistd.h> /* For getpid() */
77 #include <pthread.h> 84 #include <pthread.h>
78 #include <semaphore.h> 85 #include <semaphore.h>
79 86
80 struct SDL_semaphore { 87 struct SDL_semaphore
81 sem_t *sem; 88 {
82 sem_t sem_data; 89 sem_t *sem;
90 sem_t sem_data;
83 }; 91 };
84 92
85 /* Create a semaphore, initialized with value */ 93 /* Create a semaphore, initialized with value */
86 SDL_sem *SDL_CreateSemaphore(Uint32 initial_value) 94 SDL_sem *
87 { 95 SDL_CreateSemaphore (Uint32 initial_value)
88 SDL_sem *sem = (SDL_sem *) SDL_malloc(sizeof(SDL_sem)); 96 {
89 if ( sem ) { 97 SDL_sem *sem = (SDL_sem *) SDL_malloc (sizeof (SDL_sem));
90 if ( sem_init(&sem->sem_data, 0, initial_value) < 0 ) { 98 if (sem) {
91 SDL_SetError("sem_init() failed"); 99 if (sem_init (&sem->sem_data, 0, initial_value) < 0) {
92 SDL_free(sem); 100 SDL_SetError ("sem_init() failed");
93 sem = NULL; 101 SDL_free (sem);
94 } else { 102 sem = NULL;
95 sem->sem = &sem->sem_data; 103 } else {
96 } 104 sem->sem = &sem->sem_data;
97 } else { 105 }
98 SDL_OutOfMemory(); 106 } else {
99 } 107 SDL_OutOfMemory ();
100 return sem; 108 }
101 } 109 return sem;
102 110 }
103 void SDL_DestroySemaphore(SDL_sem *sem) 111
104 { 112 void
105 if ( sem ) { 113 SDL_DestroySemaphore (SDL_sem * sem)
106 sem_destroy(sem->sem); 114 {
107 SDL_free(sem); 115 if (sem) {
108 } 116 sem_destroy (sem->sem);
109 } 117 SDL_free (sem);
110 118 }
111 int SDL_SemTryWait(SDL_sem *sem) 119 }
112 { 120
113 int retval; 121 int
114 122 SDL_SemTryWait (SDL_sem * sem)
115 if ( ! sem ) { 123 {
116 SDL_SetError("Passed a NULL semaphore"); 124 int retval;
117 return -1; 125
118 } 126 if (!sem) {
119 retval = SDL_MUTEX_TIMEDOUT; 127 SDL_SetError ("Passed a NULL semaphore");
120 if ( sem_trywait(sem->sem) == 0 ) { 128 return -1;
121 retval = 0; 129 }
122 } 130 retval = SDL_MUTEX_TIMEDOUT;
123 return retval; 131 if (sem_trywait (sem->sem) == 0) {
124 } 132 retval = 0;
125 133 }
126 int SDL_SemWait(SDL_sem *sem) 134 return retval;
127 { 135 }
128 int retval; 136
129 137 int
130 if ( ! sem ) { 138 SDL_SemWait (SDL_sem * sem)
131 SDL_SetError("Passed a NULL semaphore"); 139 {
132 return -1; 140 int retval;
133 } 141
134 142 if (!sem) {
135 retval = sem_wait(sem->sem); 143 SDL_SetError ("Passed a NULL semaphore");
136 if ( retval < 0 ) { 144 return -1;
137 SDL_SetError("sem_wait() failed"); 145 }
138 } 146
139 return retval; 147 retval = sem_wait (sem->sem);
140 } 148 if (retval < 0) {
141 149 SDL_SetError ("sem_wait() failed");
142 int SDL_SemWaitTimeout(SDL_sem *sem, Uint32 timeout) 150 }
143 { 151 return retval;
144 int retval; 152 }
145 153
146 if ( ! sem ) { 154 int
147 SDL_SetError("Passed a NULL semaphore"); 155 SDL_SemWaitTimeout (SDL_sem * sem, Uint32 timeout)
148 return -1; 156 {
149 } 157 int retval;
150 158
151 /* Try the easy cases first */ 159 if (!sem) {
152 if ( timeout == 0 ) { 160 SDL_SetError ("Passed a NULL semaphore");
153 return SDL_SemTryWait(sem); 161 return -1;
154 } 162 }
155 if ( timeout == SDL_MUTEX_MAXWAIT ) { 163
156 return SDL_SemWait(sem); 164 /* Try the easy cases first */
157 } 165 if (timeout == 0) {
158 166 return SDL_SemTryWait (sem);
159 /* Ack! We have to busy wait... */ 167 }
160 timeout += SDL_GetTicks(); 168 if (timeout == SDL_MUTEX_MAXWAIT) {
161 do { 169 return SDL_SemWait (sem);
162 retval = SDL_SemTryWait(sem); 170 }
163 if ( retval == 0 ) { 171
164 break; 172 /* Ack! We have to busy wait... */
165 } 173 timeout += SDL_GetTicks ();
166 SDL_Delay(1); 174 do {
167 } while ( SDL_GetTicks() < timeout ); 175 retval = SDL_SemTryWait (sem);
168 176 if (retval == 0) {
169 return retval; 177 break;
170 } 178 }
171 179 SDL_Delay (1);
172 Uint32 SDL_SemValue(SDL_sem *sem) 180 }
173 { 181 while (SDL_GetTicks () < timeout);
174 int ret = 0; 182
175 if ( sem ) { 183 return retval;
176 sem_getvalue(sem->sem, &ret); 184 }
177 if ( ret < 0 ) { 185
178 ret = 0; 186 Uint32
179 } 187 SDL_SemValue (SDL_sem * sem)
180 } 188 {
181 return (Uint32)ret; 189 int ret = 0;
182 } 190 if (sem) {
183 191 sem_getvalue (sem->sem, &ret);
184 int SDL_SemPost(SDL_sem *sem) 192 if (ret < 0) {
185 { 193 ret = 0;
186 int retval; 194 }
187 195 }
188 if ( ! sem ) { 196 return (Uint32) ret;
189 SDL_SetError("Passed a NULL semaphore"); 197 }
190 return -1; 198
191 } 199 int
192 200 SDL_SemPost (SDL_sem * sem)
193 retval = sem_post(sem->sem); 201 {
194 if ( retval < 0 ) { 202 int retval;
195 SDL_SetError("sem_post() failed"); 203
196 } 204 if (!sem) {
197 return retval; 205 SDL_SetError ("Passed a NULL semaphore");
206 return -1;
207 }
208
209 retval = sem_post (sem->sem);
210 if (retval < 0) {
211 SDL_SetError ("sem_post() failed");
212 }
213 return retval;
198 } 214 }
199 215
200 #endif /* !SDL_THREADS_DISABLED */ 216 #endif /* !SDL_THREADS_DISABLED */
217 /* vi: set ts=4 sw=4 expandtab: */