Mercurial > sdl-ios-xcode
comparison src/thread/pthread/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 | eba962f9d603 |
children | 4da1ee79c9af |
comparison
equal
deleted
inserted
replaced
1661:281d3f4870e5 | 1662:782fd950bd46 |
---|---|
32 #ifdef __MACOSX__ | 32 #ifdef __MACOSX__ |
33 /* 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 */ |
34 #include "../generic/SDL_syssem.c" | 34 #include "../generic/SDL_syssem.c" |
35 #else | 35 #else |
36 | 36 |
37 struct SDL_semaphore { | 37 struct SDL_semaphore |
38 sem_t sem; | 38 { |
39 sem_t sem; | |
39 }; | 40 }; |
40 | 41 |
41 /* Create a semaphore, initialized with value */ | 42 /* Create a semaphore, initialized with value */ |
42 SDL_sem *SDL_CreateSemaphore(Uint32 initial_value) | 43 SDL_sem * |
44 SDL_CreateSemaphore (Uint32 initial_value) | |
43 { | 45 { |
44 SDL_sem *sem = (SDL_sem *) SDL_malloc(sizeof(SDL_sem)); | 46 SDL_sem *sem = (SDL_sem *) SDL_malloc (sizeof (SDL_sem)); |
45 if ( sem ) { | 47 if (sem) { |
46 if ( sem_init(&sem->sem, 0, initial_value) < 0 ) { | 48 if (sem_init (&sem->sem, 0, initial_value) < 0) { |
47 SDL_SetError("sem_init() failed"); | 49 SDL_SetError ("sem_init() failed"); |
48 SDL_free(sem); | 50 SDL_free (sem); |
49 sem = NULL; | 51 sem = NULL; |
50 } | 52 } |
51 } else { | 53 } else { |
52 SDL_OutOfMemory(); | 54 SDL_OutOfMemory (); |
53 } | 55 } |
54 return sem; | 56 return sem; |
55 } | 57 } |
56 | 58 |
57 void SDL_DestroySemaphore(SDL_sem *sem) | 59 void |
60 SDL_DestroySemaphore (SDL_sem * sem) | |
58 { | 61 { |
59 if ( sem ) { | 62 if (sem) { |
60 sem_destroy(&sem->sem); | 63 sem_destroy (&sem->sem); |
61 SDL_free(sem); | 64 SDL_free (sem); |
62 } | 65 } |
63 } | 66 } |
64 | 67 |
65 int SDL_SemTryWait(SDL_sem *sem) | 68 int |
69 SDL_SemTryWait (SDL_sem * sem) | |
66 { | 70 { |
67 int retval; | 71 int retval; |
68 | 72 |
69 if ( ! sem ) { | 73 if (!sem) { |
70 SDL_SetError("Passed a NULL semaphore"); | 74 SDL_SetError ("Passed a NULL semaphore"); |
71 return -1; | 75 return -1; |
72 } | 76 } |
73 retval = SDL_MUTEX_TIMEDOUT; | 77 retval = SDL_MUTEX_TIMEDOUT; |
74 if ( sem_trywait(&sem->sem) == 0 ) { | 78 if (sem_trywait (&sem->sem) == 0) { |
75 retval = 0; | 79 retval = 0; |
76 } | 80 } |
77 return retval; | 81 return retval; |
78 } | 82 } |
79 | 83 |
80 int SDL_SemWait(SDL_sem *sem) | 84 int |
85 SDL_SemWait (SDL_sem * sem) | |
81 { | 86 { |
82 int retval; | 87 int retval; |
83 | 88 |
84 if ( ! sem ) { | 89 if (!sem) { |
85 SDL_SetError("Passed a NULL semaphore"); | 90 SDL_SetError ("Passed a NULL semaphore"); |
86 return -1; | 91 return -1; |
87 } | 92 } |
88 | 93 |
89 retval = sem_wait(&sem->sem); | 94 retval = sem_wait (&sem->sem); |
90 if ( retval < 0 ) { | 95 if (retval < 0) { |
91 SDL_SetError("sem_wait() failed"); | 96 SDL_SetError ("sem_wait() failed"); |
92 } | 97 } |
93 return retval; | 98 return retval; |
94 } | 99 } |
95 | 100 |
96 int SDL_SemWaitTimeout(SDL_sem *sem, Uint32 timeout) | 101 int |
102 SDL_SemWaitTimeout (SDL_sem * sem, Uint32 timeout) | |
97 { | 103 { |
98 int retval; | 104 int retval; |
99 | 105 |
100 if ( ! sem ) { | 106 if (!sem) { |
101 SDL_SetError("Passed a NULL semaphore"); | 107 SDL_SetError ("Passed a NULL semaphore"); |
102 return -1; | 108 return -1; |
103 } | 109 } |
104 | 110 |
105 /* Try the easy cases first */ | 111 /* Try the easy cases first */ |
106 if ( timeout == 0 ) { | 112 if (timeout == 0) { |
107 return SDL_SemTryWait(sem); | 113 return SDL_SemTryWait (sem); |
108 } | 114 } |
109 if ( timeout == SDL_MUTEX_MAXWAIT ) { | 115 if (timeout == SDL_MUTEX_MAXWAIT) { |
110 return SDL_SemWait(sem); | 116 return SDL_SemWait (sem); |
111 } | 117 } |
112 | 118 |
113 /* Ack! We have to busy wait... */ | 119 /* Ack! We have to busy wait... */ |
114 /* FIXME: Use sem_timedwait()? */ | 120 /* FIXME: Use sem_timedwait()? */ |
115 timeout += SDL_GetTicks(); | 121 timeout += SDL_GetTicks (); |
116 do { | 122 do { |
117 retval = SDL_SemTryWait(sem); | 123 retval = SDL_SemTryWait (sem); |
118 if ( retval == 0 ) { | 124 if (retval == 0) { |
119 break; | 125 break; |
120 } | 126 } |
121 SDL_Delay(1); | 127 SDL_Delay (1); |
122 } while ( SDL_GetTicks() < timeout ); | 128 } |
129 while (SDL_GetTicks () < timeout); | |
123 | 130 |
124 return retval; | 131 return retval; |
125 } | 132 } |
126 | 133 |
127 Uint32 SDL_SemValue(SDL_sem *sem) | 134 Uint32 |
135 SDL_SemValue (SDL_sem * sem) | |
128 { | 136 { |
129 int ret = 0; | 137 int ret = 0; |
130 if ( sem ) { | 138 if (sem) { |
131 sem_getvalue(&sem->sem, &ret); | 139 sem_getvalue (&sem->sem, &ret); |
132 if ( ret < 0 ) { | 140 if (ret < 0) { |
133 ret = 0; | 141 ret = 0; |
134 } | 142 } |
135 } | 143 } |
136 return (Uint32)ret; | 144 return (Uint32) ret; |
137 } | 145 } |
138 | 146 |
139 int SDL_SemPost(SDL_sem *sem) | 147 int |
148 SDL_SemPost (SDL_sem * sem) | |
140 { | 149 { |
141 int retval; | 150 int retval; |
142 | 151 |
143 if ( ! sem ) { | 152 if (!sem) { |
144 SDL_SetError("Passed a NULL semaphore"); | 153 SDL_SetError ("Passed a NULL semaphore"); |
145 return -1; | 154 return -1; |
146 } | 155 } |
147 | 156 |
148 retval = sem_post(&sem->sem); | 157 retval = sem_post (&sem->sem); |
149 if ( retval < 0 ) { | 158 if (retval < 0) { |
150 SDL_SetError("sem_post() failed"); | 159 SDL_SetError ("sem_post() failed"); |
151 } | 160 } |
152 return retval; | 161 return retval; |
153 } | 162 } |
154 | 163 |
155 #endif /* __MACOSX__ */ | 164 #endif /* __MACOSX__ */ |
165 /* vi: set ts=4 sw=4 expandtab: */ |