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: */