root/trunk/pthreads.d

Revision 15, 10.9 kB (checked in by jjr, 7 years ago)

--

Line 
1 /******************************************************************************
2
3   pthreads.d:    Posix threads module for the D programming language
4  
5   Based on Linux C headers by Xavier Leroy
6
7   D module by John Reimer 2004-12-01
8         
9   -------------------------------------------------------------------
10  
11   2004-12-04 ADDED:  Semaphores and fixed module formatting - John Reimer
12  
13   ****************************************************************************/
14    
15 module std.c.unix.pthread;
16
17 version(USE_UNIX98)
18 {
19     version = USE_UNIX98_OR_XOPEN2K;
20 }
21
22 version(USE_XOPEN2K)
23 {
24     version = USE_UNIX98_OR_XOPEN2K;
25 }
26
27 typedef uint __time_t;
28    
29 struct timespec
30 {
31     __time_t tv_sec;
32     uint     tv_nsec;
33 }
34
35 /********************************************
36
37   bits/pthreadtypes
38
39 *********************************************/
40
41 /* pthread types */
42
43 struct _pthread_fastlock
44 {
45     int __status;
46     int __spinlock;
47 }
48
49 // TODO: _pthread_descr_struct* _pthread_descr;
50 // How do I declare _pthread_desc_struct* for a
51 // structure that isn't defined in the headers?
52 // For now, I just define the symbol.  I guess
53 // that _pthread_descr_struct is never referenced
54 // except by pointer so there should be no issue
55 // here.
56
57 extern(C) struct _pthread_descr_struct {};
58
59 typedef _pthread_descr_struct* _pthread_descr;
60
61 struct sched_param
62 {
63     int __sched_priority;
64 }
65
66 struct pthread_attr_t
67 {
68     int     __detachstate;
69     int     __schedpolicy;
70     sched_param __schedparam;
71     int     __inheritsched;
72     int     __scope;
73     size_t  __guardsize;
74     int     __stackaddr_set;
75     void*   __stackaddr;
76     size_t  __stacksize;
77 }
78
79 // Not sure if it should be uint or long
80 typedef long __pthread_cond_align_t;
81
82 struct pthread_cond_t
83 {
84     _pthread_fastlock __c_lock;
85     _pthread_descr    __c_waiting;
86     char[48 - _pthread_fastlock.sizeof
87         - _pthread_descr.sizeof
88         - __pthread_cond_align_t.sizeof] __padding;
89     __pthread_cond_align_t __align;
90 }
91
92 struct pthread_condattr_t
93 {
94     int __dummy;
95 }
96
97 typedef uint pthread_key_t;
98
99 struct pthread_mutex_t
100 {
101     int         __m_reserved;
102     int         __m_count;
103     _pthread_descr  __m_owner;
104     int         __m_kind;
105     _pthread_fastlock __m_lock;
106 }
107
108 struct pthread_mutexattr_t
109 {
110     int __mutexkind;
111 }
112
113 typedef int pthread_once_t;
114
115 version(USE_UNIX98_OR_XOPEN2K)
116 {
117     struct pthread_rwlock_t
118     {
119         _pthread_fastlock __rw_lock;
120         int           __rw_readers;
121         _pthread_descr    __rw_writer;
122         _pthread_descr    __rw_read_waiting;
123         _pthread_descr    __rw_write_waiting;
124         int       __rw_pshared;
125     }
126
127     struct pthread_rwlockattr_t
128     {
129         int __lockkind;
130         int __pshared;
131     }
132 }
133
134 version(USE_XOPEN2K)
135 {
136     typedef int pthread_spinlock_t;
137
138     struct pthread_barrier_t
139     {
140         _pthread_fastlock __ba_lock;
141         int           __ba_required;
142         int           __ba_present;
143         _pthread_descr    __va_waiting;
144     }
145
146     struct pthread_barrierattr_t
147     {
148         int __pshared;
149     }
150 }
151
152 typedef uint pthread_t;
153
154 /************************************************
155
156    End of bits/pthreadtypes
157
158 *************************************************/
159
160
161 /************************************************
162
163   pthread start
164  
165 ************************************************/
166
167 enum
168 {
169     PTHREAD_CREATE_JOINABLE,
170     PTHREAD_CREATE_DETACHED
171 }
172        
173 enum
174 {
175     PTHREAD_INHERIT_SCHED,
176     PTHREAD_EXPLICIT_SCHED
177 }
178
179 enum
180 {
181     PTHREAD_SCOPE_SYSTEM,
182     PTHREAD_SCOPE_PROCESS
183 }
184
185 enum 
186 {
187     PTHREAD_MUTEX_TIMED_NP,
188     PTHREAD_MUTEX_RECURSIVE_NP,
189     PTHREAD_MUTEX_ERRORCHECK_NP,
190     PTHREAD_MUTEX_ADAPTIVE_NP
191 }
192
193 version(USE_GNU) enum
194 {
195     PTHREAD_MUTEX_FAST_NP = PTHREAD_MUTEX_ADAPTIVE_NP   
196 }
197
198 version(USE_UNIX98) enum
199 {  
200     PTHREAD_MUTEX_NORMAL = PTHREAD_MUTEX_TIMED_NP,
201     PTHREAD_MUTEX_RECURSIVE = PTHREAD_MUTEX_RECURSIVE_NP,
202     PTHREAD_MUTEX_ERRORCHECK = PTHREAD_MUTEX_ERRORCHECK_NP,
203     PTHREAD_MUTEX_DEFAULT = PTHREAD_MUTEX_NORMAL
204 }
205
206 enum
207 {
208     PTHREAD_PROCESS_PRIVATE,
209     PTHREAD_PROCESS_SHARED
210 }
211
212
213 version(USE_UNIX98_OR_XOPEN2K) enum
214 {
215     PTHREAD_RWLOCK_PREFER_READER_NP,
216     PTHREAD_RWLOCK_PREFER_WRITER_NP,
217     PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP,
218     PTHREAD_RWLOCK_DEFAULT_NP = PTHREAD_RWLOCK_PREFER_WRITER_NP
219 }
220
221 const int PTHREAD_ONCE_INIT = 0;
222
223 version(XOPEN2K) const int PTHREAD_BARRIER_SERIAL_THREAD = -1;
224
225 /* Cleanup buffers */
226    
227 struct _pthread_cleanup_buffer
228 {
229     void function(void*) __routine;     // Function to call.
230     void *       __arg;         // Its argument.
231     int          __canceltype;      // Saved cancellation type.
232     _pthread_cleanup_buffer *__prev;    // Chaining of cleanup functions
233 }
234
235 /* Canellation */
236
237 enum
238 {
239     PTHREAD_CANCEL_ENABLE,
240     PTHREAD_CANCEL_DISABLE
241 }
242
243 enum
244 {
245     PTHREAD_CANCEL_DEFERRED,
246     PTHREAD_CANCEL_ASYNCHRONOUS
247 }
248
249 const void* PTHREAD_CANCELED = cast(void*)-1;
250
251
252 extern(C)
253 {
254
255 int pthread_create( pthread_t*, pthread_attr_t*, void* function(void*),void*);
256 pthread_t   pthread_self ();
257 int pthread_equal( pthread_t, pthread_t );
258 void    pthread_exit( void* );
259 int pthread_join( pthread_t, void** );
260 int pthread_detach( pthread_t );
261
262 int pthread_attr_init( pthread_attr_t* );
263 int pthread_attr_destroy( pthread_attr_t* );
264 int pthread_attr_setdetachstate( pthread_attr_t*, int );
265 int pthread_attr_getdetachstate( pthread_attr_t*, int* );
266 int pthread_attr_setschedparam( pthread_attr_t*, sched_param* );
267 int pthread_attr_getschedparam( pthread_attr_t*, sched_param* );
268 int pthread_attr_setschedpolicy( pthread_attr_t*, int );
269 int pthread_attr_getschedpolicy( pthread_attr_t*, int* );
270 int pthread_attr_setinheritsched( pthread_attr_t*, int );
271 int pthread_attr_getinheritsched( pthread_attr_t*, int* );
272 int pthread_attr_setscope( pthread_attr_t*, int );   
273 int pthread_attr_getscope( pthread_attr_t*, int* );
274
275 version(USE_UNIX98) 
276 {                  
277     int pthread_attr_setguardsize( pthread_attr_t*, size_t );
278     int pthread_attr_getguardsize( pthread_attr_t*, size_t* );
279 }
280
281 int pthread_attr_setstackaddr( pthread_attr_t*, void* );
282 int pthread_attr_getstackaddr( pthread_attr_t*, void** );
283                      
284 version(USE_XOPEN2K)
285 {
286     int pthread_attr_setstack( pthread_attr_t*, void*, size_t );
287     int     pthread_attr_getstack( pthread_attr_t*, void**, size_t* );
288 }
289
290 int pthread_attr_setstacksize( pthread_attr_t*, size_t );
291 int pthread_attr_getstacksize( pthread_attr_t*, size_t* );
292                
293 version(USE_GNU)
294 {
295     int pthread_getattr_np ( pthread_t, pthread_attr_t* );
296 }
297
298 int pthread_setschedparam( pthread_t, int, sched_param* );
299 int pthread_getschedparam( pthread_t, int*, sched_param* );
300                        
301 version(USE_UNIX98)
302 {
303     int pthread_getconcurrency();
304     int pthread_setconcurrency( int );
305 }
306
307 version(USE_GNU)
308 {
309     int pthread_yield();
310 }
311
312 int pthread_mutex_init( pthread_mutex_t*, pthread_mutexattr_t* );
313 int pthread_mutex_destroy( pthread_mutex_t* );
314 int pthread_mutex_trylock( pthread_mutex_t* );
315 int pthread_mutex_lock( pthread_mutex_t* );
316
317 version(USE_XOPEN2K) 
318 {
319     int pthread_mutex_timedlock( pthread_mutex_t*, timespec* );
320 }
321
322 int pthread_mutex_unlock( pthread_mutex_t* );
323
324 int pthread_mutexattr_init( pthread_mutexattr_t* );
325 int pthread_mutexattr_destroy( pthread_mutexattr_t* );
326 int pthread_mutexattr_getpshared( pthread_mutexattr_t*, int* );
327 int pthread_mutexattr_setpshared( pthread_mutexattr_t*, int );
328                          
329 version(USE_UNIX98) 
330 {
331     int pthread_mutexattr_settype( pthread_mutexattr_t*, int );
332     int pthread_mutexattr_gettype( pthread_mutexattr_t*, int* );
333 }
334
335 int pthread_cond_init( pthread_cond_t*, pthread_condattr_t* );
336 int pthread_cond_destroy( pthread_cond_t* );
337 int pthread_cond_signal( pthread_cond_t* );
338 int pthread_cond_wait( pthread_cond_t*, pthread_mutex_t* );
339 int pthread_cond_timewait( pthread_cond_t*, pthread_mutex_t*, timespec* );
340    
341 int pthread_condattr_init( pthread_condattr_t* );
342 int pthread_condattr_destroy( pthread_condattr_t* );
343 int pthread_condattr_getpshared( pthread_condattr_t*, int* );
344 int pthread_condattr_setpshared( pthread_condattr_t*, int );
345                    
346 version (USE_UNIX98_OR_XOPEN2K)
347 {
348     int     pthread_rwlock_init( pthread_rwlock_t*,pthread_rwlockattr_t* );
349     int     pthread_rwlock_destroy( pthread_rwlock_t* );
350     int pthread_rwlock_rdlock( pthread_rwlock_t* );
351     int pthread_rwlock_tryrdlock( pthread_rwlock_t* );
352     int pthread_rwlock_wrlock( pthread_rwlock_t* );
353     int pthread_rwlock_trywrlock( pthread_rwlock_t* );
354     int pthread_rwlock_unlock( pthread_rwlock_t* );
355
356     int pthread_rwlockattr_init( pthread_rwlockattr_t* );
357     int pthread_rwlockattr_destroy( pthread_rwlockattr_t* );
358     int pthread_rwlockattr_getpshared( pthread_rwlockattr_t*, int* );
359     int pthread_rwlockattr_setpshared( pthread_rwlockattr_t*, int );
360     int pthread_rwlockattr_getkind_np( pthread_rwlockattr_t*, int* );
361     int pthread_rwlockattr_setkind_np( pthread_rwlockattr_t*, int );
362 }
363
364 version(USE_XOPEN2K) 
365 {
366     int pthread_rwlock_timedrdlock( pthread_rwlock_t*, timespec* );
367     int pthread_rwlock_timedwrlock( pthread_rwlock_t*, timespec* );
368
369 /*  Spinlocks -- IEEE Std. 1003.1j-2000. */
370
371     int pthread_spin_init( pthread_spinlock_t*, int );
372     int pthread_spin_destroy( pthread_spinlock_t* );
373     int pthread_spin_lock( pthread_spinlock_t* );
374     int pthread_spin_trylock( pthread_spinlock_t* );
375     int pthread_spin_unlock( pthread_spinlock_t* );
376
377 /* Barriers -- IEEE Std. 1003.1j-2000. */
378
379     int pthread_barrier_init( pthread_barrier_t*, pthread_barrierattr_t*, uint );
380     int pthread_barrier_destory( pthread_barrier_t* );
381     int pthread_barrerattr_init( pthread_barrierattr_t* );
382     int pthread_barrerattr_destroy( pthread_barrierattr_t* );
383     int pthread_barrierattr_getpshared( pthread_barrierattr_t*,int* );
384     int pthread_barrierattr_setpshared( pthread_barrierattr_t*,int );
385     int pthread_barrier_wait( pthread_barrier_t* __barrier );   
386 }
387
388 int pthread_key_create( pthread_key_t*, void (*)(void*) );
389 int pthread_key_delete( pthread_key_t );
390 int pthread_setspecific( pthread_key_t, void* );
391 void*   pthread_getspecific( pthread_key_t );
392
393 int pthread_once( pthread_once_t*, void (*)() );
394
395 int pthread_setcancelstate( int, int* );
396 int pthread_setcanceltype( int, int* );
397 int pthread_cancel( pthread_t );
398 void    pthread_testcancel();
399 void    _pthread_cleanup_push( _pthread_cleanup_buffer*,void function(void*),void* );
400 void    _pthread_cleanup_pop( _pthread_cleanup_buffer*, int );
401
402    
403 version(USE_XOPEN2K) 
404 {
405     typedef int __clockid_t;   
406
407     int pthread_getcpuclockid( pthread_t, __clockid_t* );
408 }
409
410 version(USE_UNIX98) 
411 {
412     struct __sigset_t
413     {
414         uint[1024/(8*uint.sizeof)] __val;
415     }
416
417     int pthread_sigmask( int, __sigset_t*, __sigset_t* );
418     int pthread_kill( pthread_t, int );
419 }
420
421 int pthread_atfork( void function(), void function(), void function() );
422 void    pthread_kill_other_threads_np();
423
424 } // extern(C)     
425
426 /***************************************************************
427
428     Semaphores -- part of pthreads
429
430  ***************************************************************/
431
432 /* System specific semaphore definition. */
433
434 version(linux)
435 {
436     struct sem_t
437     {
438         _pthread_fastlock __sem_lock;
439         int           __sem_value;
440         _pthread_descr    __sem_waiting;
441     }
442 } 
443
444 else 
445 {
446     struct sem_t{};  // other versions should implement
447 }
448
449 const sem_t* SEM_FAILED = null;
450 const uint   SEM_VALUE_MAX = 2_147_483_647;
451
452 /* Semaphores */
453
454 extern(C)
455 {
456 int sem_init( sem_t *, int );
457 int sem_destory( sem_t* );
458 sem_t* sem_open( char*, int, ... );
459 int sem_close( sem_t* );
460 int sem_unlink( char* );
461 int sem_wait( sem_t* );
462    
463 version(USE_XOPEN2K)
464     int sem_timedwait(sem_t*, timespec* );
465
466 int sem_trywait( sem_t* );
467 int sem_post( sem_t* );
468 int sem_getvalue( sem_t*, int* );
469
470 } // extern(C)
471
472    
473
474
475
476
477
478
479
480    
Note: See TracBrowser for help on using the browser.