1{ 2 This file is part of the Free Pascal run time library. 3 Copyright (c) 1999-2000 by Peter Vreman 4 Copyright (c) 2011 by Jonas Maebe 5 members of the Free Pascal development team. 6 7 See the file COPYING.FPC, included in this distribution, 8 for details about the copyright. 9 10 This file contains a pthread.h headerconversion, 11 and should contain an interface to the threading library to be 12 used by systhrd, preferably in a somewhat compatible notation 13 (compared to the other OSes). 14 15 As a start, I simply used libc_r 16 17 This program is distributed in the hope that it will be useful, 18 but WITHOUT ANY WARRANTY; without even the implied warranty of 19 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 20 21 **********************************************************************} 22 23 const 24 PTHREAD_EXPLICIT_SCHED = 1; 25 PTHREAD_INHERIT_SCHED = 0; 26 PTHREAD_CREATE_DETACHED = 1; 27 PTHREAD_SCOPE_PROCESS = 1; 28 29 _PTHREAD_MUTEX_NORMAL = 5; 30 _PTHREAD_MUTEX_ERRORCHECK = 3; 31 _PTHREAD_MUTEX_RECURSIVE = 4; 32 33 type 34 sched_param = record 35 __sched_priority: cint; 36 __sched_policy : cint; 37 __sched_reserved: array[0..5] of cint; 38 end; 39 40 sem_t = cint; 41 42 psem_t = ^sem_t; 43 TSemaphore = sem_t; 44 PSemaphore = ^TSemaphore; 45 46 47 ppthread_t = ^pthread_t; 48 ppthread_key_t = ^pthread_key_t; 49 ppthread_mutex_t = ^pthread_mutex_t; 50 ppthread_attr_t = ^pthread_attr_t; 51 __destr_func_t = procedure (p :pointer);cdecl; 52 __startroutine_t = function (p :pointer):pointer;cdecl; 53 ppthread_mutexattr_t = ^pthread_mutexattr_t; 54 ppthread_cond_t = ^pthread_cond_t; 55 ppthread_condattr_t = ^pthread_condattr_t; 56 57 pthread_spinlock_t = record 58{$ifdef cpu64} 59 __sp_word: array[0..2] of clong; 60{$else} 61 __sp_word: array[0..5] of cint; 62{$endif} 63 end; 64 65 _once = record 66{$ifdef cpu64} 67 __on_word: array[0..8] of clong; 68{$else} 69 __on_word: array[0..27] of cint; 70{$endif} 71 end; 72 73 pthread_once_t = _once; 74 75 pthread_barrier_t = record 76{$ifdef cpu64} 77 __ba_word: array[0..4] of clong; 78{$else} 79 __ba_word: array[0..7] of cint; 80{$endif} 81 end; 82 83 pthread_barrierattr_t = pointer; 84 85function pthread_getspecific (t : pthread_key_t):pointer; cdecl; external 'c'; 86function pthread_setspecific (t : pthread_key_t;p:pointer):cint; cdecl; external 'c'; 87function pthread_key_create (p : ppthread_key_t;f: __destr_func_t):cint; cdecl;external 'c'; 88function pthread_attr_init (p : ppthread_key_t):cint; cdecl; external 'c'; 89function pthread_attr_destroy(_para1:Ppthread_attr_t):cint;cdecl;external 'c'; 90function pthread_attr_setinheritsched(p : ppthread_attr_t;i:cint):cint; cdecl; external 'c'; 91function pthread_attr_setscope (p : ppthread_attr_t;i:cint):cint;cdecl;external 'c'; 92function pthread_attr_setdetachstate (p : ppthread_attr_t;i:cint):cint;cdecl;external 'c'; 93function pthread_attr_setstacksize(p: ppthread_attr_t; stacksize: size_t):cint;cdecl;external 'c'; 94function pthread_create ( p: ppthread_t;attr : ppthread_attr_t;f:__startroutine_t;arg:pointer):cint;cdecl;external 'c'; 95procedure pthread_exit ( p: pointer); cdecl;external 'c'; 96function pthread_self:pthread_t; cdecl;external 'c'; 97function pthread_mutex_init (p:ppthread_mutex_t;o:ppthread_mutexattr_t):cint; cdecl;external 'c'; 98function pthread_mutex_destroy (p:ppthread_mutex_t):cint; cdecl;external 'c'; 99function pthread_mutex_lock (p:ppthread_mutex_t):cint; cdecl;external 'c'; 100function pthread_mutex_trylock (p:ppthread_mutex_t):cint; cdecl;external 'c'; 101function pthread_mutex_unlock (p:ppthread_mutex_t):cint; cdecl;external 'c'; 102function pthread_cancel(_para1:pthread_t):cint;cdecl;external 'c'; 103function pthread_detach(_para1:pthread_t):cint;cdecl;external 'c'; 104function pthread_join(_para1:pthread_t; _para2:Ppointer):cint;cdecl;external 'c'; 105function pthread_cond_destroy(_para1:Ppthread_cond_t):cint;cdecl;external 'c' name 'pthread_cond_destroy'; 106function pthread_cond_init(_para1:Ppthread_cond_t;_para2:Ppthread_condattr_t):cint;cdecl;external 'c' name 'pthread_cond_init'; 107function pthread_cond_signal(_para1:Ppthread_cond_t):cint;cdecl;external 'c' name 'pthread_cond_signal'; 108function pthread_cond_broadcast(_para1:Ppthread_cond_t):cint;cdecl;external 'c' name 'pthread_cond_broadcast'; 109function pthread_cond_wait(_para1:Ppthread_cond_t;_para2:Ppthread_mutex_t):cint;cdecl;external 'c' name 'pthread_cond_wait'; 110function pthread_kill(__thread:pthread_t; __signo:cint):cint;cdecl;external 'c'; 111function pthread_sigmask(how: cint; nset: psigset; oset: psigset): cint; cdecl; external 'c'; 112 113function sem_init(__sem:Psem_t; __pshared:cint;__value:cuint):cint;cdecl; external 'c' name 'sem_init'; 114function sem_destroy(__sem:Psem_t):cint;cdecl;external 'c' name 'sem_destroy'; 115function sem_close(__sem:Psem_t):cint;cdecl;external 'c' name 'sem_close'; 116function sem_unlink(__name:Pchar):cint;cdecl;external 'c' name 'sem_unlink'; 117function sem_wait(__sem:Psem_t):cint;cdecl;external 'c' name 'sem_wait'; 118function sem_timedwait(__sem: Psem_t; const __timespec: ptimespec): cint;cdecl; external 'c' name 'sem_timedwait'; 119function sem_trywait(__sem:Psem_t):cint;cdecl;external 'c' name 'sem_trywait'; 120function sem_post(__sem:Psem_t):cint;cdecl;external 'c' name 'sem_post'; 121function sem_getvalue(__sem:Psem_t; __sval:Pcint):cint;cdecl;external 'c' name 'sem_getvalue'; 122 123 124function pthread_mutexattr_init(_para1:Ppthread_mutexattr_t):cint;cdecl;external 'c' name 'pthread_mutexattr_init'; 125function pthread_mutexattr_destroy(_para1:Ppthread_mutexattr_t):cint;cdecl;external 'c' name 'pthread_mutexattr_destroy'; 126function pthread_mutexattr_gettype(_para1:Ppthread_mutexattr_t; _para2:Pcint):cint;cdecl;external 'c' name 'pthread_mutexattr_gettype'; 127function pthread_mutexattr_settype(_para1:Ppthread_mutexattr_t; _para2:cint):cint;cdecl;external 'c' name 'pthread_mutexattr_settype'; 128function pthread_cond_timedwait(__cond:ppthread_cond_t; __mutex:ppthread_mutex_t; __abstime:ptimespec):cint; cdecl;external 'c' name 'pthread_cond_timedwait'; 129 130