xref: /aosp_15_r20/external/libcups/cups/thread.c (revision 5e7646d21f1134fb0638875d812ef646c12ab91e)
1*5e7646d2SAndroid Build Coastguard Worker /*
2*5e7646d2SAndroid Build Coastguard Worker  * Threading primitives for CUPS.
3*5e7646d2SAndroid Build Coastguard Worker  *
4*5e7646d2SAndroid Build Coastguard Worker  * Copyright © 2009-2018 by Apple Inc.
5*5e7646d2SAndroid Build Coastguard Worker  *
6*5e7646d2SAndroid Build Coastguard Worker  * Licensed under Apache License v2.0.  See the file "LICENSE" for more
7*5e7646d2SAndroid Build Coastguard Worker  * information.
8*5e7646d2SAndroid Build Coastguard Worker  */
9*5e7646d2SAndroid Build Coastguard Worker 
10*5e7646d2SAndroid Build Coastguard Worker /*
11*5e7646d2SAndroid Build Coastguard Worker  * Include necessary headers...
12*5e7646d2SAndroid Build Coastguard Worker  */
13*5e7646d2SAndroid Build Coastguard Worker 
14*5e7646d2SAndroid Build Coastguard Worker #include "cups-private.h"
15*5e7646d2SAndroid Build Coastguard Worker #include "thread-private.h"
16*5e7646d2SAndroid Build Coastguard Worker 
17*5e7646d2SAndroid Build Coastguard Worker 
18*5e7646d2SAndroid Build Coastguard Worker #if defined(HAVE_PTHREAD_H)
19*5e7646d2SAndroid Build Coastguard Worker /*
20*5e7646d2SAndroid Build Coastguard Worker  * '_cupsCondBroadcast()' - Wake up waiting threads.
21*5e7646d2SAndroid Build Coastguard Worker  */
22*5e7646d2SAndroid Build Coastguard Worker 
23*5e7646d2SAndroid Build Coastguard Worker void
_cupsCondBroadcast(_cups_cond_t * cond)24*5e7646d2SAndroid Build Coastguard Worker _cupsCondBroadcast(_cups_cond_t *cond)	/* I - Condition */
25*5e7646d2SAndroid Build Coastguard Worker {
26*5e7646d2SAndroid Build Coastguard Worker   pthread_cond_broadcast(cond);
27*5e7646d2SAndroid Build Coastguard Worker }
28*5e7646d2SAndroid Build Coastguard Worker 
29*5e7646d2SAndroid Build Coastguard Worker 
30*5e7646d2SAndroid Build Coastguard Worker /*
31*5e7646d2SAndroid Build Coastguard Worker  * '_cupsCondInit()' - Initialize a condition variable.
32*5e7646d2SAndroid Build Coastguard Worker  */
33*5e7646d2SAndroid Build Coastguard Worker 
34*5e7646d2SAndroid Build Coastguard Worker void
_cupsCondInit(_cups_cond_t * cond)35*5e7646d2SAndroid Build Coastguard Worker _cupsCondInit(_cups_cond_t *cond)	/* I - Condition */
36*5e7646d2SAndroid Build Coastguard Worker {
37*5e7646d2SAndroid Build Coastguard Worker   pthread_cond_init(cond, NULL);
38*5e7646d2SAndroid Build Coastguard Worker }
39*5e7646d2SAndroid Build Coastguard Worker 
40*5e7646d2SAndroid Build Coastguard Worker 
41*5e7646d2SAndroid Build Coastguard Worker /*
42*5e7646d2SAndroid Build Coastguard Worker  * '_cupsCondWait()' - Wait for a condition with optional timeout.
43*5e7646d2SAndroid Build Coastguard Worker  */
44*5e7646d2SAndroid Build Coastguard Worker 
45*5e7646d2SAndroid Build Coastguard Worker void
_cupsCondWait(_cups_cond_t * cond,_cups_mutex_t * mutex,double timeout)46*5e7646d2SAndroid Build Coastguard Worker _cupsCondWait(_cups_cond_t  *cond,	/* I - Condition */
47*5e7646d2SAndroid Build Coastguard Worker               _cups_mutex_t *mutex,	/* I - Mutex */
48*5e7646d2SAndroid Build Coastguard Worker 	      double        timeout)	/* I - Timeout in seconds (0 or negative for none) */
49*5e7646d2SAndroid Build Coastguard Worker {
50*5e7646d2SAndroid Build Coastguard Worker   if (timeout > 0.0)
51*5e7646d2SAndroid Build Coastguard Worker   {
52*5e7646d2SAndroid Build Coastguard Worker     struct timespec abstime;		/* Timeout */
53*5e7646d2SAndroid Build Coastguard Worker 
54*5e7646d2SAndroid Build Coastguard Worker     clock_gettime(CLOCK_REALTIME, &abstime);
55*5e7646d2SAndroid Build Coastguard Worker 
56*5e7646d2SAndroid Build Coastguard Worker     abstime.tv_sec  += (long)timeout;
57*5e7646d2SAndroid Build Coastguard Worker     abstime.tv_nsec += (long)(1000000000 * (timeout - (long)timeout));
58*5e7646d2SAndroid Build Coastguard Worker 
59*5e7646d2SAndroid Build Coastguard Worker     while (abstime.tv_nsec >= 1000000000)
60*5e7646d2SAndroid Build Coastguard Worker     {
61*5e7646d2SAndroid Build Coastguard Worker       abstime.tv_nsec -= 1000000000;
62*5e7646d2SAndroid Build Coastguard Worker       abstime.tv_sec ++;
63*5e7646d2SAndroid Build Coastguard Worker     };
64*5e7646d2SAndroid Build Coastguard Worker 
65*5e7646d2SAndroid Build Coastguard Worker     pthread_cond_timedwait(cond, mutex, &abstime);
66*5e7646d2SAndroid Build Coastguard Worker   }
67*5e7646d2SAndroid Build Coastguard Worker   else
68*5e7646d2SAndroid Build Coastguard Worker     pthread_cond_wait(cond, mutex);
69*5e7646d2SAndroid Build Coastguard Worker }
70*5e7646d2SAndroid Build Coastguard Worker 
71*5e7646d2SAndroid Build Coastguard Worker 
72*5e7646d2SAndroid Build Coastguard Worker /*
73*5e7646d2SAndroid Build Coastguard Worker  * '_cupsMutexInit()' - Initialize a mutex.
74*5e7646d2SAndroid Build Coastguard Worker  */
75*5e7646d2SAndroid Build Coastguard Worker 
76*5e7646d2SAndroid Build Coastguard Worker void
_cupsMutexInit(_cups_mutex_t * mutex)77*5e7646d2SAndroid Build Coastguard Worker _cupsMutexInit(_cups_mutex_t *mutex)	/* I - Mutex */
78*5e7646d2SAndroid Build Coastguard Worker {
79*5e7646d2SAndroid Build Coastguard Worker   pthread_mutex_init(mutex, NULL);
80*5e7646d2SAndroid Build Coastguard Worker }
81*5e7646d2SAndroid Build Coastguard Worker 
82*5e7646d2SAndroid Build Coastguard Worker 
83*5e7646d2SAndroid Build Coastguard Worker /*
84*5e7646d2SAndroid Build Coastguard Worker  * '_cupsMutexLock()' - Lock a mutex.
85*5e7646d2SAndroid Build Coastguard Worker  */
86*5e7646d2SAndroid Build Coastguard Worker 
87*5e7646d2SAndroid Build Coastguard Worker void
_cupsMutexLock(_cups_mutex_t * mutex)88*5e7646d2SAndroid Build Coastguard Worker _cupsMutexLock(_cups_mutex_t *mutex)	/* I - Mutex */
89*5e7646d2SAndroid Build Coastguard Worker {
90*5e7646d2SAndroid Build Coastguard Worker   pthread_mutex_lock(mutex);
91*5e7646d2SAndroid Build Coastguard Worker }
92*5e7646d2SAndroid Build Coastguard Worker 
93*5e7646d2SAndroid Build Coastguard Worker 
94*5e7646d2SAndroid Build Coastguard Worker /*
95*5e7646d2SAndroid Build Coastguard Worker  * '_cupsMutexUnlock()' - Unlock a mutex.
96*5e7646d2SAndroid Build Coastguard Worker  */
97*5e7646d2SAndroid Build Coastguard Worker 
98*5e7646d2SAndroid Build Coastguard Worker void
_cupsMutexUnlock(_cups_mutex_t * mutex)99*5e7646d2SAndroid Build Coastguard Worker _cupsMutexUnlock(_cups_mutex_t *mutex)	/* I - Mutex */
100*5e7646d2SAndroid Build Coastguard Worker {
101*5e7646d2SAndroid Build Coastguard Worker   pthread_mutex_unlock(mutex);
102*5e7646d2SAndroid Build Coastguard Worker }
103*5e7646d2SAndroid Build Coastguard Worker 
104*5e7646d2SAndroid Build Coastguard Worker 
105*5e7646d2SAndroid Build Coastguard Worker /*
106*5e7646d2SAndroid Build Coastguard Worker  * '_cupsRWInit()' - Initialize a reader/writer lock.
107*5e7646d2SAndroid Build Coastguard Worker  */
108*5e7646d2SAndroid Build Coastguard Worker 
109*5e7646d2SAndroid Build Coastguard Worker void
_cupsRWInit(_cups_rwlock_t * rwlock)110*5e7646d2SAndroid Build Coastguard Worker _cupsRWInit(_cups_rwlock_t *rwlock)	/* I - Reader/writer lock */
111*5e7646d2SAndroid Build Coastguard Worker {
112*5e7646d2SAndroid Build Coastguard Worker   pthread_rwlock_init(rwlock, NULL);
113*5e7646d2SAndroid Build Coastguard Worker }
114*5e7646d2SAndroid Build Coastguard Worker 
115*5e7646d2SAndroid Build Coastguard Worker 
116*5e7646d2SAndroid Build Coastguard Worker /*
117*5e7646d2SAndroid Build Coastguard Worker  * '_cupsRWLockRead()' - Acquire a reader/writer lock for reading.
118*5e7646d2SAndroid Build Coastguard Worker  */
119*5e7646d2SAndroid Build Coastguard Worker 
120*5e7646d2SAndroid Build Coastguard Worker void
_cupsRWLockRead(_cups_rwlock_t * rwlock)121*5e7646d2SAndroid Build Coastguard Worker _cupsRWLockRead(_cups_rwlock_t *rwlock)	/* I - Reader/writer lock */
122*5e7646d2SAndroid Build Coastguard Worker {
123*5e7646d2SAndroid Build Coastguard Worker   pthread_rwlock_rdlock(rwlock);
124*5e7646d2SAndroid Build Coastguard Worker }
125*5e7646d2SAndroid Build Coastguard Worker 
126*5e7646d2SAndroid Build Coastguard Worker 
127*5e7646d2SAndroid Build Coastguard Worker /*
128*5e7646d2SAndroid Build Coastguard Worker  * '_cupsRWLockWrite()' - Acquire a reader/writer lock for writing.
129*5e7646d2SAndroid Build Coastguard Worker  */
130*5e7646d2SAndroid Build Coastguard Worker 
131*5e7646d2SAndroid Build Coastguard Worker void
_cupsRWLockWrite(_cups_rwlock_t * rwlock)132*5e7646d2SAndroid Build Coastguard Worker _cupsRWLockWrite(_cups_rwlock_t *rwlock)/* I - Reader/writer lock */
133*5e7646d2SAndroid Build Coastguard Worker {
134*5e7646d2SAndroid Build Coastguard Worker   pthread_rwlock_wrlock(rwlock);
135*5e7646d2SAndroid Build Coastguard Worker }
136*5e7646d2SAndroid Build Coastguard Worker 
137*5e7646d2SAndroid Build Coastguard Worker 
138*5e7646d2SAndroid Build Coastguard Worker /*
139*5e7646d2SAndroid Build Coastguard Worker  * '_cupsRWUnlock()' - Release a reader/writer lock.
140*5e7646d2SAndroid Build Coastguard Worker  */
141*5e7646d2SAndroid Build Coastguard Worker 
142*5e7646d2SAndroid Build Coastguard Worker void
_cupsRWUnlock(_cups_rwlock_t * rwlock)143*5e7646d2SAndroid Build Coastguard Worker _cupsRWUnlock(_cups_rwlock_t *rwlock)	/* I - Reader/writer lock */
144*5e7646d2SAndroid Build Coastguard Worker {
145*5e7646d2SAndroid Build Coastguard Worker   pthread_rwlock_unlock(rwlock);
146*5e7646d2SAndroid Build Coastguard Worker }
147*5e7646d2SAndroid Build Coastguard Worker 
148*5e7646d2SAndroid Build Coastguard Worker 
149*5e7646d2SAndroid Build Coastguard Worker /*
150*5e7646d2SAndroid Build Coastguard Worker  * '_cupsThreadCancel()' - Cancel (kill) a thread.
151*5e7646d2SAndroid Build Coastguard Worker  */
152*5e7646d2SAndroid Build Coastguard Worker 
153*5e7646d2SAndroid Build Coastguard Worker void
_cupsThreadCancel(_cups_thread_t thread)154*5e7646d2SAndroid Build Coastguard Worker _cupsThreadCancel(_cups_thread_t thread)/* I - Thread ID */
155*5e7646d2SAndroid Build Coastguard Worker {
156*5e7646d2SAndroid Build Coastguard Worker   pthread_cancel(thread);
157*5e7646d2SAndroid Build Coastguard Worker }
158*5e7646d2SAndroid Build Coastguard Worker 
159*5e7646d2SAndroid Build Coastguard Worker 
160*5e7646d2SAndroid Build Coastguard Worker /*
161*5e7646d2SAndroid Build Coastguard Worker  * '_cupsThreadCreate()' - Create a thread.
162*5e7646d2SAndroid Build Coastguard Worker  */
163*5e7646d2SAndroid Build Coastguard Worker 
164*5e7646d2SAndroid Build Coastguard Worker _cups_thread_t				/* O - Thread ID */
_cupsThreadCreate(_cups_thread_func_t func,void * arg)165*5e7646d2SAndroid Build Coastguard Worker _cupsThreadCreate(
166*5e7646d2SAndroid Build Coastguard Worker     _cups_thread_func_t func,		/* I - Entry point */
167*5e7646d2SAndroid Build Coastguard Worker     void                *arg)		/* I - Entry point context */
168*5e7646d2SAndroid Build Coastguard Worker {
169*5e7646d2SAndroid Build Coastguard Worker   pthread_t thread;
170*5e7646d2SAndroid Build Coastguard Worker 
171*5e7646d2SAndroid Build Coastguard Worker   if (pthread_create(&thread, NULL, (void *(*)(void *))func, arg))
172*5e7646d2SAndroid Build Coastguard Worker     return (0);
173*5e7646d2SAndroid Build Coastguard Worker   else
174*5e7646d2SAndroid Build Coastguard Worker     return (thread);
175*5e7646d2SAndroid Build Coastguard Worker }
176*5e7646d2SAndroid Build Coastguard Worker 
177*5e7646d2SAndroid Build Coastguard Worker 
178*5e7646d2SAndroid Build Coastguard Worker /*
179*5e7646d2SAndroid Build Coastguard Worker  * '_cupsThreadDetach()' - Tell the OS that the thread is running independently.
180*5e7646d2SAndroid Build Coastguard Worker  */
181*5e7646d2SAndroid Build Coastguard Worker 
182*5e7646d2SAndroid Build Coastguard Worker void
_cupsThreadDetach(_cups_thread_t thread)183*5e7646d2SAndroid Build Coastguard Worker _cupsThreadDetach(_cups_thread_t thread)/* I - Thread ID */
184*5e7646d2SAndroid Build Coastguard Worker {
185*5e7646d2SAndroid Build Coastguard Worker   pthread_detach(thread);
186*5e7646d2SAndroid Build Coastguard Worker }
187*5e7646d2SAndroid Build Coastguard Worker 
188*5e7646d2SAndroid Build Coastguard Worker 
189*5e7646d2SAndroid Build Coastguard Worker /*
190*5e7646d2SAndroid Build Coastguard Worker  * '_cupsThreadWait()' - Wait for a thread to exit.
191*5e7646d2SAndroid Build Coastguard Worker  */
192*5e7646d2SAndroid Build Coastguard Worker 
193*5e7646d2SAndroid Build Coastguard Worker void *					/* O - Return value */
_cupsThreadWait(_cups_thread_t thread)194*5e7646d2SAndroid Build Coastguard Worker _cupsThreadWait(_cups_thread_t thread)	/* I - Thread ID */
195*5e7646d2SAndroid Build Coastguard Worker {
196*5e7646d2SAndroid Build Coastguard Worker   void	*ret;				/* Return value */
197*5e7646d2SAndroid Build Coastguard Worker 
198*5e7646d2SAndroid Build Coastguard Worker 
199*5e7646d2SAndroid Build Coastguard Worker   if (pthread_join(thread, &ret))
200*5e7646d2SAndroid Build Coastguard Worker     return (NULL);
201*5e7646d2SAndroid Build Coastguard Worker   else
202*5e7646d2SAndroid Build Coastguard Worker     return (ret);
203*5e7646d2SAndroid Build Coastguard Worker }
204*5e7646d2SAndroid Build Coastguard Worker 
205*5e7646d2SAndroid Build Coastguard Worker 
206*5e7646d2SAndroid Build Coastguard Worker #elif defined(_WIN32)
207*5e7646d2SAndroid Build Coastguard Worker #  include <process.h>
208*5e7646d2SAndroid Build Coastguard Worker 
209*5e7646d2SAndroid Build Coastguard Worker 
210*5e7646d2SAndroid Build Coastguard Worker /*
211*5e7646d2SAndroid Build Coastguard Worker  * '_cupsCondBroadcast()' - Wake up waiting threads.
212*5e7646d2SAndroid Build Coastguard Worker  */
213*5e7646d2SAndroid Build Coastguard Worker 
214*5e7646d2SAndroid Build Coastguard Worker void
_cupsCondBroadcast(_cups_cond_t * cond)215*5e7646d2SAndroid Build Coastguard Worker _cupsCondBroadcast(_cups_cond_t *cond)	/* I - Condition */
216*5e7646d2SAndroid Build Coastguard Worker {
217*5e7646d2SAndroid Build Coastguard Worker   // TODO: Implement me
218*5e7646d2SAndroid Build Coastguard Worker }
219*5e7646d2SAndroid Build Coastguard Worker 
220*5e7646d2SAndroid Build Coastguard Worker 
221*5e7646d2SAndroid Build Coastguard Worker /*
222*5e7646d2SAndroid Build Coastguard Worker  * '_cupsCondInit()' - Initialize a condition variable.
223*5e7646d2SAndroid Build Coastguard Worker  */
224*5e7646d2SAndroid Build Coastguard Worker 
225*5e7646d2SAndroid Build Coastguard Worker void
_cupsCondInit(_cups_cond_t * cond)226*5e7646d2SAndroid Build Coastguard Worker _cupsCondInit(_cups_cond_t *cond)	/* I - Condition */
227*5e7646d2SAndroid Build Coastguard Worker {
228*5e7646d2SAndroid Build Coastguard Worker   // TODO: Implement me
229*5e7646d2SAndroid Build Coastguard Worker }
230*5e7646d2SAndroid Build Coastguard Worker 
231*5e7646d2SAndroid Build Coastguard Worker 
232*5e7646d2SAndroid Build Coastguard Worker /*
233*5e7646d2SAndroid Build Coastguard Worker  * '_cupsCondWait()' - Wait for a condition with optional timeout.
234*5e7646d2SAndroid Build Coastguard Worker  */
235*5e7646d2SAndroid Build Coastguard Worker 
236*5e7646d2SAndroid Build Coastguard Worker void
_cupsCondWait(_cups_cond_t * cond,_cups_mutex_t * mutex,double timeout)237*5e7646d2SAndroid Build Coastguard Worker _cupsCondWait(_cups_cond_t  *cond,	/* I - Condition */
238*5e7646d2SAndroid Build Coastguard Worker               _cups_mutex_t *mutex,	/* I - Mutex */
239*5e7646d2SAndroid Build Coastguard Worker 	      double        timeout)	/* I - Timeout in seconds (0 or negative for none) */
240*5e7646d2SAndroid Build Coastguard Worker {
241*5e7646d2SAndroid Build Coastguard Worker   // TODO: Implement me
242*5e7646d2SAndroid Build Coastguard Worker }
243*5e7646d2SAndroid Build Coastguard Worker 
244*5e7646d2SAndroid Build Coastguard Worker 
245*5e7646d2SAndroid Build Coastguard Worker /*
246*5e7646d2SAndroid Build Coastguard Worker  * '_cupsMutexInit()' - Initialize a mutex.
247*5e7646d2SAndroid Build Coastguard Worker  */
248*5e7646d2SAndroid Build Coastguard Worker 
249*5e7646d2SAndroid Build Coastguard Worker void
_cupsMutexInit(_cups_mutex_t * mutex)250*5e7646d2SAndroid Build Coastguard Worker _cupsMutexInit(_cups_mutex_t *mutex)	/* I - Mutex */
251*5e7646d2SAndroid Build Coastguard Worker {
252*5e7646d2SAndroid Build Coastguard Worker   InitializeCriticalSection(&mutex->m_criticalSection);
253*5e7646d2SAndroid Build Coastguard Worker   mutex->m_init = 1;
254*5e7646d2SAndroid Build Coastguard Worker }
255*5e7646d2SAndroid Build Coastguard Worker 
256*5e7646d2SAndroid Build Coastguard Worker 
257*5e7646d2SAndroid Build Coastguard Worker /*
258*5e7646d2SAndroid Build Coastguard Worker  * '_cupsMutexLock()' - Lock a mutex.
259*5e7646d2SAndroid Build Coastguard Worker  */
260*5e7646d2SAndroid Build Coastguard Worker 
261*5e7646d2SAndroid Build Coastguard Worker void
_cupsMutexLock(_cups_mutex_t * mutex)262*5e7646d2SAndroid Build Coastguard Worker _cupsMutexLock(_cups_mutex_t *mutex)	/* I - Mutex */
263*5e7646d2SAndroid Build Coastguard Worker {
264*5e7646d2SAndroid Build Coastguard Worker   if (!mutex->m_init)
265*5e7646d2SAndroid Build Coastguard Worker   {
266*5e7646d2SAndroid Build Coastguard Worker     _cupsGlobalLock();
267*5e7646d2SAndroid Build Coastguard Worker 
268*5e7646d2SAndroid Build Coastguard Worker     if (!mutex->m_init)
269*5e7646d2SAndroid Build Coastguard Worker     {
270*5e7646d2SAndroid Build Coastguard Worker       InitializeCriticalSection(&mutex->m_criticalSection);
271*5e7646d2SAndroid Build Coastguard Worker       mutex->m_init = 1;
272*5e7646d2SAndroid Build Coastguard Worker     }
273*5e7646d2SAndroid Build Coastguard Worker 
274*5e7646d2SAndroid Build Coastguard Worker     _cupsGlobalUnlock();
275*5e7646d2SAndroid Build Coastguard Worker   }
276*5e7646d2SAndroid Build Coastguard Worker 
277*5e7646d2SAndroid Build Coastguard Worker   EnterCriticalSection(&mutex->m_criticalSection);
278*5e7646d2SAndroid Build Coastguard Worker }
279*5e7646d2SAndroid Build Coastguard Worker 
280*5e7646d2SAndroid Build Coastguard Worker 
281*5e7646d2SAndroid Build Coastguard Worker /*
282*5e7646d2SAndroid Build Coastguard Worker  * '_cupsMutexUnlock()' - Unlock a mutex.
283*5e7646d2SAndroid Build Coastguard Worker  */
284*5e7646d2SAndroid Build Coastguard Worker 
285*5e7646d2SAndroid Build Coastguard Worker void
_cupsMutexUnlock(_cups_mutex_t * mutex)286*5e7646d2SAndroid Build Coastguard Worker _cupsMutexUnlock(_cups_mutex_t *mutex)	/* I - Mutex */
287*5e7646d2SAndroid Build Coastguard Worker {
288*5e7646d2SAndroid Build Coastguard Worker   LeaveCriticalSection(&mutex->m_criticalSection);
289*5e7646d2SAndroid Build Coastguard Worker }
290*5e7646d2SAndroid Build Coastguard Worker 
291*5e7646d2SAndroid Build Coastguard Worker 
292*5e7646d2SAndroid Build Coastguard Worker /*
293*5e7646d2SAndroid Build Coastguard Worker  * '_cupsRWInit()' - Initialize a reader/writer lock.
294*5e7646d2SAndroid Build Coastguard Worker  */
295*5e7646d2SAndroid Build Coastguard Worker 
296*5e7646d2SAndroid Build Coastguard Worker void
_cupsRWInit(_cups_rwlock_t * rwlock)297*5e7646d2SAndroid Build Coastguard Worker _cupsRWInit(_cups_rwlock_t *rwlock)	/* I - Reader/writer lock */
298*5e7646d2SAndroid Build Coastguard Worker {
299*5e7646d2SAndroid Build Coastguard Worker   _cupsMutexInit((_cups_mutex_t *)rwlock);
300*5e7646d2SAndroid Build Coastguard Worker }
301*5e7646d2SAndroid Build Coastguard Worker 
302*5e7646d2SAndroid Build Coastguard Worker 
303*5e7646d2SAndroid Build Coastguard Worker /*
304*5e7646d2SAndroid Build Coastguard Worker  * '_cupsRWLockRead()' - Acquire a reader/writer lock for reading.
305*5e7646d2SAndroid Build Coastguard Worker  */
306*5e7646d2SAndroid Build Coastguard Worker 
307*5e7646d2SAndroid Build Coastguard Worker void
_cupsRWLockRead(_cups_rwlock_t * rwlock)308*5e7646d2SAndroid Build Coastguard Worker _cupsRWLockRead(_cups_rwlock_t *rwlock)	/* I - Reader/writer lock */
309*5e7646d2SAndroid Build Coastguard Worker {
310*5e7646d2SAndroid Build Coastguard Worker   _cupsMutexLock((_cups_mutex_t *)rwlock);
311*5e7646d2SAndroid Build Coastguard Worker }
312*5e7646d2SAndroid Build Coastguard Worker 
313*5e7646d2SAndroid Build Coastguard Worker 
314*5e7646d2SAndroid Build Coastguard Worker /*
315*5e7646d2SAndroid Build Coastguard Worker  * '_cupsRWLockWrite()' - Acquire a reader/writer lock for writing.
316*5e7646d2SAndroid Build Coastguard Worker  */
317*5e7646d2SAndroid Build Coastguard Worker 
318*5e7646d2SAndroid Build Coastguard Worker void
_cupsRWLockWrite(_cups_rwlock_t * rwlock)319*5e7646d2SAndroid Build Coastguard Worker _cupsRWLockWrite(_cups_rwlock_t *rwlock)/* I - Reader/writer lock */
320*5e7646d2SAndroid Build Coastguard Worker {
321*5e7646d2SAndroid Build Coastguard Worker   _cupsMutexLock((_cups_mutex_t *)rwlock);
322*5e7646d2SAndroid Build Coastguard Worker }
323*5e7646d2SAndroid Build Coastguard Worker 
324*5e7646d2SAndroid Build Coastguard Worker 
325*5e7646d2SAndroid Build Coastguard Worker /*
326*5e7646d2SAndroid Build Coastguard Worker  * '_cupsRWUnlock()' - Release a reader/writer lock.
327*5e7646d2SAndroid Build Coastguard Worker  */
328*5e7646d2SAndroid Build Coastguard Worker 
329*5e7646d2SAndroid Build Coastguard Worker void
_cupsRWUnlock(_cups_rwlock_t * rwlock)330*5e7646d2SAndroid Build Coastguard Worker _cupsRWUnlock(_cups_rwlock_t *rwlock)	/* I - Reader/writer lock */
331*5e7646d2SAndroid Build Coastguard Worker {
332*5e7646d2SAndroid Build Coastguard Worker   _cupsMutexUnlock((_cups_mutex_t *)rwlock);
333*5e7646d2SAndroid Build Coastguard Worker }
334*5e7646d2SAndroid Build Coastguard Worker 
335*5e7646d2SAndroid Build Coastguard Worker 
336*5e7646d2SAndroid Build Coastguard Worker /*
337*5e7646d2SAndroid Build Coastguard Worker  * '_cupsThreadCancel()' - Cancel (kill) a thread.
338*5e7646d2SAndroid Build Coastguard Worker  */
339*5e7646d2SAndroid Build Coastguard Worker 
340*5e7646d2SAndroid Build Coastguard Worker void
_cupsThreadCancel(_cups_thread_t thread)341*5e7646d2SAndroid Build Coastguard Worker _cupsThreadCancel(_cups_thread_t thread)/* I - Thread ID */
342*5e7646d2SAndroid Build Coastguard Worker {
343*5e7646d2SAndroid Build Coastguard Worker   // TODO: Implement me
344*5e7646d2SAndroid Build Coastguard Worker }
345*5e7646d2SAndroid Build Coastguard Worker 
346*5e7646d2SAndroid Build Coastguard Worker 
347*5e7646d2SAndroid Build Coastguard Worker /*
348*5e7646d2SAndroid Build Coastguard Worker  * '_cupsThreadCreate()' - Create a thread.
349*5e7646d2SAndroid Build Coastguard Worker  */
350*5e7646d2SAndroid Build Coastguard Worker 
351*5e7646d2SAndroid Build Coastguard Worker _cups_thread_t				/* O - Thread ID */
_cupsThreadCreate(_cups_thread_func_t func,void * arg)352*5e7646d2SAndroid Build Coastguard Worker _cupsThreadCreate(
353*5e7646d2SAndroid Build Coastguard Worker     _cups_thread_func_t func,		/* I - Entry point */
354*5e7646d2SAndroid Build Coastguard Worker     void                *arg)		/* I - Entry point context */
355*5e7646d2SAndroid Build Coastguard Worker {
356*5e7646d2SAndroid Build Coastguard Worker   return (_beginthreadex(NULL, 0, (LPTHREAD_START_ROUTINE)func, arg, 0, NULL));
357*5e7646d2SAndroid Build Coastguard Worker }
358*5e7646d2SAndroid Build Coastguard Worker 
359*5e7646d2SAndroid Build Coastguard Worker 
360*5e7646d2SAndroid Build Coastguard Worker /*
361*5e7646d2SAndroid Build Coastguard Worker  * '_cupsThreadDetach()' - Tell the OS that the thread is running independently.
362*5e7646d2SAndroid Build Coastguard Worker  */
363*5e7646d2SAndroid Build Coastguard Worker 
364*5e7646d2SAndroid Build Coastguard Worker void
_cupsThreadDetach(_cups_thread_t thread)365*5e7646d2SAndroid Build Coastguard Worker _cupsThreadDetach(_cups_thread_t thread)/* I - Thread ID */
366*5e7646d2SAndroid Build Coastguard Worker {
367*5e7646d2SAndroid Build Coastguard Worker   // TODO: Implement me
368*5e7646d2SAndroid Build Coastguard Worker   (void)thread;
369*5e7646d2SAndroid Build Coastguard Worker }
370*5e7646d2SAndroid Build Coastguard Worker 
371*5e7646d2SAndroid Build Coastguard Worker 
372*5e7646d2SAndroid Build Coastguard Worker /*
373*5e7646d2SAndroid Build Coastguard Worker  * '_cupsThreadWait()' - Wait for a thread to exit.
374*5e7646d2SAndroid Build Coastguard Worker  */
375*5e7646d2SAndroid Build Coastguard Worker 
376*5e7646d2SAndroid Build Coastguard Worker void *					/* O - Return value */
_cupsThreadWait(_cups_thread_t thread)377*5e7646d2SAndroid Build Coastguard Worker _cupsThreadWait(_cups_thread_t thread)	/* I - Thread ID */
378*5e7646d2SAndroid Build Coastguard Worker {
379*5e7646d2SAndroid Build Coastguard Worker   // TODO: Implement me
380*5e7646d2SAndroid Build Coastguard Worker   (void)thread;
381*5e7646d2SAndroid Build Coastguard Worker 
382*5e7646d2SAndroid Build Coastguard Worker   return (NULL);
383*5e7646d2SAndroid Build Coastguard Worker }
384*5e7646d2SAndroid Build Coastguard Worker 
385*5e7646d2SAndroid Build Coastguard Worker 
386*5e7646d2SAndroid Build Coastguard Worker #else /* No threading */
387*5e7646d2SAndroid Build Coastguard Worker /*
388*5e7646d2SAndroid Build Coastguard Worker  * '_cupsCondBroadcast()' - Wake up waiting threads.
389*5e7646d2SAndroid Build Coastguard Worker  */
390*5e7646d2SAndroid Build Coastguard Worker 
391*5e7646d2SAndroid Build Coastguard Worker void
_cupsCondBroadcast(_cups_cond_t * cond)392*5e7646d2SAndroid Build Coastguard Worker _cupsCondBroadcast(_cups_cond_t *cond)	/* I - Condition */
393*5e7646d2SAndroid Build Coastguard Worker {
394*5e7646d2SAndroid Build Coastguard Worker   // TODO: Implement me
395*5e7646d2SAndroid Build Coastguard Worker }
396*5e7646d2SAndroid Build Coastguard Worker 
397*5e7646d2SAndroid Build Coastguard Worker 
398*5e7646d2SAndroid Build Coastguard Worker /*
399*5e7646d2SAndroid Build Coastguard Worker  * '_cupsCondInit()' - Initialize a condition variable.
400*5e7646d2SAndroid Build Coastguard Worker  */
401*5e7646d2SAndroid Build Coastguard Worker 
402*5e7646d2SAndroid Build Coastguard Worker void
_cupsCondInit(_cups_cond_t * cond)403*5e7646d2SAndroid Build Coastguard Worker _cupsCondInit(_cups_cond_t *cond)	/* I - Condition */
404*5e7646d2SAndroid Build Coastguard Worker {
405*5e7646d2SAndroid Build Coastguard Worker   // TODO: Implement me
406*5e7646d2SAndroid Build Coastguard Worker }
407*5e7646d2SAndroid Build Coastguard Worker 
408*5e7646d2SAndroid Build Coastguard Worker 
409*5e7646d2SAndroid Build Coastguard Worker /*
410*5e7646d2SAndroid Build Coastguard Worker  * '_cupsCondWait()' - Wait for a condition with optional timeout.
411*5e7646d2SAndroid Build Coastguard Worker  */
412*5e7646d2SAndroid Build Coastguard Worker 
413*5e7646d2SAndroid Build Coastguard Worker void
_cupsCondWait(_cups_cond_t * cond,_cups_mutex_t * mutex,double timeout)414*5e7646d2SAndroid Build Coastguard Worker _cupsCondWait(_cups_cond_t  *cond,	/* I - Condition */
415*5e7646d2SAndroid Build Coastguard Worker               _cups_mutex_t *mutex,	/* I - Mutex */
416*5e7646d2SAndroid Build Coastguard Worker 	      double        timeout)	/* I - Timeout in seconds (0 or negative for none) */
417*5e7646d2SAndroid Build Coastguard Worker {
418*5e7646d2SAndroid Build Coastguard Worker   // TODO: Implement me
419*5e7646d2SAndroid Build Coastguard Worker }
420*5e7646d2SAndroid Build Coastguard Worker 
421*5e7646d2SAndroid Build Coastguard Worker 
422*5e7646d2SAndroid Build Coastguard Worker /*
423*5e7646d2SAndroid Build Coastguard Worker  * '_cupsMutexInit()' - Initialize a mutex.
424*5e7646d2SAndroid Build Coastguard Worker  */
425*5e7646d2SAndroid Build Coastguard Worker 
426*5e7646d2SAndroid Build Coastguard Worker void
_cupsMutexInit(_cups_mutex_t * mutex)427*5e7646d2SAndroid Build Coastguard Worker _cupsMutexInit(_cups_mutex_t *mutex)	/* I - Mutex */
428*5e7646d2SAndroid Build Coastguard Worker {
429*5e7646d2SAndroid Build Coastguard Worker   (void)mutex;
430*5e7646d2SAndroid Build Coastguard Worker }
431*5e7646d2SAndroid Build Coastguard Worker 
432*5e7646d2SAndroid Build Coastguard Worker 
433*5e7646d2SAndroid Build Coastguard Worker /*
434*5e7646d2SAndroid Build Coastguard Worker  * '_cupsMutexLock()' - Lock a mutex.
435*5e7646d2SAndroid Build Coastguard Worker  */
436*5e7646d2SAndroid Build Coastguard Worker 
437*5e7646d2SAndroid Build Coastguard Worker void
_cupsMutexLock(_cups_mutex_t * mutex)438*5e7646d2SAndroid Build Coastguard Worker _cupsMutexLock(_cups_mutex_t *mutex)	/* I - Mutex */
439*5e7646d2SAndroid Build Coastguard Worker {
440*5e7646d2SAndroid Build Coastguard Worker   (void)mutex;
441*5e7646d2SAndroid Build Coastguard Worker }
442*5e7646d2SAndroid Build Coastguard Worker 
443*5e7646d2SAndroid Build Coastguard Worker 
444*5e7646d2SAndroid Build Coastguard Worker /*
445*5e7646d2SAndroid Build Coastguard Worker  * '_cupsMutexUnlock()' - Unlock a mutex.
446*5e7646d2SAndroid Build Coastguard Worker  */
447*5e7646d2SAndroid Build Coastguard Worker 
448*5e7646d2SAndroid Build Coastguard Worker void
_cupsMutexUnlock(_cups_mutex_t * mutex)449*5e7646d2SAndroid Build Coastguard Worker _cupsMutexUnlock(_cups_mutex_t *mutex)	/* I - Mutex */
450*5e7646d2SAndroid Build Coastguard Worker {
451*5e7646d2SAndroid Build Coastguard Worker   (void)mutex;
452*5e7646d2SAndroid Build Coastguard Worker }
453*5e7646d2SAndroid Build Coastguard Worker 
454*5e7646d2SAndroid Build Coastguard Worker 
455*5e7646d2SAndroid Build Coastguard Worker /*
456*5e7646d2SAndroid Build Coastguard Worker  * '_cupsRWInit()' - Initialize a reader/writer lock.
457*5e7646d2SAndroid Build Coastguard Worker  */
458*5e7646d2SAndroid Build Coastguard Worker 
459*5e7646d2SAndroid Build Coastguard Worker void
_cupsRWInit(_cups_rwlock_t * rwlock)460*5e7646d2SAndroid Build Coastguard Worker _cupsRWInit(_cups_rwlock_t *rwlock)	/* I - Reader/writer lock */
461*5e7646d2SAndroid Build Coastguard Worker {
462*5e7646d2SAndroid Build Coastguard Worker   (void)rwlock;
463*5e7646d2SAndroid Build Coastguard Worker }
464*5e7646d2SAndroid Build Coastguard Worker 
465*5e7646d2SAndroid Build Coastguard Worker 
466*5e7646d2SAndroid Build Coastguard Worker /*
467*5e7646d2SAndroid Build Coastguard Worker  * '_cupsRWLockRead()' - Acquire a reader/writer lock for reading.
468*5e7646d2SAndroid Build Coastguard Worker  */
469*5e7646d2SAndroid Build Coastguard Worker 
470*5e7646d2SAndroid Build Coastguard Worker void
_cupsRWLockRead(_cups_rwlock_t * rwlock)471*5e7646d2SAndroid Build Coastguard Worker _cupsRWLockRead(_cups_rwlock_t *rwlock)	/* I - Reader/writer lock */
472*5e7646d2SAndroid Build Coastguard Worker {
473*5e7646d2SAndroid Build Coastguard Worker   (void)rwlock;
474*5e7646d2SAndroid Build Coastguard Worker }
475*5e7646d2SAndroid Build Coastguard Worker 
476*5e7646d2SAndroid Build Coastguard Worker 
477*5e7646d2SAndroid Build Coastguard Worker /*
478*5e7646d2SAndroid Build Coastguard Worker  * '_cupsRWLockWrite()' - Acquire a reader/writer lock for writing.
479*5e7646d2SAndroid Build Coastguard Worker  */
480*5e7646d2SAndroid Build Coastguard Worker 
481*5e7646d2SAndroid Build Coastguard Worker void
_cupsRWLockWrite(_cups_rwlock_t * rwlock)482*5e7646d2SAndroid Build Coastguard Worker _cupsRWLockWrite(_cups_rwlock_t *rwlock)/* I - Reader/writer lock */
483*5e7646d2SAndroid Build Coastguard Worker {
484*5e7646d2SAndroid Build Coastguard Worker   (void)rwlock;
485*5e7646d2SAndroid Build Coastguard Worker }
486*5e7646d2SAndroid Build Coastguard Worker 
487*5e7646d2SAndroid Build Coastguard Worker 
488*5e7646d2SAndroid Build Coastguard Worker /*
489*5e7646d2SAndroid Build Coastguard Worker  * '_cupsRWUnlock()' - Release a reader/writer lock.
490*5e7646d2SAndroid Build Coastguard Worker  */
491*5e7646d2SAndroid Build Coastguard Worker 
492*5e7646d2SAndroid Build Coastguard Worker void
_cupsRWUnlock(_cups_rwlock_t * rwlock)493*5e7646d2SAndroid Build Coastguard Worker _cupsRWUnlock(_cups_rwlock_t *rwlock)	/* I - Reader/writer lock */
494*5e7646d2SAndroid Build Coastguard Worker {
495*5e7646d2SAndroid Build Coastguard Worker   (void)rwlock;
496*5e7646d2SAndroid Build Coastguard Worker }
497*5e7646d2SAndroid Build Coastguard Worker 
498*5e7646d2SAndroid Build Coastguard Worker 
499*5e7646d2SAndroid Build Coastguard Worker /*
500*5e7646d2SAndroid Build Coastguard Worker  * '_cupsThreadCancel()' - Cancel (kill) a thread.
501*5e7646d2SAndroid Build Coastguard Worker  */
502*5e7646d2SAndroid Build Coastguard Worker 
503*5e7646d2SAndroid Build Coastguard Worker void
_cupsThreadCancel(_cups_thread_t thread)504*5e7646d2SAndroid Build Coastguard Worker _cupsThreadCancel(_cups_thread_t thread)/* I - Thread ID */
505*5e7646d2SAndroid Build Coastguard Worker {
506*5e7646d2SAndroid Build Coastguard Worker   (void)thread;
507*5e7646d2SAndroid Build Coastguard Worker }
508*5e7646d2SAndroid Build Coastguard Worker 
509*5e7646d2SAndroid Build Coastguard Worker 
510*5e7646d2SAndroid Build Coastguard Worker /*
511*5e7646d2SAndroid Build Coastguard Worker  * '_cupsThreadCreate()' - Create a thread.
512*5e7646d2SAndroid Build Coastguard Worker  */
513*5e7646d2SAndroid Build Coastguard Worker 
514*5e7646d2SAndroid Build Coastguard Worker _cups_thread_t				/* O - Thread ID */
_cupsThreadCreate(_cups_thread_func_t func,void * arg)515*5e7646d2SAndroid Build Coastguard Worker _cupsThreadCreate(
516*5e7646d2SAndroid Build Coastguard Worker     _cups_thread_func_t func,		/* I - Entry point */
517*5e7646d2SAndroid Build Coastguard Worker     void                *arg)		/* I - Entry point context */
518*5e7646d2SAndroid Build Coastguard Worker {
519*5e7646d2SAndroid Build Coastguard Worker   fputs("DEBUG: CUPS was compiled without threading support, no thread created.\n", stderr);
520*5e7646d2SAndroid Build Coastguard Worker 
521*5e7646d2SAndroid Build Coastguard Worker   (void)func;
522*5e7646d2SAndroid Build Coastguard Worker   (void)arg;
523*5e7646d2SAndroid Build Coastguard Worker 
524*5e7646d2SAndroid Build Coastguard Worker   return (0);
525*5e7646d2SAndroid Build Coastguard Worker }
526*5e7646d2SAndroid Build Coastguard Worker 
527*5e7646d2SAndroid Build Coastguard Worker 
528*5e7646d2SAndroid Build Coastguard Worker /*
529*5e7646d2SAndroid Build Coastguard Worker  * '_cupsThreadDetach()' - Tell the OS that the thread is running independently.
530*5e7646d2SAndroid Build Coastguard Worker  */
531*5e7646d2SAndroid Build Coastguard Worker 
532*5e7646d2SAndroid Build Coastguard Worker void
_cupsThreadDetach(_cups_thread_t thread)533*5e7646d2SAndroid Build Coastguard Worker _cupsThreadDetach(_cups_thread_t thread)/* I - Thread ID */
534*5e7646d2SAndroid Build Coastguard Worker {
535*5e7646d2SAndroid Build Coastguard Worker   (void)thread;
536*5e7646d2SAndroid Build Coastguard Worker }
537*5e7646d2SAndroid Build Coastguard Worker 
538*5e7646d2SAndroid Build Coastguard Worker 
539*5e7646d2SAndroid Build Coastguard Worker /*
540*5e7646d2SAndroid Build Coastguard Worker  * '_cupsThreadWait()' - Wait for a thread to exit.
541*5e7646d2SAndroid Build Coastguard Worker  */
542*5e7646d2SAndroid Build Coastguard Worker 
543*5e7646d2SAndroid Build Coastguard Worker void *					/* O - Return value */
_cupsThreadWait(_cups_thread_t thread)544*5e7646d2SAndroid Build Coastguard Worker _cupsThreadWait(_cups_thread_t thread)	/* I - Thread ID */
545*5e7646d2SAndroid Build Coastguard Worker {
546*5e7646d2SAndroid Build Coastguard Worker   (void)thread;
547*5e7646d2SAndroid Build Coastguard Worker 
548*5e7646d2SAndroid Build Coastguard Worker   return (NULL);
549*5e7646d2SAndroid Build Coastguard Worker }
550*5e7646d2SAndroid Build Coastguard Worker 
551*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_PTHREAD_H */
552