Mercurial > sdl-ios-xcode
comparison src/thread/pthread/SDL_syssem.c @ 1895:c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Mon, 10 Jul 2006 21:04:37 +0000 |
parents | 536b0704b7d8 |
children | 375f9132da7f e27bdcc80744 |
comparison
equal
deleted
inserted
replaced
1894:c69cee13dd76 | 1895:c121d94672cb |
---|---|
21 */ | 21 */ |
22 #include "SDL_config.h" | 22 #include "SDL_config.h" |
23 | 23 |
24 #include <pthread.h> | 24 #include <pthread.h> |
25 #include <semaphore.h> | 25 #include <semaphore.h> |
26 #include <errno.h> | |
27 | 26 |
28 #include "SDL_thread.h" | 27 #include "SDL_thread.h" |
29 #include "SDL_timer.h" | 28 #include "SDL_timer.h" |
30 | 29 |
31 /* Wrapper around POSIX 1003.1b semaphores */ | 30 /* Wrapper around POSIX 1003.1b semaphores */ |
33 #ifdef __MACOSX__ | 32 #ifdef __MACOSX__ |
34 /* Mac OS X doesn't support sem_getvalue() as of version 10.4 */ | 33 /* Mac OS X doesn't support sem_getvalue() as of version 10.4 */ |
35 #include "../generic/SDL_syssem.c" | 34 #include "../generic/SDL_syssem.c" |
36 #else | 35 #else |
37 | 36 |
38 struct SDL_semaphore { | 37 struct SDL_semaphore |
39 sem_t sem; | 38 { |
39 sem_t sem; | |
40 }; | 40 }; |
41 | 41 |
42 /* Create a semaphore, initialized with value */ | 42 /* Create a semaphore, initialized with value */ |
43 SDL_sem *SDL_CreateSemaphore(Uint32 initial_value) | 43 SDL_sem * |
44 SDL_CreateSemaphore(Uint32 initial_value) | |
44 { | 45 { |
45 SDL_sem *sem = (SDL_sem *) SDL_malloc(sizeof(SDL_sem)); | 46 SDL_sem *sem = (SDL_sem *) SDL_malloc(sizeof(SDL_sem)); |
46 if ( sem ) { | 47 if (sem) { |
47 if ( sem_init(&sem->sem, 0, initial_value) < 0 ) { | 48 if (sem_init(&sem->sem, 0, initial_value) < 0) { |
48 SDL_SetError("sem_init() failed"); | 49 SDL_SetError("sem_init() failed"); |
49 SDL_free(sem); | 50 SDL_free(sem); |
50 sem = NULL; | 51 sem = NULL; |
51 } | 52 } |
52 } else { | 53 } else { |
53 SDL_OutOfMemory(); | 54 SDL_OutOfMemory(); |
54 } | 55 } |
55 return sem; | 56 return sem; |
56 } | 57 } |
57 | 58 |
58 void SDL_DestroySemaphore(SDL_sem *sem) | 59 void |
60 SDL_DestroySemaphore(SDL_sem * sem) | |
59 { | 61 { |
60 if ( sem ) { | 62 if (sem) { |
61 sem_destroy(&sem->sem); | 63 sem_destroy(&sem->sem); |
62 SDL_free(sem); | 64 SDL_free(sem); |
63 } | 65 } |
64 } | 66 } |
65 | 67 |
66 int SDL_SemTryWait(SDL_sem *sem) | 68 int |
69 SDL_SemTryWait(SDL_sem * sem) | |
67 { | 70 { |
68 int retval; | 71 int retval; |
69 | 72 |
70 if ( ! sem ) { | 73 if (!sem) { |
71 SDL_SetError("Passed a NULL semaphore"); | 74 SDL_SetError("Passed a NULL semaphore"); |
72 return -1; | 75 return -1; |
73 } | 76 } |
74 retval = SDL_MUTEX_TIMEDOUT; | 77 retval = SDL_MUTEX_TIMEDOUT; |
75 if ( sem_trywait(&sem->sem) == 0 ) { | 78 if (sem_trywait(&sem->sem) == 0) { |
76 retval = 0; | 79 retval = 0; |
77 } | 80 } |
78 return retval; | 81 return retval; |
79 } | 82 } |
80 | 83 |
81 int SDL_SemWait(SDL_sem *sem) | 84 int |
85 SDL_SemWait(SDL_sem * sem) | |
82 { | 86 { |
83 int retval; | 87 int retval; |
84 | 88 |
85 if ( ! sem ) { | 89 if (!sem) { |
86 SDL_SetError("Passed a NULL semaphore"); | 90 SDL_SetError("Passed a NULL semaphore"); |
87 return -1; | 91 return -1; |
88 } | 92 } |
89 | 93 |
90 while ( ((retval = sem_wait(&sem->sem)) == -1) && (errno == EINTR) ) {} | 94 retval = sem_wait(&sem->sem); |
91 if ( retval < 0 ) { | 95 if (retval < 0) { |
92 SDL_SetError("sem_wait() failed"); | 96 SDL_SetError("sem_wait() failed"); |
93 } | 97 } |
94 return retval; | 98 return retval; |
95 } | 99 } |
96 | 100 |
97 int SDL_SemWaitTimeout(SDL_sem *sem, Uint32 timeout) | 101 int |
102 SDL_SemWaitTimeout(SDL_sem * sem, Uint32 timeout) | |
98 { | 103 { |
99 int retval; | 104 int retval; |
100 | 105 |
101 if ( ! sem ) { | 106 if (!sem) { |
102 SDL_SetError("Passed a NULL semaphore"); | 107 SDL_SetError("Passed a NULL semaphore"); |
103 return -1; | 108 return -1; |
104 } | 109 } |
105 | 110 |
106 /* Try the easy cases first */ | 111 /* Try the easy cases first */ |
107 if ( timeout == 0 ) { | 112 if (timeout == 0) { |
108 return SDL_SemTryWait(sem); | 113 return SDL_SemTryWait(sem); |
109 } | 114 } |
110 if ( timeout == SDL_MUTEX_MAXWAIT ) { | 115 if (timeout == SDL_MUTEX_MAXWAIT) { |
111 return SDL_SemWait(sem); | 116 return SDL_SemWait(sem); |
112 } | 117 } |
113 | 118 |
114 /* Ack! We have to busy wait... */ | 119 /* Ack! We have to busy wait... */ |
115 /* FIXME: Use sem_timedwait()? */ | 120 /* FIXME: Use sem_timedwait()? */ |
116 timeout += SDL_GetTicks(); | 121 timeout += SDL_GetTicks(); |
117 do { | 122 do { |
118 retval = SDL_SemTryWait(sem); | 123 retval = SDL_SemTryWait(sem); |
119 if ( retval == 0 ) { | 124 if (retval == 0) { |
120 break; | 125 break; |
121 } | 126 } |
122 SDL_Delay(1); | 127 SDL_Delay(1); |
123 } while ( SDL_GetTicks() < timeout ); | 128 } |
129 while (SDL_GetTicks() < timeout); | |
124 | 130 |
125 return retval; | 131 return retval; |
126 } | 132 } |
127 | 133 |
128 Uint32 SDL_SemValue(SDL_sem *sem) | 134 Uint32 |
135 SDL_SemValue(SDL_sem * sem) | |
129 { | 136 { |
130 int ret = 0; | 137 int ret = 0; |
131 if ( sem ) { | 138 if (sem) { |
132 sem_getvalue(&sem->sem, &ret); | 139 sem_getvalue(&sem->sem, &ret); |
133 if ( ret < 0 ) { | 140 if (ret < 0) { |
134 ret = 0; | 141 ret = 0; |
135 } | 142 } |
136 } | 143 } |
137 return (Uint32)ret; | 144 return (Uint32) ret; |
138 } | 145 } |
139 | 146 |
140 int SDL_SemPost(SDL_sem *sem) | 147 int |
148 SDL_SemPost(SDL_sem * sem) | |
141 { | 149 { |
142 int retval; | 150 int retval; |
143 | 151 |
144 if ( ! sem ) { | 152 if (!sem) { |
145 SDL_SetError("Passed a NULL semaphore"); | 153 SDL_SetError("Passed a NULL semaphore"); |
146 return -1; | 154 return -1; |
147 } | 155 } |
148 | 156 |
149 retval = sem_post(&sem->sem); | 157 retval = sem_post(&sem->sem); |
150 if ( retval < 0 ) { | 158 if (retval < 0) { |
151 SDL_SetError("sem_post() failed"); | 159 SDL_SetError("sem_post() failed"); |
152 } | 160 } |
153 return retval; | 161 return retval; |
154 } | 162 } |
155 | 163 |
156 #endif /* __MACOSX__ */ | 164 #endif /* __MACOSX__ */ |
165 /* vi: set ts=4 sw=4 expandtab: */ |