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