]> git.ipfire.org Git - thirdparty/cups.git/blame - cups/thread.c
Import CUPS v1.7.1
[thirdparty/cups.git] / cups / thread.c
CommitLineData
c7017ecc 1/*
61515785 2 * "$Id: thread.c 3794 2012-04-23 22:44:16Z msweet $"
c7017ecc
MS
3 *
4 * Threading primitives for CUPS.
5 *
f3c17241 6 * Copyright 2009-2012 by Apple Inc.
c7017ecc
MS
7 *
8 * These coded instructions, statements, and computer programs are the
9 * property of Apple Inc. and are protected by Federal copyright
10 * law. Distribution and use rights are outlined in the file "LICENSE.txt"
11 * which should have been included with this file. If this file is
12 * file is missing or damaged, see the license at "http://www.cups.org/".
13 *
14 * Contents:
15 *
1106b00e 16 * _cupsMutexInit() - Initialize a mutex.
c7017ecc
MS
17 * _cupsMutexLock() - Lock a mutex.
18 * _cupsMutexUnlock() - Unlock a mutex.
1106b00e
MS
19 * _cupsRWInit() - Initialize a reader/writer lock.
20 * _cupsRWLockRead() - Acquire a reader/writer lock for reading.
21 * _cupsRWLockWrite() - Acquire a reader/writer lock for writing.
22 * _cupsRWUnlock() - Release a reader/writer lock.
c7017ecc
MS
23 * _cupsThreadCreate() - Create a thread.
24 */
25
26/*
27 * Include necessary headers...
28 */
29
30#include "cups-private.h"
31#include "thread-private.h"
32
33
34#if defined(HAVE_PTHREAD_H)
1106b00e
MS
35/*
36 * '_cupsMutexInit()' - Initialize a mutex.
37 */
38
39void
40_cupsMutexInit(_cups_mutex_t *mutex) /* I - Mutex */
41{
42 pthread_mutex_init(mutex, NULL);
43}
44
45
c7017ecc
MS
46/*
47 * '_cupsMutexLock()' - Lock a mutex.
48 */
49
50void
51_cupsMutexLock(_cups_mutex_t *mutex) /* I - Mutex */
52{
53 pthread_mutex_lock(mutex);
54}
55
56
57/*
58 * '_cupsMutexUnlock()' - Unlock a mutex.
59 */
60
61void
62_cupsMutexUnlock(_cups_mutex_t *mutex) /* I - Mutex */
63{
64 pthread_mutex_unlock(mutex);
65}
66
67
1106b00e
MS
68/*
69 * '_cupsRWInit()' - Initialize a reader/writer lock.
70 */
71
72void
73_cupsRWInit(_cups_rwlock_t *rwlock) /* I - Reader/writer lock */
74{
75 pthread_rwlock_init(rwlock, NULL);
76}
77
78
79/*
80 * '_cupsRWLockRead()' - Acquire a reader/writer lock for reading.
81 */
82
83void
84_cupsRWLockRead(_cups_rwlock_t *rwlock) /* I - Reader/writer lock */
85{
86 pthread_rwlock_rdlock(rwlock);
87}
88
89
90/*
91 * '_cupsRWLockWrite()' - Acquire a reader/writer lock for writing.
92 */
93
94void
95_cupsRWLockWrite(_cups_rwlock_t *rwlock)/* I - Reader/writer lock */
96{
97 pthread_rwlock_wrlock(rwlock);
98}
99
100
101/*
102 * '_cupsRWUnlock()' - Release a reader/writer lock.
103 */
104
105void
106_cupsRWUnlock(_cups_rwlock_t *rwlock) /* I - Reader/writer lock */
107{
108 pthread_rwlock_unlock(rwlock);
109}
110
111
c7017ecc
MS
112/*
113 * '_cupsThreadCreate()' - Create a thread.
114 */
115
f3c17241 116int /* O - 0 on failure, 1 on success */
c7017ecc
MS
117_cupsThreadCreate(
118 _cups_thread_func_t func, /* I - Entry point */
119 void *arg) /* I - Entry point context */
120{
121 pthread_t thread;
122
123 return (pthread_create(&thread, NULL, (void *(*)(void *))func, arg) == 0);
124}
125
126
127#elif defined(WIN32)
128# include <process.h>
129
130
1106b00e
MS
131/*
132 * '_cupsMutexInit()' - Initialize a mutex.
133 */
134
135void
136_cupsMutexInit(_cups_mutex_t *mutex) /* I - Mutex */
137{
138 InitializeCriticalSection(&mutex->m_criticalSection);
139 mutex->m_init = 1;
140}
141
142
c7017ecc
MS
143/*
144 * '_cupsMutexLock()' - Lock a mutex.
145 */
146
147void
148_cupsMutexLock(_cups_mutex_t *mutex) /* I - Mutex */
149{
150 if (!mutex->m_init)
151 {
152 _cupsGlobalLock();
153
154 if (!mutex->m_init)
155 {
156 InitializeCriticalSection(&mutex->m_criticalSection);
157 mutex->m_init = 1;
158 }
159
160 _cupsGlobalUnlock();
161 }
162
163 EnterCriticalSection(&mutex->m_criticalSection);
164}
165
166
167/*
168 * '_cupsMutexUnlock()' - Unlock a mutex.
169 */
170
171void
172_cupsMutexUnlock(_cups_mutex_t *mutex) /* I - Mutex */
173{
174 LeaveCriticalSection(&mutex->m_criticalSection);
175}
176
177
1106b00e
MS
178/*
179 * '_cupsRWInit()' - Initialize a reader/writer lock.
180 */
181
182void
183_cupsRWInit(_cups_rwlock_t *rwlock) /* I - Reader/writer lock */
184{
185 _cupsMutexInit((_cups_mutex_t *)rwlock);
186}
187
188
189/*
190 * '_cupsRWLockRead()' - Acquire a reader/writer lock for reading.
191 */
192
193void
194_cupsRWLockRead(_cups_rwlock_t *rwlock) /* I - Reader/writer lock */
195{
196 _cupsMutexLock((_cups_mutex_t *)rwlock);
197}
198
199
200/*
201 * '_cupsRWLockWrite()' - Acquire a reader/writer lock for writing.
202 */
203
204void
205_cupsRWLockWrite(_cups_rwlock_t *rwlock)/* I - Reader/writer lock */
206{
207 _cupsMutexLock((_cups_mutex_t *)rwlock);
208}
209
210
211/*
212 * '_cupsRWUnlock()' - Release a reader/writer lock.
213 */
214
215void
216_cupsRWUnlock(_cups_rwlock_t *rwlock) /* I - Reader/writer lock */
217{
218 _cupsMutexUnlock((_cups_mutex_t *)rwlock);
219}
220
221
c7017ecc
MS
222/*
223 * '_cupsThreadCreate()' - Create a thread.
224 */
225
f3c17241 226int /* O - 0 on failure, 1 on success */
c7017ecc
MS
227_cupsThreadCreate(
228 _cups_thread_func_t func, /* I - Entry point */
229 void *arg) /* I - Entry point context */
230{
231 return (_beginthreadex(NULL, 0, (LPTHREAD_START_ROUTINE) func, arg, 0, NULL)
232 != 0);
233}
234
235
236#else
1106b00e
MS
237/*
238 * '_cupsMutexInit()' - Initialize a mutex.
239 */
240
241void
242_cupsMutexInit(_cups_mutex_t *mutex) /* I - Mutex */
243{
244 (void)mutex;
245}
246
247
c7017ecc
MS
248/*
249 * '_cupsMutexLock()' - Lock a mutex.
250 */
251
252void
253_cupsMutexLock(_cups_mutex_t *mutex) /* I - Mutex */
254{
1106b00e 255 (void)mutex;
c7017ecc
MS
256}
257
258
259/*
260 * '_cupsMutexUnlock()' - Unlock a mutex.
261 */
262
263void
264_cupsMutexUnlock(_cups_mutex_t *mutex) /* I - Mutex */
265{
1106b00e
MS
266 (void)mutex;
267}
268
269
270/*
271 * '_cupsRWInit()' - Initialize a reader/writer lock.
272 */
273
274void
275_cupsRWInit(_cups_rwlock_t *rwlock) /* I - Reader/writer lock */
276{
277 (void)rwlock;
278}
279
280
281/*
282 * '_cupsRWLockRead()' - Acquire a reader/writer lock for reading.
283 */
284
285void
286_cupsRWLockRead(_cups_rwlock_t *rwlock) /* I - Reader/writer lock */
287{
288 (void)rwlock;
289}
290
291
292/*
293 * '_cupsRWLockWrite()' - Acquire a reader/writer lock for writing.
294 */
295
296void
297_cupsRWLockWrite(_cups_rwlock_t *rwlock)/* I - Reader/writer lock */
298{
299 (void)rwlock;
300}
301
302
303/*
304 * '_cupsRWUnlock()' - Release a reader/writer lock.
305 */
306
307void
308_cupsRWUnlock(_cups_rwlock_t *rwlock) /* I - Reader/writer lock */
309{
310 (void)rwlock;
c7017ecc 311}
f3c17241
MS
312
313
314/*
315 * '_cupsThreadCreate()' - Create a thread.
316 */
317
318int /* O - 0 on failure, 1 on success */
319_cupsThreadCreate(
320 _cups_thread_func_t func, /* I - Entry point */
321 void *arg) /* I - Entry point context */
322{
323 fputs("DEBUG: CUPS was compiled without threading support, no thread "
324 "created.\n", stderr);
325
326 (void)func;
327 (void)arg;
328
329 return (0);
330}
c7017ecc
MS
331#endif /* HAVE_PTHREAD_H */
332
333
334/*
61515785 335 * End of "$Id: thread.c 3794 2012-04-23 22:44:16Z msweet $".
c7017ecc 336 */