Pārlūkot izejas kodu

* fixed definition of pthread_mutex_t for non-linux targets (and for
linux as well, actually).
* base libpthread definitions are now in ptypes.inc, included in unixtype
They sometimes have an extra underscore in front of their name, in
case they were also exported by the packages/base/pthreads unit, so
they can keep their original name there
* cthreadds unit now imports systuils, because it uses exceptions (it
already did so before as well)
* fixed many linux definitions of libpthread functions in pthrlinux.inc
(integer -> cint etc)
+ added culonglong type to ctype.inc

Jonas Maebe 21 gadi atpakaļ
vecāks
revīzija
159912ec47

+ 28 - 48
packages/base/pthreads/pthrbsd.inc

@@ -67,7 +67,7 @@
     }
 
 
-CONST ULONG_MAX= high(cardinal);
+CONST ULONG_MAX= high(culong);
 
 type
 
@@ -80,9 +80,18 @@ type
      psigset_t = ^sigset; 
 
 const
+    PTHREAD_MUTEX_NORMAL     = _PTHREAD_MUTEX_NORMAL;
+    PTHREAD_MUTEX_ERRORCHECK = _PTHREAD_MUTEX_ERRORCHECK;
+    PTHREAD_MUTEX_RECURSIVE  = _PTHREAD_MUTEX_RECURSIVE;
+
+     PTHREAD_MUTEX_DEFAULT    = _PTHREAD_MUTEX_NORMAL;
+     MUTEX_TYPE_FAST          = _PTHREAD_MUTEX_NORMAL;
+     MUTEX_TYPE_COUNTING_FAST = _PTHREAD_MUTEX_RECURSIVE;
+
+
      PTHREAD_DESTRUCTOR_ITERATIONS = 4;
-     PTHREAD_KEYS_MAX 		   = 256;
-     PTHREAD_STACK_MIN 		   = 1024;
+     PTHREAD_KEYS_MAX 		   = _PTHREAD_KEYS_MAX;
+     PTHREAD_STACK_MIN 		   = _PTHREAD_STACK_MIN;
      PTHREAD_THREADS_MAX 	   = ULONG_MAX;
     {
      Flags for threads and thread attributes.
@@ -119,11 +128,9 @@ const
   type
 { from semaphore.h }
 
-     sem 		= record end;
-     sem_t		= ^sem;
-     psem_t		= ^sem_t;
+     psem_t = ^sem_t;
      TSemaphore 	= sem_t;
-     PSemaphore         = ^TSemaphore;
+     PSemaphore   = ^TSemaphore;
 
     {
      Primitive system data type definitions required by P1003.1c.
@@ -133,17 +140,6 @@ const
      pthread_condattr_t, pthread_mutex_t, pthread_mutexattr_t.
     }
 
-     pthread_t 			= record a: array[0..DWORDS_IN_PTHREAD_T-1] of dword; end;
-     pthread_attr_t 		= record a: array[0..DWORDS_IN_PTHREAD_ATTR_T-1] of dword; end;
-     pthread_mutex_t 		= record a: array[0..DWORDS_IN_PTHREAD_MUTEX_T-1] of dword; end;
-     pthread_mutexattr_t 	= record a: array[0..DWORDS_IN_PTHREAD_MUTEXATTR_T-1] of dword; end;
-     pthread_cond_t 		= record a: array[0..DWORDS_IN_PTHREAD_COND_T-1] of dword; end;
-     pthread_condattr_t 	= record a: array[0..DWORDS_IN_PTHREAD_COND_ATTR_T-1] of dword; end;
-{    moved to ptypes.inc because not the same on all systems }
-{     pthread_key_t 		= cint; }
-     pthread_rwlock_t 		= record a: array[0..DWORDS_IN_PTHREAD_RWLOCK_T-1] of dword; end;
-     pthread_rwlockattr_t 	= record a: array[0..DWORDS_IN_PTHREAD_RWLOCK_ATTR_T-1] of dword; end;
-
      TThreadID = pthread_t;
      PThreadID = ^TThreadID;
      TThreadAttr = pthread_attr_t;
@@ -235,35 +231,6 @@ const
        PTHREAD_PRIO_INHERIT 		= 1;
        PTHREAD_PRIO_PROTECT 		= 2;
 
-    {
-       Mutex types (Single UNIX Specification, Version 2, 1997).
-      
-       Note that a mutex attribute with one of the following types:
-      
-      	PTHREAD_MUTEX_NORMAL
-      	PTHREAD_MUTEX_RECURSIVE
-            MUTEX_TYPE_FAST (deprecated)
-      	MUTEX_TYPE_COUNTING_FAST (deprecated)
-      
-       will deviate from POSIX specified semantics.
-      }
-    { Default POSIX mutex  }
-    { Recursive mutex  }
-    { No error checking  }
-
-    type
-       pthread_mutextype = (
-	PTHREAD_MUTEX_ERRORCHECK := 1,
-	 PTHREAD_MUTEX_RECURSIVE := 2,
-         PTHREAD_MUTEX_NORMAL    := 3,
-	MUTEX_TYPE_MAX
-         );
-
-
-    const
-       PTHREAD_MUTEX_DEFAULT 		= PTHREAD_MUTEX_ERRORCHECK;
-       MUTEX_TYPE_FAST 			= PTHREAD_MUTEX_NORMAL;
-       MUTEX_TYPE_COUNTING_FAST 	= PTHREAD_MUTEX_RECURSIVE;
     {
        Thread function prototype definitions:
       }
@@ -395,7 +362,20 @@ function pthread_attr_getfloatstate(_para1:Ppthread_attr_t; _para2:Pcint):cint;c
 
 {  
    $Log$
-   Revision 1.5  2004-08-25 21:42:11  jonas
+   Revision 1.6  2004-09-09 20:29:06  jonas
+     * fixed definition of pthread_mutex_t for non-linux targets (and for
+       linux as well, actually).
+     * base libpthread definitions are now in ptypes.inc, included in unixtype
+       They sometimes have an extra underscore in front of their name, in
+       case they were also exported by the packages/base/pthreads unit, so
+       they can keep their original name there
+     * cthreadds unit now imports systuils, because it uses exceptions (it
+       already did so before as well)
+     * fixed many linux definitions of libpthread functions in pthrlinux.inc
+       (integer -> cint etc)
+     + added culonglong type to ctype.inc
+
+   Revision 1.5  2004/08/25 21:42:11  jonas
      * fixed pthread type definitions for darwin and made them generic
 
    Revision 1.4  2004/02/15 19:59:20  marco

+ 2 - 0
packages/base/pthreads/pthreads.pp

@@ -30,6 +30,8 @@ Uses BaseUnix, unixtype;
 {$i pthrbsd.inc}
 
 {$else}
+uses unixtype;
+
 {$i pthrlinux.inc}
 {$endif}
                 

+ 218 - 256
packages/base/pthreads/pthrlinux.inc

@@ -13,16 +13,27 @@
 
 **********************************************************************}
 
-  {
+  (*
   #define PTHREAD_MUTEX_INITIALIZER {0, 0, 0, PTHREAD_MUTEX_TIMED_NP, __LOCK_INITIALIZER}
   #define PTHREAD_COND_INITIALIZER {__LOCK_INITIALIZER, 0}
-   }
+   *)
 
   { Values for attributes.   }
 
 Const
   LibThreads = 'pthread';
 
+  PTHREAD_MUTEX_TIMED_NP      = _PTHREAD_MUTEX_TIMED_NP;
+  PTHREAD_MUTEX_RECURSIVE_NP  = _PTHREAD_MUTEX_RECURSIVE_NP;
+  PTHREAD_MUTEX_ERRORCHECK_NP = _PTHREAD_MUTEX_ERRORCHECK_NP;
+  PTHREAD_MUTEX_ADAPTIVE_NP   = _PTHREAD_MUTEX_ADAPTIVE_NP;
+    
+  PTHREAD_MUTEX_NORMAL     = PTHREAD_MUTEX_TIMED_NP;
+  PTHREAD_MUTEX_RECURSIVE  = PTHREAD_MUTEX_RECURSIVE_NP;
+  PTHREAD_MUTEX_ERRORCHECK = PTHREAD_MUTEX_ERRORCHECK_NP;
+  PTHREAD_MUTEX_DEFAULT    = PTHREAD_MUTEX_NORMAL;
+  PTHREAD_MUTEX_FAST_NP    = PTHREAD_MUTEX_ADAPTIVE_NP;
+
   PTHREAD_CREATE_JOINABLE = 0;
   PTHREAD_CREATE_DETACHED = 1;
 
@@ -35,17 +46,6 @@ Const
   NONRECURSIVE  = 0;
   RECURSIVE     = 1;
 
-  PTHREAD_MUTEX_TIMED_NP      = 0;
-  PTHREAD_MUTEX_RECURSIVE_NP  = 1;
-  PTHREAD_MUTEX_ERRORCHECK_NP = 2;
-  PTHREAD_MUTEX_ADAPTIVE_NP   = 3;
-
-  PTHREAD_MUTEX_NORMAL     = PTHREAD_MUTEX_TIMED_NP;
-  PTHREAD_MUTEX_RECURSIVE  = PTHREAD_MUTEX_RECURSIVE_NP;
-  PTHREAD_MUTEX_ERRORCHECK = PTHREAD_MUTEX_ERRORCHECK_NP;
-  PTHREAD_MUTEX_DEFAULT    = PTHREAD_MUTEX_NORMAL;
-  PTHREAD_MUTEX_FAST_NP    = PTHREAD_MUTEX_ADAPTIVE_NP;
-                                      
   PTHREAD_PROCESS_PRIVATE = 0;
   PTHREAD_PROCESS_SHARED  = 1;
   
@@ -77,27 +77,24 @@ type
    
 type
   // inserted.
-  Size_t = cardinal;
   PSize_t = ^Size_t;
-  PCardinal =  ^Cardinal;
   
   // From scheduler.
   
   timespec =  record
-    tv_sec: Longint; 
-    tv_nsec: Longint; 
+    tv_sec: cint; 
+    tv_nsec: cint; 
   end;
   TTimeSpec = timespec;
   PTimeSpec = ^TTimeSpec;
 
   // procedural types used in parameters to pthread functions
   
-  TStartRoutine = function (_para1:pointer): integer; cdecl;
+  TStartRoutine = function (_para1:pointer): cint; cdecl;
   TKeyValueDestructor = procedure(ValueInKey: Pointer); cdecl;
   TInitOnceProc = Procedure;cdecl;
   TForkHandler = procedure; cdecl;
 
-  PTHREAD_T  = cardinal;
   TThreadID = pthread_t;
   PPTHREAD_T = ^PTHREAD_T;
   PThreadID = ^TThreadID;
@@ -108,49 +105,24 @@ type
   P_PTHREAD_DESCR = ^_PTHREAD_DESCR;
   
   sched_param = record
-    sched_priority: Integer;
+    sched_priority: cint;
   end;
   Psched_param = ^sched_param;  
   TSchedParam = sched_param;
   PSchedParam = ^TSchedParam;
 
-  pthread_attr_t = record
-    __detachstate,
-    __schedpolicy: Integer;
-    __schedparam: TSchedParam;
-    __inheritsched,
-    __scope: Integer;
-    __guardsize: Size_T;
-    __stackaddr_set: Integer;
-    __stackaddr: Pointer;
-    __stacksize: Size_T;
-  end;
   ppthread_attr_t = ^pthread_attr_t;
   TThreadAttr = pthread_attr_t;
   PThreadAttr = ^TThreadAttr;
   
-  _pthread_fastlock = record
-    __status: Longint;
-    __spinlock: Integer;
-  end;
   p_pthread_fastlock = ^_pthread_fastlock; 
   TPthreadFastlock = _pthread_fastlock;
   PPthreadFastlock = ^TPthreadFastlock;
   
-  PTHREAD_MUTEX_T =  record
-    __m_reserved: Integer;
-    __m_count: Integer; 
-    __m_owner: _pthread_descr; 
-    __m_kind: Integer;   
-    __m_lock: _pthread_fastlock;  
-  end;
   PPTHREAD_MUTEX_T = ^PTHREAD_MUTEX_T;  
   TPthreadMutex = PTHREAD_MUTEX_T;
   PPthreadMutex = ^TPthreadMutex;
   
-  pthread_mutexattr_t = {packed} record
-    __mutexkind: Integer;
-  end;
   TMutexAttribute = pthread_mutexattr_t;
   PMutexAttribute = ^TMutexAttribute;
   PPTHREAD_MUTEXATTR_T = ^pthread_mutexattr_t;
@@ -162,7 +134,7 @@ type
   _pthread_cleanup_buffer = {packed} record
     __routine: TPThreadCleanupRoutine;    { Function to call.  }
     __arg: Pointer;                       { Its argument.  }
-    __canceltype: Integer;                { Saved cancellation type. }
+    __canceltype: cint;                { Saved cancellation type. }
     __prev: p_pthread_Cleanup_Buffer;        { Chaining of cleanup functions.  }
   end;
   TPthreadCleanupBuffer = _pthread_cleanup_buffer;  
@@ -176,68 +148,45 @@ type
   PCondVar = ^TCondVar;
 
   pthread_condattr_t = record
-    __dummy: Integer;
+    __dummy: cint;
   end;
   Ppthread_condattr_t = ^pthread_condattr_t;
   TPthreadCondattr = pthread_condattr_t;
   PPthreadCondattr = ^TPthreadCondattr;
 
-  pthread_key_t = Cardinal;
   ppthread_key_t = ^pthread_key_t;
   TPThreadKey = pthread_key_t;
   PPThreadKey = ^TPThreadKey;
-       
-  pthread_once_t = Integer;
+
+  pthread_once_t = cint;       
   Ppthread_once_t = ^pthread_once_t;
   TPThreadOnce = pthread_once_t;
   PPThreadOnce = ^pthread_once_t;
 
-  __sem_lock_t = record 
-    status: Longint;
-    spinlock: Integer;
-  end;
-  TSemLock = __sem_lock_t;
+  TSemLock = _pthread_fastlock;
   PSemLock = ^TSemLock;
 
-  sem_t = record
-    __sem_lock: __sem_lock_t;
-    __sem_value: Integer;
-    __sem_waiting: _pthread_descr;
-  end;
   psem_t = ^sem_t;
   TSemaphore = sem_t;
   PSemaphore = ^TSemaphore;
 
-  pthread_rwlock_t = record
-    __rw_lock: _pthread_fastlock;
-    __rw_readers: Integer;
-    __rw_writer: _pthread_descr;
-    __rw_read_waiting: _pthread_descr;
-    __rw_write_waiting: _pthread_descr;
-    __rw_kind: Integer;
-    __rw_pshared: Integer;
-  end;
   ppthread_rwlock_t = ^pthread_rwlock_t;
   TPthreadRWlock = pthread_rwlock_t;
   PPthreadRWlock = ^TPthreadRWlock;
 
-  pthread_rwlockattr_t = {packed} record
-    __lockkind: Integer;
-    __pshared: Integer;
-  end;
   ppthread_rwlockattr_t = ^pthread_rwlockattr_t;
   TPthreadRWlockAttribute = pthread_rwlockattr_t;
   PPthreadRWlockAttribute = ^TPthreadRWlockAttribute;
 
-  pthread_spinlock_t = Integer;
+  pthread_spinlock_t = cint;
   ppthread_spinlock_t = ^pthread_spinlock_t;
   TPthreadSpinlock = pthread_spinlock_t;
   PTPthreadSpinlock = ^TPthreadSpinlock;        
         
   pthread_barrier_t = record
     __ba_lock: _pthread_fastlock;
-    __ba_required: Integer;
-    __ba_present: Integer;
+    __ba_required: cint;
+    __ba_present: cint;
     __ba_waiting: _pthread_descr;
   end;
   ppthread_barrier_t = ^pthread_barrier_t;
@@ -245,7 +194,7 @@ type
   PPthreadBarrier = ^TPthreadBarrier;
 
   pthread_barrierattr_t = record
-    __pshared: Integer;
+    __pshared: cint;
   end;
   ppthread_barrierattr_t = ^pthread_barrierattr_t;
   TPthreadBarrierAttribute = pthread_barrierattr_t;
@@ -256,202 +205,215 @@ type
   ---------------------------------------------------------------------}
   
           
-  function pthread_create(__thread:Ppthread_t; __attr:Ppthread_attr_t; __start_routine:TStartRoutine; __arg:pointer):longint;cdecl; external libthreads;
+  function pthread_create(__thread:Ppthread_t; __attr:Ppthread_attr_t; __start_routine:TStartRoutine; __arg:pointer):cint;cdecl; external libthreads;
   function pthread_self:pthread_t;cdecl; external libthreads;
-  function pthread_equal(__thread1:pthread_t; __thread2:pthread_t):longint;cdecl; external libthreads;
+  function pthread_equal(__thread1:pthread_t; __thread2:pthread_t):cint;cdecl; external libthreads;
   procedure pthread_exit(__retval:pointer);cdecl; external libthreads;
-  function pthread_join(__th:pthread_t; __thread_return:Ppointer):longint;cdecl; external libthreads;
-  function pthread_detach(__th:pthread_t):longint;cdecl; external libthreads;
-  function pthread_attr_init(__attr:Ppthread_attr_t):longint;cdecl; external libthreads;
-  function pthread_attr_destroy(__attr:Ppthread_attr_t):longint;cdecl; external libthreads;
-  function pthread_attr_setdetachstate(__attr:Ppthread_attr_t; __detachstate:longint):longint;cdecl; external libthreads;
-  function pthread_attr_getdetachstate(__attr:Ppthread_attr_t; __detachstate:Plongint):longint;cdecl; external libthreads;
-  function pthread_attr_setschedparam(__attr:Ppthread_attr_t; __param:Psched_param):longint;cdecl; external libthreads;
-  function pthread_attr_getschedparam(__attr:Ppthread_attr_t; __param:Psched_param):longint;cdecl; external libthreads;
-  function pthread_attr_setschedpolicy(__attr:Ppthread_attr_t; __policy:longint):longint;cdecl; external libthreads;
-  function pthread_attr_getschedpolicy(__attr:Ppthread_attr_t; __policy:Plongint):longint;cdecl; external libthreads;
-  function pthread_attr_setinheritsched(__attr:Ppthread_attr_t; __inherit:longint):longint;cdecl; external libthreads;
-  function pthread_attr_getinheritsched(__attr:Ppthread_attr_t; __inherit:Plongint):longint;cdecl; external libthreads;
-  function pthread_attr_setscope(__attr:Ppthread_attr_t; __scope:longint):longint;cdecl; external libthreads;
-  function pthread_attr_getscope(__attr:Ppthread_attr_t; __scope:Plongint):longint;cdecl; external libthreads;
-  function pthread_attr_setstackaddr(__attr:Ppthread_attr_t; __stackaddr:pointer):longint;cdecl; external libthreads;
-  function pthread_attr_getstackaddr(__attr:Ppthread_attr_t; __stackaddr:Ppointer):longint;cdecl; external libthreads;
-  function pthread_attr_setstacksize(__attr:Ppthread_attr_t; __stacksize:size_t):longint;cdecl; external libthreads;
-  function pthread_attr_getstacksize(__attr:Ppthread_attr_t; __stacksize:Psize_t):longint;cdecl; external libthreads;
-  function pthread_attr_getguardsize(__attr:Ppthread_attr_t; Guardsize: PCardinal): Integer; cdecl;external libthreads;
-  function pthread_attr_setguardsize(__attr:Ppthread_attr_t; Guardsize: Cardinal): Integer; cdecl;external libthreads;
-  function pthread_setschedparam(__target_thread:pthread_t; __policy:longint; __param:Psched_param):longint;cdecl; external libthreads;
-  function pthread_getschedparam(__target_thread:pthread_t; __policy:Plongint; __param:Psched_param):longint;cdecl; external libthreads;
-  function pthread_getconcurrency: Integer; cdecl;external libthreads;
-  function pthread_setconcurrency(Level: Integer): Integer; cdecl;external libthreads;
-  function pthread_yield(): Integer; cdecl;external libthreads;
-  function pthread_mutex_init(__mutex:Ppthread_mutex_t; __mutex_attr:Ppthread_mutexattr_t):longint;cdecl; external libthreads;
-  function pthread_mutex_destroy(__mutex:Ppthread_mutex_t):longint;cdecl; external libthreads;
-  function pthread_mutex_trylock(__mutex:Ppthread_mutex_t):longint;cdecl; external libthreads;
-  function pthread_mutex_lock(__mutex:Ppthread_mutex_t):longint;cdecl; external libthreads;
-  function pthread_mutex_unlock(__mutex:Ppthread_mutex_t):longint;cdecl; external libthreads;
-  function pthread_mutexattr_init(__attr:Ppthread_mutexattr_t):longint;cdecl; external libthreads;
-  function pthread_mutexattr_destroy(__attr:Ppthread_mutexattr_t):longint;cdecl; external libthreads;
-  function pthread_mutexattr_getpshared(__attr:Ppthread_mutexattr_t; __pshared:Plongint):longint;cdecl; external libthreads;
-  function pthread_mutexattr_setpshared(__attr:Ppthread_mutexattr_t; __pshared:longint):longint;cdecl; external libthreads;
-  function pthread_mutexattr_settype(__attr: Ppthread_mutexattr_t; Kind: Integer): Integer; cdecl;external libthreads;
-  function pthread_mutexattr_gettype(__attr: Ppthread_mutexattr_t; var Kind: Integer): Integer; cdecl;external libthreads;
-  function pthread_cond_init(__cond:Ppthread_cond_t; __cond_attr:Ppthread_condattr_t):longint;cdecl; external libthreads;
-  function pthread_cond_destroy(__cond:Ppthread_cond_t):longint;cdecl; external libthreads;
-  function pthread_cond_signal(__cond:Ppthread_cond_t):longint;cdecl; external libthreads;
-  function pthread_cond_broadcast(__cond:Ppthread_cond_t):longint;cdecl; external libthreads;
-  function pthread_cond_wait(__cond:Ppthread_cond_t; __mutex:Ppthread_mutex_t):longint;cdecl; external libthreads;
-  function pthread_cond_timedwait(__cond:Ppthread_cond_t; __mutex:Ppthread_mutex_t; __abstime:Ptimespec):longint;cdecl; external libthreads;
-  function pthread_condattr_init(__attr:Ppthread_condattr_t):longint;cdecl; external libthreads;
-  function pthread_condattr_destroy(__attr:Ppthread_condattr_t):longint;cdecl; external libthreads;
-  function pthread_condattr_getpshared(__attr:Ppthread_condattr_t; __pshared:Plongint):longint;cdecl; external libthreads;
-  function pthread_condattr_setpshared(__attr:Ppthread_condattr_t; __pshared:longint):longint;cdecl; external libthreads;
-  function pthread_rwlock_init(__rwlock:Ppthread_rwlock_t; __attr:Ppthread_rwlockattr_t):longint;cdecl; external libthreads;
-  function pthread_rwlock_destroy(__rwlock:Ppthread_rwlock_t):longint;cdecl;external libthreads;
-  function pthread_rwlock_rdlock(__rwlock:Ppthread_rwlock_t):longint;cdecl;external libthreads;
-  function pthread_rwlock_tryrdlock(__rwlock:Ppthread_rwlock_t):longint;cdecl;external libthreads;
-  function pthread_rwlock_timedrdlock(__rwlock:Ppthread_rwlock_t; __abstime:Ptimespec):longint;cdecl;external libthreads;
-  function pthread_rwlock_wrlock(__rwlock:Ppthread_rwlock_t):longint;cdecl;external libthreads;
-  function pthread_rwlock_trywrlock(__rwlock:Ppthread_rwlock_t):longint;cdecl; external libthreads;
-  function pthread_rwlock_timedwrlock(__rwlock:Ppthread_rwlock_t; __abstime:Ptimespec):longint;cdecl;external libthreads;
-  function pthread_rwlock_unlock(__rwlock:Ppthread_rwlock_t):longint;cdecl;external libthreads;
-  function pthread_rwlockattr_init(__attr:Ppthread_rwlockattr_t):longint;cdecl;external libthreads;
-  function pthread_rwlockattr_destroy(__attr:Ppthread_rwlockattr_t):longint;cdecl;external libthreads;
-  function pthread_rwlockattr_getpshared(__attr:Ppthread_rwlockattr_t; __pshared:Plongint):longint;cdecl;external libthreads;
-  function pthread_rwlockattr_setpshared(__attr:Ppthread_rwlockattr_t; __pshared:longint):longint;cdecl;external libthreads;
-  function pthread_rwlockattr_getkind_np(__attr:Ppthread_rwlockattr_t; __pref:Plongint):longint;cdecl;external libthreads;
-  function pthread_rwlockattr_setkind_np(__attr:Ppthread_rwlockattr_t; __pref:longint):longint;cdecl;external libthreads;
-  function pthread_spin_init(__lock:Ppthread_spinlock_t; __pshared:longint):longint;cdecl;external libthreads;
-  function pthread_spin_destroy(__lock:Ppthread_spinlock_t):longint;cdecl;external libthreads;
-  function pthread_spin_lock(__lock:Ppthread_spinlock_t):longint;cdecl;external libthreads;
-  function pthread_spin_trylock(__lock:Ppthread_spinlock_t):longint;cdecl;external libthreads;
-  function pthread_spin_unlock(__lock:Ppthread_spinlock_t):longint;cdecl;external libthreads;
-  function pthread_barrier_init(__barrier:Ppthread_barrier_t; __attr:Ppthread_barrierattr_t; __count:dword):longint;cdecl;external libthreads;
-  function pthread_barrier_destroy(__barrier:Ppthread_barrier_t):longint;cdecl;external libthreads;
-  function pthread_barrierattr_init(__attr:Ppthread_barrierattr_t):longint;cdecl;external libthreads;
-  function pthread_barrierattr_destroy(__attr:Ppthread_barrierattr_t):longint;cdecl;external libthreads;
-  function pthread_barrierattr_getpshared(__attr:Ppthread_barrierattr_t; __pshared:Plongint):longint;cdecl;external libthreads;
-  function pthread_barrierattr_setpshared(__attr:Ppthread_barrierattr_t; __pshared:longint):longint;cdecl;external libthreads;
-  function pthread_barrier_wait(__barrier:Ppthread_barrier_t):longint;cdecl;external libthreads;
-  function pthread_key_create(__key:Ppthread_key_t; __destr_function :TKeyValueDestructor):longint;cdecl; external libthreads;
-  function pthread_key_delete(__key:pthread_key_t):longint;cdecl; external libthreads;
-  function pthread_setspecific(__key:pthread_key_t; __pointer:pointer):longint;cdecl; external libthreads;
+  function pthread_join(__th:pthread_t; __thread_return:Ppointer):cint;cdecl; external libthreads;
+  function pthread_detach(__th:pthread_t):cint;cdecl; external libthreads;
+  function pthread_attr_init(__attr:Ppthread_attr_t):cint;cdecl; external libthreads;
+  function pthread_attr_destroy(__attr:Ppthread_attr_t):cint;cdecl; external libthreads;
+  function pthread_attr_setdetachstate(__attr:Ppthread_attr_t; __detachstate:cint):cint;cdecl; external libthreads;
+  function pthread_attr_getdetachstate(__attr:Ppthread_attr_t; __detachstate:pcint):cint;cdecl; external libthreads;
+  function pthread_attr_setschedparam(__attr:Ppthread_attr_t; __param:Psched_param):cint;cdecl; external libthreads;
+  function pthread_attr_getschedparam(__attr:Ppthread_attr_t; __param:Psched_param):cint;cdecl; external libthreads;
+  function pthread_attr_setschedpolicy(__attr:Ppthread_attr_t; __policy:cint):cint;cdecl; external libthreads;
+  function pthread_attr_getschedpolicy(__attr:Ppthread_attr_t; __policy:pcint):cint;cdecl; external libthreads;
+  function pthread_attr_setinheritsched(__attr:Ppthread_attr_t; __inherit:cint):cint;cdecl; external libthreads;
+  function pthread_attr_getinheritsched(__attr:Ppthread_attr_t; __inherit:pcint):cint;cdecl; external libthreads;
+  function pthread_attr_setscope(__attr:Ppthread_attr_t; __scope:cint):cint;cdecl; external libthreads;
+  function pthread_attr_getscope(__attr:Ppthread_attr_t; __scope:pcint):cint;cdecl; external libthreads;
+  function pthread_attr_setstackaddr(__attr:Ppthread_attr_t; __stackaddr:pointer):cint;cdecl; external libthreads;
+  function pthread_attr_getstackaddr(__attr:Ppthread_attr_t; __stackaddr:Ppointer):cint;cdecl; external libthreads;
+  function pthread_attr_setstacksize(__attr:Ppthread_attr_t; __stacksize:size_t):cint;cdecl; external libthreads;
+  function pthread_attr_getstacksize(__attr:Ppthread_attr_t; __stacksize:Psize_t):cint;cdecl; external libthreads;
+  function pthread_attr_getguardsize(__attr:Ppthread_attr_t; Guardsize: Psize_t): cint; cdecl;external libthreads;
+  function pthread_attr_setguardsize(__attr:Ppthread_attr_t; Guardsize: Psize_t): cint; cdecl;external libthreads;
+  function pthread_setschedparam(__target_thread:pthread_t; __policy:cint; __param:Psched_param):cint;cdecl; external libthreads;
+  function pthread_getschedparam(__target_thread:pthread_t; __policy:pcint; __param:Psched_param):cint;cdecl; external libthreads;
+  function pthread_getconcurrency: cint; cdecl;external libthreads;
+  function pthread_setconcurrency(Level: cint): cint; cdecl;external libthreads;
+  function pthread_yield(): cint; cdecl;external libthreads;
+  function pthread_mutex_init(__mutex:Ppthread_mutex_t; __mutex_attr:Ppthread_mutexattr_t):cint;cdecl; external libthreads;
+  function pthread_mutex_destroy(__mutex:Ppthread_mutex_t):cint;cdecl; external libthreads;
+  function pthread_mutex_trylock(__mutex:Ppthread_mutex_t):cint;cdecl; external libthreads;
+  function pthread_mutex_lock(__mutex:Ppthread_mutex_t):cint;cdecl; external libthreads;
+  function pthread_mutex_unlock(__mutex:Ppthread_mutex_t):cint;cdecl; external libthreads;
+  function pthread_mutexattr_init(__attr:Ppthread_mutexattr_t):cint;cdecl; external libthreads;
+  function pthread_mutexattr_destroy(__attr:Ppthread_mutexattr_t):cint;cdecl; external libthreads;
+  function pthread_mutexattr_getpshared(__attr:Ppthread_mutexattr_t; __pshared:pcint):cint;cdecl; external libthreads;
+  function pthread_mutexattr_setpshared(__attr:Ppthread_mutexattr_t; __pshared:cint):cint;cdecl; external libthreads;
+  function pthread_mutexattr_settype(__attr: Ppthread_mutexattr_t; Kind: cint): cint; cdecl;external libthreads;
+  function pthread_mutexattr_gettype(__attr: Ppthread_mutexattr_t; var Kind: cint): cint; cdecl;external libthreads;
+  function pthread_cond_init(__cond:Ppthread_cond_t; __cond_attr:Ppthread_condattr_t):cint;cdecl; external libthreads;
+  function pthread_cond_destroy(__cond:Ppthread_cond_t):cint;cdecl; external libthreads;
+  function pthread_cond_signal(__cond:Ppthread_cond_t):cint;cdecl; external libthreads;
+  function pthread_cond_broadcast(__cond:Ppthread_cond_t):cint;cdecl; external libthreads;
+  function pthread_cond_wait(__cond:Ppthread_cond_t; __mutex:Ppthread_mutex_t):cint;cdecl; external libthreads;
+  function pthread_cond_timedwait(__cond:Ppthread_cond_t; __mutex:Ppthread_mutex_t; __abstime:Ptimespec):cint;cdecl; external libthreads;
+  function pthread_condattr_init(__attr:Ppthread_condattr_t):cint;cdecl; external libthreads;
+  function pthread_condattr_destroy(__attr:Ppthread_condattr_t):cint;cdecl; external libthreads;
+  function pthread_condattr_getpshared(__attr:Ppthread_condattr_t; __pshared:pcint):cint;cdecl; external libthreads;
+  function pthread_condattr_setpshared(__attr:Ppthread_condattr_t; __pshared:cint):cint;cdecl; external libthreads;
+  function pthread_rwlock_init(__rwlock:Ppthread_rwlock_t; __attr:Ppthread_rwlockattr_t):cint;cdecl; external libthreads;
+  function pthread_rwlock_destroy(__rwlock:Ppthread_rwlock_t):cint;cdecl;external libthreads;
+  function pthread_rwlock_rdlock(__rwlock:Ppthread_rwlock_t):cint;cdecl;external libthreads;
+  function pthread_rwlock_tryrdlock(__rwlock:Ppthread_rwlock_t):cint;cdecl;external libthreads;
+  function pthread_rwlock_timedrdlock(__rwlock:Ppthread_rwlock_t; __abstime:Ptimespec):cint;cdecl;external libthreads;
+  function pthread_rwlock_wrlock(__rwlock:Ppthread_rwlock_t):cint;cdecl;external libthreads;
+  function pthread_rwlock_trywrlock(__rwlock:Ppthread_rwlock_t):cint;cdecl; external libthreads;
+  function pthread_rwlock_timedwrlock(__rwlock:Ppthread_rwlock_t; __abstime:Ptimespec):cint;cdecl;external libthreads;
+  function pthread_rwlock_unlock(__rwlock:Ppthread_rwlock_t):cint;cdecl;external libthreads;
+  function pthread_rwlockattr_init(__attr:Ppthread_rwlockattr_t):cint;cdecl;external libthreads;
+  function pthread_rwlockattr_destroy(__attr:Ppthread_rwlockattr_t):cint;cdecl;external libthreads;
+  function pthread_rwlockattr_getpshared(__attr:Ppthread_rwlockattr_t; __pshared:pcint):cint;cdecl;external libthreads;
+  function pthread_rwlockattr_setpshared(__attr:Ppthread_rwlockattr_t; __pshared:cint):cint;cdecl;external libthreads;
+  function pthread_rwlockattr_getkind_np(__attr:Ppthread_rwlockattr_t; __pref:pcint):cint;cdecl;external libthreads;
+  function pthread_rwlockattr_setkind_np(__attr:Ppthread_rwlockattr_t; __pref:cint):cint;cdecl;external libthreads;
+  function pthread_spin_init(__lock:Ppthread_spinlock_t; __pshared:cint):cint;cdecl;external libthreads;
+  function pthread_spin_destroy(__lock:Ppthread_spinlock_t):cint;cdecl;external libthreads;
+  function pthread_spin_lock(__lock:Ppthread_spinlock_t):cint;cdecl;external libthreads;
+  function pthread_spin_trylock(__lock:Ppthread_spinlock_t):cint;cdecl;external libthreads;
+  function pthread_spin_unlock(__lock:Ppthread_spinlock_t):cint;cdecl;external libthreads;
+  function pthread_barrier_init(__barrier:Ppthread_barrier_t; __attr:Ppthread_barrierattr_t; __count:dword):cint;cdecl;external libthreads;
+  function pthread_barrier_destroy(__barrier:Ppthread_barrier_t):cint;cdecl;external libthreads;
+  function pthread_barrierattr_init(__attr:Ppthread_barrierattr_t):cint;cdecl;external libthreads;
+  function pthread_barrierattr_destroy(__attr:Ppthread_barrierattr_t):cint;cdecl;external libthreads;
+  function pthread_barrierattr_getpshared(__attr:Ppthread_barrierattr_t; __pshared:pcint):cint;cdecl;external libthreads;
+  function pthread_barrierattr_setpshared(__attr:Ppthread_barrierattr_t; __pshared:cint):cint;cdecl;external libthreads;
+  function pthread_barrier_wait(__barrier:Ppthread_barrier_t):cint;cdecl;external libthreads;
+  function pthread_key_create(__key:Ppthread_key_t; __destr_function :TKeyValueDestructor):cint;cdecl; external libthreads;
+  function pthread_key_delete(__key:pthread_key_t):cint;cdecl; external libthreads;
+  function pthread_setspecific(__key:pthread_key_t; __pointer:pointer):cint;cdecl; external libthreads;
   function pthread_getspecific(__key:pthread_key_t):pointer;cdecl; external libthreads;
-  function pthread_once(__once_control:Ppthread_once_t; __init_routine:Tprocedure ):longint;cdecl; external libthreads;
-  function pthread_setcancelstate(__state:longint; __oldstate:Plongint):longint;cdecl; external libthreads;
-  function pthread_setcanceltype(__type:longint; __oldtype:Plongint):longint;cdecl; external libthreads;
-  function pthread_cancel(__thread:pthread_t):longint;cdecl; external libthreads;
+  function pthread_once(__once_control:Ppthread_once_t; __init_routine:Tprocedure ):cint;cdecl; external libthreads;
+  function pthread_setcancelstate(__state:cint; __oldstate:pcint):cint;cdecl; external libthreads;
+  function pthread_setcanceltype(__type:cint; __oldtype:pcint):cint;cdecl; external libthreads;
+  function pthread_cancel(__thread:pthread_t):cint;cdecl; external libthreads;
   procedure pthread_testcancel;cdecl; external libthreads;
   procedure _pthread_cleanup_push(__buffer:P_pthread_cleanup_buffer; __routine:TPthreadCleanupRoutine; __arg:pointer);cdecl; external libthreads;
-  procedure _pthread_cleanup_pop(__buffer:P_pthread_cleanup_buffer; __execute:longint);cdecl; external libthreads;
-  function pthread_atfork(__prepare:TforkHandler ; __parent:TForkHandler ; __child: TForkHandler ):longint;cdecl; external libthreads;
+  procedure _pthread_cleanup_pop(__buffer:P_pthread_cleanup_buffer; __execute:cint);cdecl; external libthreads;
+  function pthread_atfork(__prepare:TforkHandler ; __parent:TForkHandler ; __child: TForkHandler ):cint;cdecl; external libthreads;
   procedure pthread_kill_other_threads_np;cdecl; external libthreads;
   procedure __pthread_initialize; cdecl; external libthreads;
-  function pthread_sigmask(__how:longint; __newmask:P__sigset_t; __oldmask:P__sigset_t):longint;cdecl; external libthreads;
-  function pthread_kill(__thread:pthread_t; __signo:longint):longint;cdecl; external libthreads;
-
-  function sem_init(__sem:Psem_t; __pshared:longint; __value:dword):longint;cdecl;external libthreads;
-  function sem_destroy(__sem:Psem_t):longint;cdecl;external libthreads;
-  function sem_close(__sem:Psem_t):longint;cdecl;external libthreads;
-  function sem_unlink(__name:Pchar):longint;cdecl;external libthreads;
-  function sem_wait(__sem:Psem_t):longint;cdecl;external libthreads;
-  function sem_trywait(__sem:Psem_t):longint;cdecl;external libthreads;
-  function sem_post(__sem:Psem_t):longint;cdecl;external libthreads;
-  function sem_getvalue(__sem:Psem_t; __sval:Plongint):longint;cdecl;external libthreads;
+  function pthread_sigmask(__how:cint; __newmask:P__sigset_t; __oldmask:P__sigset_t):cint;cdecl; external libthreads;
+  function pthread_kill(__thread:pthread_t; __signo:cint):cint;cdecl; external libthreads;
+
+  function sem_init(__sem:Psem_t; __pshared:cint; __value:dword):cint;cdecl;external libthreads;
+  function sem_destroy(__sem:Psem_t):cint;cdecl;external libthreads;
+  function sem_close(__sem:Psem_t):cint;cdecl;external libthreads;
+  function sem_unlink(__name:Pchar):cint;cdecl;external libthreads;
+  function sem_wait(__sem:Psem_t):cint;cdecl;external libthreads;
+  function sem_trywait(__sem:Psem_t):cint;cdecl;external libthreads;
+  function sem_post(__sem:Psem_t):cint;cdecl;external libthreads;
+  function sem_getvalue(__sem:Psem_t; __sval:pcint):cint;cdecl;external libthreads;
 
 { ---------------------------------------------------------------------
      Overloaded versions with var args instead of pointers
   ---------------------------------------------------------------------}
               
-  function pthread_create(var __thread:pthread_t; var __attr: pthread_attr_t; __start_routine:TStartRoutine; __arg:pointer):longint;cdecl; external libthreads;
-  function pthread_join(__th:pthread_t; var __thread_return:pointer):longint;cdecl; external libthreads;
-  function pthread_attr_init(var __attr: pthread_attr_t):longint;cdecl; external libthreads;
-  function pthread_attr_destroy(var __attr: pthread_attr_t):longint;cdecl; external libthreads;
-  function pthread_attr_setdetachstate(var __attr: pthread_attr_t; __detachstate:longint):longint;cdecl; external libthreads;
-  function pthread_attr_getdetachstate(var __attr: pthread_attr_t; var __detachstate:longint):longint;cdecl; external libthreads;
-  function pthread_attr_setschedparam(var __attr: pthread_attr_t; const __param: sched_param):longint;cdecl; external libthreads;
-  function pthread_attr_getschedparam(var __attr: pthread_attr_t; var __param: sched_param):longint;cdecl; external libthreads;
-  function pthread_attr_setschedpolicy(var __attr: pthread_attr_t; __policy:longint):longint;cdecl; external libthreads;
-  function pthread_attr_getschedpolicy(var __attr: pthread_attr_t; var __policy:longint):longint;cdecl; external libthreads;
-  function pthread_attr_setinheritsched(var __attr: pthread_attr_t; __inherit:longint):longint;cdecl; external libthreads;
-  function pthread_attr_getinheritsched(var __attr: pthread_attr_t; var __inherit: longint):longint;cdecl; external libthreads;
-  function pthread_attr_setscope(var __attr: pthread_attr_t; __scope:longint):longint;cdecl; external libthreads;
-  function pthread_attr_getscope(var __attr: pthread_attr_t; var __scope: longint):longint;cdecl; external libthreads;
-  function pthread_attr_setstackaddr(var __attr: pthread_attr_t; __stackaddr:pointer):longint;cdecl; external libthreads;
-  function pthread_attr_getstackaddr(var __attr: pthread_attr_t; var __stackaddr:pointer):longint;cdecl; external libthreads;
-  function pthread_attr_setstacksize(var __attr: pthread_attr_t; __stacksize:size_t):longint;cdecl; external libthreads;
-  function pthread_attr_getstacksize(var __attr: pthread_attr_t; var __stacksize: size_t):longint;cdecl; external libthreads;
-  function pthread_attr_getguardsize(var __attr: pthread_attr_t; var Guardsize: Cardinal): Integer; cdecl;external libthreads;
-  function pthread_attr_setguardsize(var __attr: pthread_attr_t; Guardsize: Cardinal): Integer; cdecl;external libthreads;
-  function pthread_setschedparam(__target_thread:pthread_t; __policy:longint; const __param: sched_param):longint;cdecl; external libthreads;
-  function pthread_getschedparam(__target_thread:pthread_t; var __policy: longint; var __param: sched_param):longint;cdecl; external libthreads;
-  function pthread_mutex_init(var __mutex: pthread_mutex_t; var __mutex_attr: pthread_mutexattr_t):longint;cdecl; external libthreads;
-  function pthread_mutex_destroy(var __mutex: pthread_mutex_t):longint;cdecl; external libthreads;
-  function pthread_mutex_trylock(var __mutex: pthread_mutex_t):longint;cdecl; external libthreads;
-  function pthread_mutex_lock(var __mutex: pthread_mutex_t):longint;cdecl; external libthreads;
-  function pthread_mutex_unlock(var __mutex: pthread_mutex_t):longint;cdecl; external libthreads;
-  function pthread_mutexattr_init(var __attr: pthread_mutexattr_t):longint;cdecl; external libthreads;
-  function pthread_mutexattr_destroy(var __attr: pthread_mutexattr_t):longint;cdecl; external libthreads;
-  function pthread_mutexattr_getpshared(var __attr: pthread_mutexattr_t; var __pshared: longint):longint;cdecl; external libthreads;
-  function pthread_mutexattr_setpshared(var __attr: pthread_mutexattr_t; __pshared:longint):longint;cdecl; external libthreads;
-  function pthread_mutexattr_settype(var __attr: pthread_mutexattr_t; Kind: Integer): Integer; cdecl;external libthreads;
-  function pthread_mutexattr_gettype(var __attr: pthread_mutexattr_t; var Kind: Integer): Integer; cdecl;external libthreads;
-  function pthread_cond_init(var __cond: pthread_cond_t;var __cond_attr: pthread_condattr_t):longint;cdecl; external libthreads;
-  function pthread_cond_destroy(var __cond: pthread_cond_t):longint;cdecl; external libthreads;
-  function pthread_cond_signal(var __cond: pthread_cond_t):longint;cdecl; external libthreads;
-  function pthread_cond_broadcast(var __cond: pthread_cond_t):longint;cdecl; external libthreads;
-  function pthread_cond_wait(var __cond: pthread_cond_t; var __mutex: pthread_mutex_t):longint;cdecl; external libthreads;
-  function pthread_cond_timedwait(var __cond: pthread_cond_t; var __mutex: pthread_mutex_t; var __abstime: timespec):longint;cdecl; external libthreads;
-  function pthread_condattr_init(var __attr: pthread_condattr_t):longint;cdecl; external libthreads;
-  function pthread_condattr_destroy(var __attr: pthread_condattr_t):longint;cdecl; external libthreads;
-  function pthread_condattr_getpshared(var __attr: pthread_condattr_t; var __pshared:longint):longint;cdecl; external libthreads;
-  function pthread_condattr_setpshared(var __attr: pthread_condattr_t; __pshared:longint):longint;cdecl; external libthreads;
-  function pthread_rwlock_init(var __rwlock: pthread_rwlock_t; var __attr: pthread_rwlockattr_t):longint;cdecl; external libthreads;
-  function pthread_rwlock_destroy(var __rwlock: pthread_rwlock_t):longint;cdecl;external libthreads;
-  function pthread_rwlock_rdlock(var __rwlock: pthread_rwlock_t):longint;cdecl;external libthreads;
-  function pthread_rwlock_tryrdlock(var __rwlock: pthread_rwlock_t):longint;cdecl;external libthreads;
-  function pthread_rwlock_timedrdlock(var __rwlock: pthread_rwlock_t; __abstime:Ptimespec):longint;cdecl;external libthreads;
-  function pthread_rwlock_wrlock(var __rwlock: pthread_rwlock_t):longint;cdecl;external libthreads;
-  function pthread_rwlock_trywrlock(var __rwlock: pthread_rwlock_t):longint;cdecl; external libthreads;
-  function pthread_rwlock_timedwrlock(var __rwlock: pthread_rwlock_t; __abstime:Ptimespec):longint;cdecl;external libthreads;
-  function pthread_rwlock_unlock(var __rwlock: pthread_rwlock_t):longint;cdecl;external libthreads;
-  function pthread_rwlockattr_init(var __attr: pthread_rwlockattr_t):longint;cdecl;external libthreads;
-  function pthread_rwlockattr_destroy(var __attr: pthread_rwlockattr_t):longint;cdecl;external libthreads;
-  function pthread_rwlockattr_getpshared(var __attr: pthread_rwlockattr_t; var __pshared: longint):longint;cdecl;external libthreads;
-  function pthread_rwlockattr_setpshared(var __attr: pthread_rwlockattr_t; __pshared:longint):longint;cdecl;external libthreads;
-  function pthread_rwlockattr_getkind_np(var __attr: pthread_rwlockattr_t; var __pref: longint):longint;cdecl;external libthreads;
-  function pthread_rwlockattr_setkind_np(var __attr: pthread_rwlockattr_t; __pref:longint):longint;cdecl;external libthreads;
-  function pthread_spin_init(var __lock: pthread_spinlock_t; __pshared:longint):longint;cdecl;external libthreads;
-  function pthread_spin_destroy(var __lock: pthread_spinlock_t):longint;cdecl;external libthreads;
-  function pthread_spin_lock(var __lock: pthread_spinlock_t):longint;cdecl;external libthreads;
-  function pthread_spin_trylock(var __lock: pthread_spinlock_t):longint;cdecl;external libthreads;
-  function pthread_spin_unlock(var __lock: pthread_spinlock_t):longint;cdecl;external libthreads;
-  function pthread_barrier_init(var __barrier: pthread_barrier_t;var __attr: pthread_barrierattr_t; __count:dword):longint;cdecl;external libthreads;
-  function pthread_barrier_destroy(var __barrier: pthread_barrier_t):longint;cdecl;external libthreads;
-  function pthread_barrierattr_init(var __attr: pthread_barrierattr_t):longint;cdecl;external libthreads;
-  function pthread_barrierattr_destroy(var __attr: pthread_barrierattr_t):longint;cdecl;external libthreads;
-  function pthread_barrierattr_getpshared(var __attr: pthread_barrierattr_t; var __pshared:longint):longint;cdecl;external libthreads;
-  function pthread_barrierattr_setpshared(var __attr: pthread_barrierattr_t; __pshared:longint):longint;cdecl;external libthreads;
-  function pthread_barrier_wait(var __barrier: pthread_barrier_t):longint;cdecl;external libthreads;
-  function pthread_key_create(var __key: pthread_key_t; __destr_function :TKeyValueDestructor):longint;cdecl; external libthreads;
-  function pthread_once(var __once_control: pthread_once_t; __init_routine:Tprocedure ):longint;cdecl; external libthreads;
-  function pthread_setcancelstate(__state:longint; var __oldstate:longint):longint;cdecl; external libthreads;
-  function pthread_setcanceltype(__type:longint;var __oldtype:longint):longint;cdecl; external libthreads;
+  function pthread_create(var __thread:pthread_t; var __attr: pthread_attr_t; __start_routine:TStartRoutine; __arg:pointer):cint;cdecl; external libthreads;
+  function pthread_join(__th:pthread_t; var __thread_return:pointer):cint;cdecl; external libthreads;
+  function pthread_attr_init(var __attr: pthread_attr_t):cint;cdecl; external libthreads;
+  function pthread_attr_destroy(var __attr: pthread_attr_t):cint;cdecl; external libthreads;
+  function pthread_attr_setdetachstate(var __attr: pthread_attr_t; __detachstate:cint):cint;cdecl; external libthreads;
+  function pthread_attr_getdetachstate(var __attr: pthread_attr_t; var __detachstate:cint):cint;cdecl; external libthreads;
+  function pthread_attr_setschedparam(var __attr: pthread_attr_t; const __param: sched_param):cint;cdecl; external libthreads;
+  function pthread_attr_getschedparam(var __attr: pthread_attr_t; var __param: sched_param):cint;cdecl; external libthreads;
+  function pthread_attr_setschedpolicy(var __attr: pthread_attr_t; __policy:cint):cint;cdecl; external libthreads;
+  function pthread_attr_getschedpolicy(var __attr: pthread_attr_t; var __policy:cint):cint;cdecl; external libthreads;
+  function pthread_attr_setinheritsched(var __attr: pthread_attr_t; __inherit:cint):cint;cdecl; external libthreads;
+  function pthread_attr_getinheritsched(var __attr: pthread_attr_t; var __inherit: cint):cint;cdecl; external libthreads;
+  function pthread_attr_setscope(var __attr: pthread_attr_t; __scope:cint):cint;cdecl; external libthreads;
+  function pthread_attr_getscope(var __attr: pthread_attr_t; var __scope: cint):cint;cdecl; external libthreads;
+  function pthread_attr_setstackaddr(var __attr: pthread_attr_t; __stackaddr:pointer):cint;cdecl; external libthreads;
+  function pthread_attr_getstackaddr(var __attr: pthread_attr_t; var __stackaddr:pointer):cint;cdecl; external libthreads;
+  function pthread_attr_setstacksize(var __attr: pthread_attr_t; __stacksize:size_t):cint;cdecl; external libthreads;
+  function pthread_attr_getstacksize(var __attr: pthread_attr_t; var __stacksize: size_t):cint;cdecl; external libthreads;
+  function pthread_attr_getguardsize(var __attr: pthread_attr_t; var Guardsize: Cardinal): cint; cdecl;external libthreads;
+  function pthread_attr_setguardsize(var __attr: pthread_attr_t; Guardsize: Cardinal): cint; cdecl;external libthreads;
+  function pthread_setschedparam(__target_thread:pthread_t; __policy:cint; const __param: sched_param):cint;cdecl; external libthreads;
+  function pthread_getschedparam(__target_thread:pthread_t; var __policy: cint; var __param: sched_param):cint;cdecl; external libthreads;
+  function pthread_mutex_init(var __mutex: pthread_mutex_t; var __mutex_attr: pthread_mutexattr_t):cint;cdecl; external libthreads;
+  function pthread_mutex_destroy(var __mutex: pthread_mutex_t):cint;cdecl; external libthreads;
+  function pthread_mutex_trylock(var __mutex: pthread_mutex_t):cint;cdecl; external libthreads;
+  function pthread_mutex_lock(var __mutex: pthread_mutex_t):cint;cdecl; external libthreads;
+  function pthread_mutex_unlock(var __mutex: pthread_mutex_t):cint;cdecl; external libthreads;
+  function pthread_mutexattr_init(var __attr: pthread_mutexattr_t):cint;cdecl; external libthreads;
+  function pthread_mutexattr_destroy(var __attr: pthread_mutexattr_t):cint;cdecl; external libthreads;
+  function pthread_mutexattr_getpshared(var __attr: pthread_mutexattr_t; var __pshared: cint):cint;cdecl; external libthreads;
+  function pthread_mutexattr_setpshared(var __attr: pthread_mutexattr_t; __pshared:cint):cint;cdecl; external libthreads;
+  function pthread_mutexattr_settype(var __attr: pthread_mutexattr_t; Kind: cint): cint; cdecl;external libthreads;
+  function pthread_mutexattr_gettype(var __attr: pthread_mutexattr_t; var Kind: cint): cint; cdecl;external libthreads;
+  function pthread_cond_init(var __cond: pthread_cond_t;var __cond_attr: pthread_condattr_t):cint;cdecl; external libthreads;
+  function pthread_cond_destroy(var __cond: pthread_cond_t):cint;cdecl; external libthreads;
+  function pthread_cond_signal(var __cond: pthread_cond_t):cint;cdecl; external libthreads;
+  function pthread_cond_broadcast(var __cond: pthread_cond_t):cint;cdecl; external libthreads;
+  function pthread_cond_wait(var __cond: pthread_cond_t; var __mutex: pthread_mutex_t):cint;cdecl; external libthreads;
+  function pthread_cond_timedwait(var __cond: pthread_cond_t; var __mutex: pthread_mutex_t; var __abstime: timespec):cint;cdecl; external libthreads;
+  function pthread_condattr_init(var __attr: pthread_condattr_t):cint;cdecl; external libthreads;
+  function pthread_condattr_destroy(var __attr: pthread_condattr_t):cint;cdecl; external libthreads;
+  function pthread_condattr_getpshared(var __attr: pthread_condattr_t; var __pshared:cint):cint;cdecl; external libthreads;
+  function pthread_condattr_setpshared(var __attr: pthread_condattr_t; __pshared:cint):cint;cdecl; external libthreads;
+  function pthread_rwlock_init(var __rwlock: pthread_rwlock_t; var __attr: pthread_rwlockattr_t):cint;cdecl; external libthreads;
+  function pthread_rwlock_destroy(var __rwlock: pthread_rwlock_t):cint;cdecl;external libthreads;
+  function pthread_rwlock_rdlock(var __rwlock: pthread_rwlock_t):cint;cdecl;external libthreads;
+  function pthread_rwlock_tryrdlock(var __rwlock: pthread_rwlock_t):cint;cdecl;external libthreads;
+  function pthread_rwlock_timedrdlock(var __rwlock: pthread_rwlock_t; __abstime:Ptimespec):cint;cdecl;external libthreads;
+  function pthread_rwlock_wrlock(var __rwlock: pthread_rwlock_t):cint;cdecl;external libthreads;
+  function pthread_rwlock_trywrlock(var __rwlock: pthread_rwlock_t):cint;cdecl; external libthreads;
+  function pthread_rwlock_timedwrlock(var __rwlock: pthread_rwlock_t; __abstime:Ptimespec):cint;cdecl;external libthreads;
+  function pthread_rwlock_unlock(var __rwlock: pthread_rwlock_t):cint;cdecl;external libthreads;
+  function pthread_rwlockattr_init(var __attr: pthread_rwlockattr_t):cint;cdecl;external libthreads;
+  function pthread_rwlockattr_destroy(var __attr: pthread_rwlockattr_t):cint;cdecl;external libthreads;
+  function pthread_rwlockattr_getpshared(var __attr: pthread_rwlockattr_t; var __pshared: cint):cint;cdecl;external libthreads;
+  function pthread_rwlockattr_setpshared(var __attr: pthread_rwlockattr_t; __pshared:cint):cint;cdecl;external libthreads;
+  function pthread_rwlockattr_getkind_np(var __attr: pthread_rwlockattr_t; var __pref: cint):cint;cdecl;external libthreads;
+  function pthread_rwlockattr_setkind_np(var __attr: pthread_rwlockattr_t; __pref:cint):cint;cdecl;external libthreads;
+  function pthread_spin_init(var __lock: pthread_spinlock_t; __pshared:cint):cint;cdecl;external libthreads;
+  function pthread_spin_destroy(var __lock: pthread_spinlock_t):cint;cdecl;external libthreads;
+  function pthread_spin_lock(var __lock: pthread_spinlock_t):cint;cdecl;external libthreads;
+  function pthread_spin_trylock(var __lock: pthread_spinlock_t):cint;cdecl;external libthreads;
+  function pthread_spin_unlock(var __lock: pthread_spinlock_t):cint;cdecl;external libthreads;
+  function pthread_barrier_init(var __barrier: pthread_barrier_t;var __attr: pthread_barrierattr_t; __count:dword):cint;cdecl;external libthreads;
+  function pthread_barrier_destroy(var __barrier: pthread_barrier_t):cint;cdecl;external libthreads;
+  function pthread_barrierattr_init(var __attr: pthread_barrierattr_t):cint;cdecl;external libthreads;
+  function pthread_barrierattr_destroy(var __attr: pthread_barrierattr_t):cint;cdecl;external libthreads;
+  function pthread_barrierattr_getpshared(var __attr: pthread_barrierattr_t; var __pshared:cint):cint;cdecl;external libthreads;
+  function pthread_barrierattr_setpshared(var __attr: pthread_barrierattr_t; __pshared:cint):cint;cdecl;external libthreads;
+  function pthread_barrier_wait(var __barrier: pthread_barrier_t):cint;cdecl;external libthreads;
+  function pthread_key_create(var __key: pthread_key_t; __destr_function :TKeyValueDestructor):cint;cdecl; external libthreads;
+  function pthread_once(var __once_control: pthread_once_t; __init_routine:Tprocedure ):cint;cdecl; external libthreads;
+  function pthread_setcancelstate(__state:cint; var __oldstate:cint):cint;cdecl; external libthreads;
+  function pthread_setcanceltype(__type:cint;var __oldtype:cint):cint;cdecl; external libthreads;
 
   procedure _pthread_cleanup_push(var __buffer: _pthread_cleanup_buffer; __routine:TPthreadCleanupRoutine; __arg:pointer);cdecl; external libthreads;
-  procedure _pthread_cleanup_pop(var __buffer:_pthread_cleanup_buffer; __execute:longint);cdecl; external libthreads;
-  function pthread_sigmask(__how:longint; var __newmask:__sigset_t; var __oldmask:__sigset_t):longint;cdecl; external libthreads;
+  procedure _pthread_cleanup_pop(var __buffer:_pthread_cleanup_buffer; __execute:cint);cdecl; external libthreads;
+  function pthread_sigmask(__how:cint; var __newmask:__sigset_t; var __oldmask:__sigset_t):cint;cdecl; external libthreads;
 
-  function sem_init(var __sem: sem_t; __pshared:longint; __value:dword):longint;cdecl;external libthreads;
-  function sem_destroy(var __sem: sem_t):longint;cdecl;external libthreads;
-  function sem_close(var __sem: sem_t):longint;cdecl;external libthreads;
-  function sem_wait(var __sem: sem_t):longint;cdecl;external libthreads;
-  function sem_trywait(var __sem: sem_t):longint;cdecl;external libthreads;
-  function sem_post(var __sem: sem_t):longint;cdecl;external libthreads;
-  function sem_getvalue(var __sem: sem_t; var __sval:longint):longint;cdecl;external libthreads;
+  function sem_init(var __sem: sem_t; __pshared:cint; __value:dword):cint;cdecl;external libthreads;
+  function sem_destroy(var __sem: sem_t):cint;cdecl;external libthreads;
+  function sem_close(var __sem: sem_t):cint;cdecl;external libthreads;
+  function sem_wait(var __sem: sem_t):cint;cdecl;external libthreads;
+  function sem_trywait(var __sem: sem_t):cint;cdecl;external libthreads;
+  function sem_post(var __sem: sem_t):cint;cdecl;external libthreads;
+  function sem_getvalue(var __sem: sem_t; var __sval:cint):cint;cdecl;external libthreads;
 
 {
-  $Log :            $
+  $Log$
+  Revision 1.2  2004-09-09 20:29:06  jonas
+    * fixed definition of pthread_mutex_t for non-linux targets (and for
+      linux as well, actually).
+    * base libpthread definitions are now in ptypes.inc, included in unixtype
+      They sometimes have an extra underscore in front of their name, in
+      case they were also exported by the packages/base/pthreads unit, so
+      they can keep their original name there
+    * cthreadds unit now imports systuils, because it uses exceptions (it
+      already did so before as well)
+    * fixed many linux definitions of libpthread functions in pthrlinux.inc
+      (integer -> cint etc)
+    + added culonglong type to ctype.inc
+
 
 }
 

+ 21 - 2
rtl/bsd/ctypes.inc

@@ -33,7 +33,7 @@ Type
     cInt32 = longint;
     cUInt32= cardinal;
     cInt64 = int64;
-{$ifndef VER_1_0}
+{$ifndef VER1_0}
     cUInt64= qword;
 {$else}
     cUInt64= int64;
@@ -53,6 +53,12 @@ Type
     cLong  = longint;
     cuLong = Cardinal;
   {$endif}
+    clonglong = int64;
+{$ifndef VER1_0}
+    culonglong = qword;
+{$else VER1_0}
+    culonglong = int64;
+{$endif VER1_0}
     cshort = integer;
     cushort= word;
 
@@ -65,7 +71,20 @@ Type
 
 {   
    $Log$
-   Revision 1.3  2004-05-17 19:20:09  marco
+   Revision 1.4  2004-09-09 20:29:06  jonas
+     * fixed definition of pthread_mutex_t for non-linux targets (and for
+       linux as well, actually).
+     * base libpthread definitions are now in ptypes.inc, included in unixtype
+       They sometimes have an extra underscore in front of their name, in
+       case they were also exported by the packages/base/pthreads unit, so
+       they can keep their original name there
+     * cthreadds unit now imports systuils, because it uses exceptions (it
+       already did so before as well)
+     * fixed many linux definitions of libpthread functions in pthrlinux.inc
+       (integer -> cint etc)
+     + added culonglong type to ctype.inc
+
+   Revision 1.3  2004/05/17 19:20:09  marco
     * x86_64 patches
 
    Revision 1.2  2003/09/16 21:20:40  marco

+ 3 - 3
rtl/darwin/Makefile

@@ -1,8 +1,8 @@
 #
-# Don't edit, this file is generated by FPCMake Version 1.1 [2004/09/04]
+# Don't edit, this file is generated by FPCMake Version 1.1 [2004/09/09]
 #
 default: all
-MAKEFILETARGETS=linux go32v2 win32 os2 freebsd beos netbsd amiga atari sunos qnx netware openbsd wdosx palmos macos darwin emx watcom morphos netwlibc
+MAKEFILETARGETS=darwin
 BSDs = freebsd netbsd openbsd darwin
 UNIXs = linux $(BSDs) sunos qnx
 FORCE:
@@ -1464,6 +1464,6 @@ ipc$(PPUEXT) : $(UNIXINC)/ipc.pp unix$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT) baseunix$(
 terminfo$(PPUEXT) : terminfo.pp baseunix$(PPUEXT)
 cmem$(PPUEXT) : $(INC)/cmem.pp $(SYSTEMUNIT)$(PPUEXT)
 sysctl$(PPUEXT) : $(BSDINC)/sysctl.pp $(SYSTEMUNIT)$(PPUEXT)
-cthreads$(PPUEXT) : $(UNIXINC)/cthreads.pp systhrds$(PPUEXT) unix$(PPUEXT)
+cthreads$(PPUEXT) : $(UNIXINC)/cthreads.pp systhrds$(PPUEXT) unix$(PPUEXT) sysutils$(PPUEXT)
 initc$(PPUEXT) : $(SYSTEMUNIT)$(PPUEXT)
 console$(PPUEXT) : baseunix$(PPUEXT) termio$(PPUEXT)

+ 1 - 1
rtl/darwin/Makefile.fpc

@@ -254,7 +254,7 @@ cmem$(PPUEXT) : $(INC)/cmem.pp $(SYSTEMUNIT)$(PPUEXT)
 
 sysctl$(PPUEXT) : $(BSDINC)/sysctl.pp $(SYSTEMUNIT)$(PPUEXT)
 
-cthreads$(PPUEXT) : $(UNIXINC)/cthreads.pp systhrds$(PPUEXT) unix$(PPUEXT)
+cthreads$(PPUEXT) : $(UNIXINC)/cthreads.pp systhrds$(PPUEXT) unix$(PPUEXT) sysutils$(PPUEXT)
 
 initc$(PPUEXT) : $(SYSTEMUNIT)$(PPUEXT)
 

+ 29 - 23
rtl/darwin/pthread.inc

@@ -23,27 +23,20 @@
 CONST PTHREAD_EXPLICIT_SCHED       = 0;
       PTHREAD_CREATE_DETACHED      = 1;
       PTHREAD_SCOPE_PROCESS        = 0;
-      PTHREAD_MUTEX_RECURSIVE      = 2;
 
  TYPE
-    pthread_t       = pointer;
-    ppthread_t      = ^pthread_t;
-    pthread_key_t   = cint;
-    ppthread_key_t  = ^pthread_key_t;
-    pthread_mutex_t = TRTLCriticalSection;
-    ppthread_mutex_t= PRTLCriticalSection;
-    pthread_attr_t  = pointer; // opague
-    ppthread_attr_t = ^pthread_attr_t; // opague
-    __destr_func_t  = procedure (p :pointer);cdecl;
-    __startroutine_t= function (p :pointer):pointer;cdecl;
-    pthread_mutex_attr_t  = pointer;
-    ppthread_mutex_attr_t = ^pthread_mutex_t;
-    ppthread_mutexattr_t  = ^pthread_mutex_t;
-
-    sem_t	    = cint;
+    ppthread_t           = ^pthread_t;
+    ppthread_key_t       = ^pthread_key_t;
+    ppthread_mutex_t     = ^pthread_mutex_t;
+    ppthread_attr_t      = ^pthread_attr_t;
+    __destr_func_t       = procedure (p :pointer);cdecl;
+    __startroutine_t     = function (p :pointer):pointer;cdecl;
+    ppthread_mutexattr_t = ^pthread_mutexattr_t;
+
+    sem_t       = cint;
     psem_t	    = ^sem_t;
-   TSemaphore         = sem_t;
-    PSemaphore         = ^TSemaphore;
+    TSemaphore  = sem_t;
+    PSemaphore  = ^TSemaphore;
 
 function  pthread_getspecific      (t : pthread_key_t):pointer; cdecl; external 'c';
 function  pthread_setspecific      (t : pthread_key_t;p:pointer):cint; cdecl; external 'c';
@@ -55,10 +48,10 @@ function  pthread_attr_setdetachstate (p : ppthread_attr_t;i:cint):cint;cdecl;ex
 function  pthread_create ( p: ppthread_t;attr : ppthread_attr_t;f:__startroutine_t;arg:pointer):cint;cdecl;external 'c';
 procedure pthread_exit  ( p: pointer); cdecl;external 'c';
 function  pthread_self:cint; cdecl;external 'c';
-function  pthread_mutex_init (p:ppthread_mutex_t;o:ppthread_mutex_attr_t):cint; cdecl;external 'c';
-function  pthread_mutex_destroy (p:ppthread_mutex_attr_t):cint; cdecl;external 'c';
-function  pthread_mutex_lock    (p:ppthread_mutex_attr_t):cint; cdecl;external 'c';
-function  pthread_mutex_unlock  (p:ppthread_mutex_attr_t):cint; cdecl;external 'c';
+function  pthread_mutex_init (p:ppthread_mutex_t;o:ppthread_mutexattr_t):cint; cdecl;external 'c';
+function  pthread_mutex_destroy (p:ppthread_mutexattr_t):cint; cdecl;external 'c';
+function  pthread_mutex_lock    (p:ppthread_mutexattr_t):cint; cdecl;external 'c';
+function  pthread_mutex_unlock  (p:ppthread_mutexattr_t):cint; cdecl;external 'c';
 function  pthread_cancel(_para1:pthread_t):cint;cdecl;external 'c';
 function  pthread_detach(_para1:pthread_t):cint;cdecl;external 'c';
 function  pthread_join(_para1:pthread_t; _para2:Ppointer):cint;cdecl;external 'c';
@@ -79,7 +72,20 @@ function pthread_mutexattr_settype(_para1:Ppthread_mutexattr_t; _para2:cint):cin
 
 {
   $Log$
-  Revision 1.4  2004-05-28 18:23:55  marco
+  Revision 1.5  2004-09-09 20:29:06  jonas
+    * fixed definition of pthread_mutex_t for non-linux targets (and for
+      linux as well, actually).
+    * base libpthread definitions are now in ptypes.inc, included in unixtype
+      They sometimes have an extra underscore in front of their name, in
+      case they were also exported by the packages/base/pthreads unit, so
+      they can keep their original name there
+    * cthreadds unit now imports systuils, because it uses exceptions (it
+      already did so before as well)
+    * fixed many linux definitions of libpthread functions in pthrlinux.inc
+      (integer -> cint etc)
+    + added culonglong type to ctype.inc
+
+  Revision 1.4  2004/05/28 18:23:55  marco
    * fixes for darwin specific external name '' behaviour. Must still be
   tested
 

+ 39 - 11
rtl/darwin/ptypes.inc

@@ -21,6 +21,7 @@
 {***********************************************************************}
 
 {$i ctypes.inc}
+{$packrecords c}
 
 type
     { the following type definitions are compiler dependant }
@@ -109,16 +110,21 @@ CONST
     MNAMELEN   = 90;
 
 
-  DWORDS_IN_PTHREAD_T = sizeof(pointer) div sizeof(dword);
-  DWORDS_IN_PTHREAD_ATTR_T = (36+sizeof(clong)) div sizeof(dword);
-  DWORDS_IN_PTHREAD_MUTEXATTR_T = (8+sizeof(clong)) div sizeof(dword);
-  DWORDS_IN_PTHREAD_MUTEX_T = (40+sizeof(clong)) div sizeof(dword);
-  DWORDS_IN_PTHREAD_COND_ATTR_T = (4+sizeof(clong)) div sizeof(dword);
-  DWORDS_IN_PTHREAD_COND_T = (24+sizeof(clong)) div sizeof(dword);
-  DWORDS_IN_PTHREAD_ONCE_T = (4+sizeof(clong)) div sizeof(dword);
-  DWORDS_IN_PTHREAD_RWLOCK_T = (124+sizeof(clong)) div sizeof(dword);
-  DWORDS_IN_PTHREAD_RWLOCK_ATTR_T = (12+sizeof(clong)) div sizeof(dword);
+type
+  pthread_mutextype = (
+    _PTHREAD_MUTEX_NORMAL    := 0,
+    _PTHREAD_MUTEX_ERRORCHECK := 1,
+    _PTHREAD_MUTEX_RECURSIVE := 2
+  );
+
+
+  const
+     _PTHREAD_MUTEX_DEFAULT 		= _PTHREAD_MUTEX_NORMAL;
+     _MUTEX_TYPE_FAST          = _PTHREAD_MUTEX_NORMAL;
+     _MUTEX_TYPE_COUNTING_FAST = _PTHREAD_MUTEX_RECURSIVE;
 
+     _PTHREAD_KEYS_MAX              = 128;
+     _PTHREAD_STACK_MIN             = 8192;
 
   type
      fsid_t = record
@@ -147,12 +153,34 @@ CONST
        end;
     pstatfs = ^tstatfs;
 
-   pthread_key_t = clong;
+   pthread_t            = pointer;
+   pthread_attr_t       = record sig: clong; opaque: array[0..36-1] of byte; end;
+   pthread_mutex_t      = record sig: clong; opaque: array[0..40-1] of byte; end;
+   pthread_mutexattr_t 	= record sig: clong; opaque: array[0..8-1] of byte; end;
+   pthread_cond_t       = record sig: clong; opaque: array[0..24-1] of byte; end;
+   pthread_condattr_t 	= record sig: clong; opaque: array[0..4-1] of byte; end;
+   pthread_key_t        = clong;
+   pthread_rwlock_t 		= record sig: clong; opaque: array[0..124-1] of byte; end;
+   pthread_rwlockattr_t = record sig: clong; opaque: array[0..12-1] of byte; end;
 
+   sem_t		= cint;
 
 {
   $Log$
-  Revision 1.7  2004-08-25 21:42:11  jonas
+  Revision 1.8  2004-09-09 20:29:06  jonas
+    * fixed definition of pthread_mutex_t for non-linux targets (and for
+      linux as well, actually).
+    * base libpthread definitions are now in ptypes.inc, included in unixtype
+      They sometimes have an extra underscore in front of their name, in
+      case they were also exported by the packages/base/pthreads unit, so
+      they can keep their original name there
+    * cthreadds unit now imports systuils, because it uses exceptions (it
+      already did so before as well)
+    * fixed many linux definitions of libpthread functions in pthrlinux.inc
+      (integer -> cint etc)
+    + added culonglong type to ctype.inc
+
+  Revision 1.7  2004/08/25 21:42:11  jonas
     * fixed pthread type definitions for darwin and made them generic
 
   Revision 1.6  2004/03/04 22:28:08  marco

+ 20 - 18
rtl/freebsd/pthread.inc

@@ -23,29 +23,18 @@
 CONST PTHREAD_EXPLICIT_SCHED       = 0;
       PTHREAD_CREATE_DETACHED      = 1;
       PTHREAD_SCOPE_PROCESS        = 0;
-      PTHREAD_MUTEX_RECURSIVE 	   = 2;
 
  TYPE
-  pthread_mutex_attr = record
-       end;
-
-    pthread_t       = pointer;
     ppthread_t      = ^pthread_t;
-    pthread_key_t   = cint;
     ppthread_key_t  = ^pthread_key_t;
-    pthread_mutex_t = TRTLCriticalSection;
-    ppthread_mutex_t= PRTLCriticalSection;
-    pthread_attr_t  = pointer; // opague
-    ppthread_attr_t = ^pthread_attr_t; // opague
-    ppthread_mutexattr_t        = ^pthread_mutex_attr;
-//    ppthread_mutexattr_t = ^pthread_mutexattr_t;
+    ppthread_mutex_t= ^pthread_mutex_t;
+    ppthread_attr_t = ^pthread_attr_t;
     __destr_func_t  = procedure (p :pointer);cdecl;
     __startroutine_t= function (p :pointer):pointer;cdecl;
-    pthread_mutex_attr_t  = pointer;
-    ppthread_mutex_attr_t = ^pthread_mutex_t;
-    sem                = record end;
-    sem_t              = ^sem;
-    psem_t             = ^sem_t;
+    ppthread_mutexattr_t = ^pthread_mutexattr_t;
+
+    sem_t	    = cint;
+    psem_t	    = ^sem_t;
     TSemaphore         = sem_t;
     PSemaphore         = ^TSemaphore;
 
@@ -84,7 +73,20 @@ function pthread_mutexattr_settype(_para1:Ppthread_mutexattr_t; _para2:cint):cin
 
 {
   $Log$
-  Revision 1.3  2004-05-23 15:30:55  marco
+  Revision 1.4  2004-09-09 20:29:06  jonas
+    * fixed definition of pthread_mutex_t for non-linux targets (and for
+      linux as well, actually).
+    * base libpthread definitions are now in ptypes.inc, included in unixtype
+      They sometimes have an extra underscore in front of their name, in
+      case they were also exported by the packages/base/pthreads unit, so
+      they can keep their original name there
+    * cthreadds unit now imports systuils, because it uses exceptions (it
+      already did so before as well)
+    * fixed many linux definitions of libpthread functions in pthrlinux.inc
+      (integer -> cint etc)
+    + added culonglong type to ctype.inc
+
+  Revision 1.3  2004/05/23 15:30:55  marco
    * basicevent, still untested
 
   Revision 1.2  2003/11/27 20:24:10  michael

+ 59 - 15
rtl/freebsd/ptypes.inc

@@ -21,6 +21,7 @@
 {***********************************************************************}
 
 {$I ctypes.inc}
+{$packrecords c}
 
 type
 
@@ -103,9 +104,50 @@ type
   ptimespec= ^timespec;
   Ttimespec= timespec;
 
-  pthread_key_t = cint;
+   pthread_t            = pointer;
+   pthread_attr_t       = pointer;
+   pthread_mutex_t      = pointer;
+   pthread_mutexattr_t 	= pointer;
+   pthread_cond_t       = pointer;
+   pthread_condattr_t 	= pointer;
+   pthread_key_t        = cint;
+   pthread_rwlock_t 	= pointer;
+   pthread_rwlockattr_t = pointer;
+
+   sem_t		= pointer;
+
+  {
+     Mutex types (Single UNIX Specification, Version 2, 1997).
+    
+     Note that a mutex attribute with one of the following types:
+    
+     PTHREAD_MUTEX_NORMAL
+     PTHREAD_MUTEX_RECURSIVE
+     MUTEX_TYPE_FAST (deprecated)
+     MUTEX_TYPE_COUNTING_FAST (deprecated)
+      
+       will deviate from POSIX specified semantics.
+      }
+
+  pthread_mutextype = (
+    { Default POSIX mutex  }
+    _PTHREAD_MUTEX_ERRORCHECK := 1,
+    { Recursive mutex  }
+    _PTHREAD_MUTEX_RECURSIVE := 2,
+    { No error checking  }
+    _PTHREAD_MUTEX_NORMAL    := 3,
+    _MUTEX_TYPE_MAX
+  );
+
+
+const
+  _PTHREAD_MUTEX_DEFAULT     = _PTHREAD_MUTEX_ERRORCHECK;
+  _MUTEX_TYPE_FAST          = _PTHREAD_MUTEX_NORMAL;
+  _MUTEX_TYPE_COUNTING_FAST = _PTHREAD_MUTEX_RECURSIVE;
+
+  _PTHREAD_KEYS_MAX              = 256;
+  _PTHREAD_STACK_MIN             = 1024;
 
-CONST
    { System limits, POSIX value in parentheses, used for buffer and stack allocation }
     ARG_MAX  = 65536;   {4096}  { Maximum number of argument size     }
     NAME_MAX = 255;     {14}    { Maximum number of bytes in filename }
@@ -117,20 +159,22 @@ CONST
 //   wordsinsigset   = 4;		// words in sigset_t
 
 
-    DWORDS_IN_PTHREAD_T = sizeof(pointer) div sizeof(dword);
-    DWORDS_IN_PTHREAD_ATTR_T = sizeof(pointer) div sizeof(dword);
-    DWORDS_IN_PTHREAD_MUTEXATTR_T = sizeof(pointer) div sizeof(dword);
-    DWORDS_IN_PTHREAD_MUTEX_T = sizeof(pointer) div sizeof(dword);
-    DWORDS_IN_PTHREAD_COND_ATTR_T = sizeof(pointer) div sizeof(dword);
-    DWORDS_IN_PTHREAD_COND_T = sizeof(pointer) div sizeof(dword);
-    DWORDS_IN_PTHREAD_ONCE_T = sizeof(pointer) div sizeof(dword);
-    DWORDS_IN_PTHREAD_RWLOCK_T = sizeof(pointer) div sizeof(dword);
-    DWORDS_IN_PTHREAD_RWLOCK_ATTR_T = sizeof(pointer) div sizeof(dword);
-
-
 {
   $Log$
-  Revision 1.13  2004-08-25 21:42:11  jonas
+  Revision 1.14  2004-09-09 20:29:06  jonas
+    * fixed definition of pthread_mutex_t for non-linux targets (and for
+      linux as well, actually).
+    * base libpthread definitions are now in ptypes.inc, included in unixtype
+      They sometimes have an extra underscore in front of their name, in
+      case they were also exported by the packages/base/pthreads unit, so
+      they can keep their original name there
+    * cthreadds unit now imports systuils, because it uses exceptions (it
+      already did so before as well)
+    * fixed many linux definitions of libpthread functions in pthrlinux.inc
+      (integer -> cint etc)
+    + added culonglong type to ctype.inc
+
+  Revision 1.13  2004/08/25 21:42:11  jonas
     * fixed pthread type definitions for darwin and made them generic
 
   Revision 1.12  2004/05/18 19:33:45  marco
@@ -160,4 +204,4 @@ CONST
    * split into ptypes and ctypes
 
 
-}
+}

+ 21 - 2
rtl/linux/ctypes.inc

@@ -29,7 +29,7 @@ Type
     cInt32 = longint;
     cUInt32= cardinal;
     cInt64 = int64;
-{$ifndef VER_1_0}
+{$ifndef VER1_0}
     cUInt64= qword;
 {$else}
     cUInt64= int64;
@@ -45,6 +45,12 @@ Type
     cLong  = longint;
     cuLong = Cardinal;
 {$endif}
+    clonglong = int64;
+{$ifndef VER1_0}
+    culonglong = qword;
+{$else VER1_0}
+    culonglong = int64;
+{$endif VER1_0}
     cshort = smallint;
     cushort= word;
 
@@ -57,7 +63,20 @@ Type
 
 {
    $Log$
-   Revision 1.4  2004-04-26 16:53:19  peter
+   Revision 1.5  2004-09-09 20:29:06  jonas
+     * fixed definition of pthread_mutex_t for non-linux targets (and for
+       linux as well, actually).
+     * base libpthread definitions are now in ptypes.inc, included in unixtype
+       They sometimes have an extra underscore in front of their name, in
+       case they were also exported by the packages/base/pthreads unit, so
+       they can keep their original name there
+     * cthreadds unit now imports systuils, because it uses exceptions (it
+       already did so before as well)
+     * fixed many linux definitions of libpthread functions in pthrlinux.inc
+       (integer -> cint etc)
+     + added culonglong type to ctype.inc
+
+   Revision 1.4  2004/04/26 16:53:19  peter
      * use cpu64
 
    Revision 1.3  2003/09/16 21:20:40  marco

+ 53 - 77
rtl/linux/pthread.inc

@@ -29,21 +29,8 @@
      THREAD_PRIORITY_HIGHEST            = 80;
      THREAD_PRIORITY_TIME_CRITICAL      = 99;
      PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP : array [0..5]of Integer = (0, 0, 0, 1, 0, 0);
-     PTHREAD_MUTEX_RECURSIVE  	        = 1;
 
 Type
-  __sem_lock_t = record
-    status: Longint;
-    spinlock: Integer;
-  end;
-  TSemLock = __sem_lock_t;
-  PSemLock = ^TSemLock;
-
-   sem_t = record
-     __sem_lock: __sem_lock_t;
-     __sem_value: Integer;
-     __sem_waiting: pointer;
-    end;
    psem_t = ^sem_t;
    TSemaphore = sem_t;
    PSemaphore = ^TSemaphore;
@@ -58,20 +45,11 @@ Type
        THREAD_PRIORITY_HIGHEST, THREAD_PRIORITY_TIME_CRITICAL
      );
 
-  type
-     psched_param = ^sched_param;
-     sched_param = record
-        sched_priority : LongInt;
-     end;
 {
-     ptimespec = ^timespec;
-     timespec = record
-        tv_sec : LongInt;
-        tv_nsec : LongInt;
-     end;
-}
+  type
      psigset_t = ^sigset_t;
      sigset_t = DWORD; // unsigned long 32 bits
+}
 
   const
      _POSIX_THREAD_THREADS_MAX = 64;
@@ -80,23 +58,13 @@ Type
      PTHREAD_KEYS_MAX = 128;
 
   type
-    pthread_t = pointer;
     ppthread_t = ^pthread_t;
-
+{
      p_pthread_queue = ^_pthread_queue;
-     _pthread_queue = record
-          head : pthread_t;
-          tail : pthread_t;
-       end;
-
-     ppthread_mutex_t = PRtlCriticalSection;
-     pthread_mutex_t = TRtlCriticalSection;
+}
+     ppthread_mutex_t = ^pthread_mutex_t;
 
      ppthread_cond_t = ^pthread_cond_t;
-     pthread_cond_t = record
-          c_spinlock : longint;
-          c_waiting : _pthread_queue;
-       end;
 
      { Attributes  }
 
@@ -109,42 +77,24 @@ Type
       PTHREAD_SCOPE_PROCESS   = 1;
 
     type
-//       size_t = longint;
+       psched_param = ^sched_param;
 
        ppthread_attr_t = ^pthread_attr_t;
-       pthread_attr_t = record
-            detachstate : longint;
-            schedpolicy : longint;
-            schedparam : sched_param;
-            inheritsched : longint;
-            scope : longint;
-            __guardsize : size_t;
-            __stackaddr_set : longint;
-            __stackaddr : pointer;
-            __stacksize : size_t;
-         end;
 
        ppthread_mutexattr_t = ^pthread_mutexattr_t;
-       pthread_mutexattr_t = record
-            mutexkind : longint;
-         end;
-       pthread_mutex_attr_t = pthread_mutexattr_t;
 
        ppthread_condattr_t = ^pthread_condattr_t;
-       pthread_condattr_t = record
-            dummy : longint;
-         end;
 
        ppthread_key_t = ^pthread_key_t;
-       pthread_key_t = cardinal;
 
-       ppthread_once_t = ^pthread_once_t;
-       pthread_once_t = longint;
+{      pthread_once_t = cint;
+       ppthread_once_t = ^pthread_once_t;}
 
     const
        PTHREAD_ONCE_INIT = 0;
 
     type
+(*
        tpcb_routine = Procedure(P:Pointer); cdecl;
 
        p_pthread_cleanup_buffer = ^_pthread_cleanup_buffer;
@@ -154,11 +104,12 @@ Type
           canceltype:LongInt;                 { Saved cancellation type. }
           prev : p_pthread_cleanup_buffer; { Chaining of cleanup functions.  }
        end;
+*)
 
      __start_routine_t = function (_para1:pointer):pointer;cdecl;
      __destr_function_t = procedure (_para1:pointer);
-     t_pthread_cleanup_push_routine = procedure (_para1:pointer);
-     t_pthread_cleanup_push_defer_routine = procedure (_para1:pointer);
+{     t_pthread_cleanup_push_routine = procedure (_para1:pointer);
+     t_pthread_cleanup_push_defer_routine = procedure (_para1:pointer);}
 
 {$ifndef dynpthreads}
     function pthread_create(__thread:ppthread_t; __attr:ppthread_attr_t;__start_routine: __start_routine_t;__arg:pointer):longint;cdecl;external;
@@ -202,18 +153,30 @@ Type
     function pthread_key_delete(__key:pthread_key_t):longint;cdecl;external;
     function pthread_setspecific(__key:pthread_key_t; __pointer:pointer):longint;cdecl;external;
     function pthread_getspecific(__key:pthread_key_t):pointer;cdecl;external;
-    function pthread_once(__once_control:ppthread_once_t; __init_routine:tprocedure ):longint;cdecl;external;
+{    function pthread_once(__once_control:ppthread_once_t; __init_routine:tprocedure ):longint;cdecl;external;}
     function pthread_setcancelstate(__state:longint; __oldstate:plongint):longint;cdecl;external;
     function pthread_setcanceltype(__type:longint; __oldtype:plongint):longint;cdecl;external;
     function pthread_cancel(__thread:pthread_t):longint;cdecl;external;
     procedure pthread_testcancel;cdecl;external;
-    procedure _pthread_cleanup_push(__buffer:p_pthread_cleanup_buffer;__routine:t_pthread_cleanup_push_routine; __arg:pointer);cdecl;external;
-    procedure _pthread_cleanup_push_defer(__buffer:p_pthread_cleanup_buffer;__routine:t_pthread_cleanup_push_defer_routine; __arg:pointer);cdecl;external;
-    function pthread_sigmask(__how:longint; __newmask:psigset_t; __oldmask:psigset_t):longint;cdecl;external;
+{    procedure _pthread_cleanup_push(__buffer:p_pthread_cleanup_buffer;__routine:t_pthread_cleanup_push_routine; __arg:pointer);cdecl;external; }
+{    procedure _pthread_cleanup_push_defer(__buffer:p_pthread_cleanup_buffer;__routine:t_pthread_cleanup_push_defer_routine; __arg:pointer);cdecl;external;}
+{    function pthread_sigmask(__how:longint; __newmask:psigset_t; __oldmask:psigset_t):longint;cdecl;external;}
     function pthread_kill(__thread:pthread_t; __signo:longint):longint;cdecl;external;
-    function sigwait(__set:psigset_t; __sig:plongint):longint;cdecl;external;
+{    function sigwait(__set:psigset_t; __sig:plongint):longint;cdecl;external;}
     function pthread_atfork(__prepare:tprocedure ; __parent:tprocedure ; __child:tprocedure ):longint;cdecl;external;
     procedure pthread_kill_other_threads_np;cdecl;external;
+
+    function sem_init (__sem:Psem_t; __pshared:longint; __value:dword):longint;cdecl;external;
+    function sem_destroy  (__sem:Psem_t):longint;cdecl;external;
+    function sem_close (__sem:Psem_t):longint;cdecl;external;
+    function sem_unlink (__name:Pchar):longint;cdecl;external;
+    function sem_wait (__sem:Psem_t):longint;cdecl;external;
+    function sem_trywait  (__sem:Psem_t):longint;cdecl;external;
+    function sem_post     (__sem:Psem_t):longint;cdecl;external;
+    function sem_getvalue (__sem:Psem_t; __sval:Plongint):longint;cdecl;external;
+
+    function pthread_mutexattr_settype (__attr: Ppthread_mutexattr_t; Kind:Integer): Integer; cdecl;external;
+
 {$else}
 Var
     pthread_create : Function(__thread:ppthread_t; __attr:ppthread_attr_t;__start_routine: __start_routine_t;__arg:pointer):longint;cdecl;
@@ -257,16 +220,16 @@ Var
     pthread_key_delete : Function(__key:pthread_key_t):longint;cdecl;
     pthread_setspecific : Function(__key:pthread_key_t; __pointer:pointer):longint;cdecl;
     pthread_getspecific : Function(__key:pthread_key_t):pointer;cdecl;
-    pthread_once : Function(__once_control:ppthread_once_t; __init_routine:tprocedure ):longint;cdecl;
+{    pthread_once : Function(__once_control:ppthread_once_t; __init_routine:tprocedure ):longint;cdecl;}
     pthread_setcancelstate : Function(__state:longint; __oldstate:plongint):longint;cdecl;
     pthread_setcanceltype : Function(__type:longint; __oldtype:plongint):longint;cdecl;
     pthread_cancel : Function(__thread:pthread_t):longint;cdecl;
     pthread_testcancel : Procedure ;cdecl;
-    _pthread_cleanup_push : procedure (__buffer:p_pthread_cleanup_buffer;__routine:t_pthread_cleanup_push_routine; __arg:pointer);cdecl;
-    _pthread_cleanup_push_defer : procedure (__buffer:p_pthread_cleanup_buffer;__routine:t_pthread_cleanup_push_defer_routine; __arg:pointer);cdecl;
-    pthread_sigmask : Function(__how:longint; __newmask:psigset_t; __oldmask:psigset_t):longint;cdecl;
+{    _pthread_cleanup_push : procedure (__buffer:p_pthread_cleanup_buffer;__routine:t_pthread_cleanup_push_routine; __arg:pointer);cdecl;}
+{    _pthread_cleanup_push_defer : procedure (__buffer:p_pthread_cleanup_buffer;__routine:t_pthread_cleanup_push_defer_routine; __arg:pointer);cdecl;}
+{    pthread_sigmask : Function(__how:longint; __newmask:psigset_t; __oldmask:psigset_t):longint;cdecl;}
     pthread_kill : Function(__thread:pthread_t; __signo:longint):longint;cdecl;
-    sigwait : Function(__set:psigset_t; __sig:plongint):longint;cdecl;
+{    sigwait : Function(__set:psigset_t; __sig:plongint):longint;cdecl;}
     pthread_atfork : Function(__prepare:tprocedure ; __parent:tprocedure ; __child:tprocedure ):longint;cdecl;
     pthread_kill_other_threads_np : procedure;cdecl;
 
@@ -333,14 +296,14 @@ begin
   Pointer(pthread_key_delete) := dlsym(PthreadDLL,'pthread_key_delete');
   Pointer(pthread_setspecific) := dlsym(PthreadDLL,'pthread_setspecific');
   Pointer(pthread_getspecific) := dlsym(PthreadDLL,'pthread_getspecific');
-  Pointer(pthread_once) := dlsym(PthreadDLL,'pthread_once');
+{  Pointer(pthread_once) := dlsym(PthreadDLL,'pthread_once');}
   Pointer(pthread_setcancelstate) := dlsym(PthreadDLL,'pthread_setcancelstate');
   Pointer(pthread_setcanceltype) := dlsym(PthreadDLL,'pthread_setcanceltype');
   Pointer(pthread_cancel) := dlsym(PthreadDLL,'pthread_cancel');
   Pointer(pthread_testcancel) := dlsym(PthreadDLL,'pthread_testcancel');
-  Pointer(_pthread_cleanup_push) := dlsym(PthreadDLL,'_pthread_cleanup_push');
-  Pointer(_pthread_cleanup_push_defer) := dlsym(PthreadDLL,'_pthread_cleanup_push_defer');
-  Pointer(pthread_sigmask) := dlsym(PthreadDLL,'pthread_sigmask');
+{  Pointer(_pthread_cleanup_push) := dlsym(PthreadDLL,'_pthread_cleanup_push');}
+{  Pointer(_pthread_cleanup_push_defer) := dlsym(PthreadDLL,'_pthread_cleanup_push_defer');}
+{  Pointer(pthread_sigmask) := dlsym(PthreadDLL,'pthread_sigmask');}
   Pointer(pthread_kill)  := dlsym(PthreadDLL,'pthread_kill');
   Pointer(pthread_atfork):= dlsym(PthreadDLL,'pthread_atfork');
   Pointer(pthread_kill_other_threads_np) := dlsym(PthreadDLL,'pthread_kill_other_threads_np');
@@ -365,7 +328,20 @@ end;
 
 {
   $Log$
-  Revision 1.4  2004-05-23 18:49:18  marco
+  Revision 1.5  2004-09-09 20:29:06  jonas
+    * fixed definition of pthread_mutex_t for non-linux targets (and for
+      linux as well, actually).
+    * base libpthread definitions are now in ptypes.inc, included in unixtype
+      They sometimes have an extra underscore in front of their name, in
+      case they were also exported by the packages/base/pthreads unit, so
+      they can keep their original name there
+    * cthreadds unit now imports systuils, because it uses exceptions (it
+      already did so before as well)
+    * fixed many linux definitions of libpthread functions in pthrlinux.inc
+      (integer -> cint etc)
+    + added culonglong type to ctype.inc
+
+  Revision 1.4  2004/05/23 18:49:18  marco
    * syncobj stuff
 
   Revision 1.3  2003/11/26 20:10:59  michael
@@ -381,4 +357,4 @@ end;
      make it platform dependant.
 
 
-}
+}

+ 97 - 1
rtl/linux/ptypes.inc

@@ -30,6 +30,7 @@ introduction)
 }
 
 {$I ctypes.inc}
+{$packrecords c}
 
 Type
 
@@ -134,7 +135,89 @@ Type
   end;
   PStatFS=^TStatFS;
 
+  pthread_t = culong;
+
+  sched_param = record
+    __sched_priority: cint;
+  end;
+
+  pthread_attr_t = record
+    __detachstate: cint;
+    __schedpolicy: cint;
+    __schedparam: sched_param;
+    __inheritsched: cint;
+    __scope: cint;
+    __guardsize: size_t;
+    __stackaddr_set: cint;
+    __stackaddr: pointer;
+    __stacksize: size_t;
+  end;
+
+  _pthread_fastlock = record
+    __status: clong;
+    __spinlock: cint;
+  end;
+
+  pthread_mutex_t = record
+    __m_reserved: cint;
+    __m_count: cint;
+    __m_owner: pointer;
+    __m_kind:  cint;
+    __m_lock: _pthread_fastlock;
+  end;
+
+  pthread_mutexattr_t = record
+    __mutexkind: cint;
+  end;
+
+  pthread_cond_t = record
+    __c_lock: _pthread_fastlock;
+    __c_waiting: pointer;
+    __padding: array[0..48-1-sizeof(_pthread_fastlock)-sizeof(pointer)-sizeof(clonglong)] of byte;
+    __align: clonglong;
+  end;
+    
+  pthread_condattr_t = record
+    __dummy: cint;
+  end;
+
+  pthread_key_t = cuint;
+
+  pthread_rwlock_t = record
+    __rw_readers: cint;
+    __rw_writer: pointer;
+    __rw_read_waiting: pointer;
+    __rw_write_waiting: pointer;
+    __rw_kind: cint;
+    __rw_pshared: cint;
+  end;
+
+  pthread_rwlockattr_t = record
+    __lockkind: cint;
+    __pshared: cint;
+  end;
+  
+  sem_t = record
+     __sem_lock: _pthread_fastlock;
+     __sem_value: cint;
+     __sem_waiting: pointer;
+  end;
+
+
+
 CONST
+    _PTHREAD_MUTEX_TIMED_NP      = 0;
+    _PTHREAD_MUTEX_RECURSIVE_NP  = 1;
+    _PTHREAD_MUTEX_ERRORCHECK_NP = 2;
+    _PTHREAD_MUTEX_ADAPTIVE_NP   = 3;
+  
+    _PTHREAD_MUTEX_NORMAL     = _PTHREAD_MUTEX_TIMED_NP;
+    _PTHREAD_MUTEX_RECURSIVE  = _PTHREAD_MUTEX_RECURSIVE_NP;
+    _PTHREAD_MUTEX_ERRORCHECK = _PTHREAD_MUTEX_ERRORCHECK_NP;
+    _PTHREAD_MUTEX_DEFAULT    = _PTHREAD_MUTEX_NORMAL;
+    _PTHREAD_MUTEX_FAST_NP    = _PTHREAD_MUTEX_ADAPTIVE_NP;
+
+
    { System limits, POSIX value in parentheses, used for buffer and stack allocation }
    { took idefix' values}
 
@@ -150,7 +233,20 @@ CONST
 
 {
    $Log$
-   Revision 1.10  2004-05-02 01:00:07  peter
+   Revision 1.11  2004-09-09 20:29:06  jonas
+     * fixed definition of pthread_mutex_t for non-linux targets (and for
+       linux as well, actually).
+     * base libpthread definitions are now in ptypes.inc, included in unixtype
+       They sometimes have an extra underscore in front of their name, in
+       case they were also exported by the packages/base/pthreads unit, so
+       they can keep their original name there
+     * cthreadds unit now imports systuils, because it uses exceptions (it
+       already did so before as well)
+     * fixed many linux definitions of libpthread functions in pthrlinux.inc
+       (integer -> cint etc)
+     + added culonglong type to ctype.inc
+
+   Revision 1.10  2004/05/02 01:00:07  peter
      * statfs fixed
 
    Revision 1.9  2004/04/26 16:53:19  peter

+ 59 - 14
rtl/netbsd/ptypes.inc

@@ -21,6 +21,7 @@
 {***********************************************************************}
 
 {$I ctypes.inc}
+{$packrecords c}
 
 type
 
@@ -91,9 +92,50 @@ type
   ptimespec= ^timespec;
   Ttimespec= timespec;
 
-  pthread_key_t = cint;
+   pthread_t            = pointer;
+   pthread_attr_t       = pointer;
+   pthread_mutex_t      = pointer;
+   pthread_mutexattr_t 	= pointer;
+   pthread_cond_t       = pointer;
+   pthread_condattr_t 	= pointer;
+   pthread_key_t        = cint;
+   pthread_rwlock_t 	= pointer;
+   pthread_rwlockattr_t = pointer;
+
+   sem_t		= pointer;
+
+  {
+     Mutex types (Single UNIX Specification, Version 2, 1997).
+    
+     Note that a mutex attribute with one of the following types:
+    
+     PTHREAD_MUTEX_NORMAL
+     PTHREAD_MUTEX_RECURSIVE
+     MUTEX_TYPE_FAST (deprecated)
+     MUTEX_TYPE_COUNTING_FAST (deprecated)
+      
+       will deviate from POSIX specified semantics.
+      }
+
+  pthread_mutextype = (
+    { Default POSIX mutex  }
+    _PTHREAD_MUTEX_ERRORCHECK := 1,
+    { Recursive mutex  }
+    _PTHREAD_MUTEX_RECURSIVE := 2,
+    { No error checking  }
+    _PTHREAD_MUTEX_NORMAL    := 3,
+    _MUTEX_TYPE_MAX
+  );
+
+
+const
+  _PTHREAD_MUTEX_DEFAULT     = _PTHREAD_MUTEX_ERRORCHECK;
+  _MUTEX_TYPE_FAST          = _PTHREAD_MUTEX_NORMAL;
+  _MUTEX_TYPE_COUNTING_FAST = _PTHREAD_MUTEX_RECURSIVE;
+
+  _PTHREAD_KEYS_MAX              = 256;
+  _PTHREAD_STACK_MIN             = 1024;
 
-CONST
    { System limits, POSIX value in parentheses, used for buffer and stack allocation }
     ARG_MAX  = 256*1024;   {4096}  { Maximum number of argument size     }
     NAME_MAX = 255;        {14}    { Maximum number of bytes in filename }
@@ -103,19 +145,22 @@ CONST
 
     SIG_MAXSIG      = 128;	// highest signal version
 
-    DWORDS_IN_PTHREAD_T = sizeof(pointer) div sizeof(dword);
-    DWORDS_IN_PTHREAD_ATTR_T = sizeof(pointer) div sizeof(dword);
-    DWORDS_IN_PTHREAD_MUTEXATTR_T = sizeof(pointer) div sizeof(dword);
-    DWORDS_IN_PTHREAD_MUTEX_T = sizeof(pointer) div sizeof(dword);
-    DWORDS_IN_PTHREAD_COND_ATTR_T = sizeof(pointer) div sizeof(dword);
-    DWORDS_IN_PTHREAD_COND_T = sizeof(pointer) div sizeof(dword);
-    DWORDS_IN_PTHREAD_ONCE_T = sizeof(pointer) div sizeof(dword);
-    DWORDS_IN_PTHREAD_RWLOCK_T = sizeof(pointer) div sizeof(dword);
-    DWORDS_IN_PTHREAD_RWLOCK_ATTR_T = sizeof(pointer) div sizeof(dword);
-
 {
   $Log$
-  Revision 1.7  2004-08-25 21:42:11  jonas
+  Revision 1.8  2004-09-09 20:29:06  jonas
+    * fixed definition of pthread_mutex_t for non-linux targets (and for
+      linux as well, actually).
+    * base libpthread definitions are now in ptypes.inc, included in unixtype
+      They sometimes have an extra underscore in front of their name, in
+      case they were also exported by the packages/base/pthreads unit, so
+      they can keep their original name there
+    * cthreadds unit now imports systuils, because it uses exceptions (it
+      already did so before as well)
+    * fixed many linux definitions of libpthread functions in pthrlinux.inc
+      (integer -> cint etc)
+    + added culonglong type to ctype.inc
+
+  Revision 1.7  2004/08/25 21:42:11  jonas
     * fixed pthread type definitions for darwin and made them generic
 
   Revision 1.6  2004/05/16 13:03:27  peter
@@ -135,4 +180,4 @@ CONST
    * split into ptypes and ctypes
 
 
-}
+}

+ 59 - 14
rtl/openbsd/ptypes.inc

@@ -21,6 +21,7 @@
 {***********************************************************************}
 
 {$I ctypes.inc}
+{$packrecords c}
 
 type
 
@@ -91,9 +92,50 @@ type
   ptimespec= ^timespec;
   Ttimespec= timespec;
 
-  pthread_key_t = cint;
+   pthread_t            = pointer;
+   pthread_attr_t       = pointer;
+   pthread_mutex_t      = pointer;
+   pthread_mutexattr_t 	= pointer;
+   pthread_cond_t       = pointer;
+   pthread_condattr_t 	= pointer;
+   pthread_key_t        = cint;
+   pthread_rwlock_t 	= pointer;
+   pthread_rwlockattr_t = pointer;
+
+   sem_t		= pointer;
+
+  {
+     Mutex types (Single UNIX Specification, Version 2, 1997).
+    
+     Note that a mutex attribute with one of the following types:
+    
+     PTHREAD_MUTEX_NORMAL
+     PTHREAD_MUTEX_RECURSIVE
+     MUTEX_TYPE_FAST (deprecated)
+     MUTEX_TYPE_COUNTING_FAST (deprecated)
+      
+       will deviate from POSIX specified semantics.
+      }
+
+  pthread_mutextype = (
+    { Default POSIX mutex  }
+    _PTHREAD_MUTEX_ERRORCHECK := 1,
+    { Recursive mutex  }
+    _PTHREAD_MUTEX_RECURSIVE := 2,
+    { No error checking  }
+    _PTHREAD_MUTEX_NORMAL    := 3,
+    _MUTEX_TYPE_MAX
+  );
+
+
+const
+  _PTHREAD_MUTEX_DEFAULT     = _PTHREAD_MUTEX_ERRORCHECK;
+  _MUTEX_TYPE_FAST          = _PTHREAD_MUTEX_NORMAL;
+  _MUTEX_TYPE_COUNTING_FAST = _PTHREAD_MUTEX_RECURSIVE;
+
+  _PTHREAD_KEYS_MAX              = 256;
+  _PTHREAD_STACK_MIN             = 1024;
 
-CONST
    { System limits, POSIX value in parentheses, used for buffer and stack allocation }
     ARG_MAX  = 256*1024;   {4096}  { Maximum number of argument size     }
     NAME_MAX = 255;        {14}    { Maximum number of bytes in filename }
@@ -104,19 +146,22 @@ CONST
     SIG_MAXSIG      = 128;	// highest signal version
     wordsinsigset   = 4;		// words in sigset_t
 
-    DWORDS_IN_PTHREAD_T = sizeof(pointer) div sizeof(dword);
-    DWORDS_IN_PTHREAD_ATTR_T = sizeof(pointer) div sizeof(dword);
-    DWORDS_IN_PTHREAD_MUTEXATTR_T = sizeof(pointer) div sizeof(dword);
-    DWORDS_IN_PTHREAD_MUTEX_T = sizeof(pointer) div sizeof(dword);
-    DWORDS_IN_PTHREAD_COND_ATTR_T = sizeof(pointer) div sizeof(dword);
-    DWORDS_IN_PTHREAD_COND_T = sizeof(pointer) div sizeof(dword);
-    DWORDS_IN_PTHREAD_ONCE_T = sizeof(pointer) div sizeof(dword);
-    DWORDS_IN_PTHREAD_RWLOCK_T = sizeof(pointer) div sizeof(dword);
-    DWORDS_IN_PTHREAD_RWLOCK_ATTR_T = sizeof(pointer) div sizeof(dword);
-
 {
   $Log$
-  Revision 1.5  2004-08-25 21:42:11  jonas
+  Revision 1.6  2004-09-09 20:29:06  jonas
+    * fixed definition of pthread_mutex_t for non-linux targets (and for
+      linux as well, actually).
+    * base libpthread definitions are now in ptypes.inc, included in unixtype
+      They sometimes have an extra underscore in front of their name, in
+      case they were also exported by the packages/base/pthreads unit, so
+      they can keep their original name there
+    * cthreadds unit now imports systuils, because it uses exceptions (it
+      already did so before as well)
+    * fixed many linux definitions of libpthread functions in pthrlinux.inc
+      (integer -> cint etc)
+    + added culonglong type to ctype.inc
+
+  Revision 1.5  2004/08/25 21:42:11  jonas
     * fixed pthread type definitions for darwin and made them generic
 
   Revision 1.4  2004/01/22 13:46:14  marco
@@ -136,4 +181,4 @@ CONST
    * split into ptypes and ctypes
 
 
-}
+}

+ 83 - 48
rtl/unix/cthreads.pp

@@ -37,7 +37,9 @@ implementation
 Uses
   systhrds,
   BaseUnix,
-  unix
+  unix,
+  unixtype,
+  sysutils
 {$ifdef dynpthreads}
   ,dl
 {$endif}
@@ -160,7 +162,7 @@ Uses
 {$endif DEBUG_MT}
         ThreadMain:=pointer(ti.f(ti.p));
         DoneThread;
-	pthread_detach(pointer(pthread_self));
+        pthread_detach(pthread_t(pthread_self()));
       end;
 
 
@@ -216,16 +218,18 @@ Uses
     procedure CEndThread(ExitCode : DWord);
       begin
         DoneThread;
-        pthread_detach(pointer(pthread_self));
+        pthread_detach(pthread_t(pthread_self()));
         pthread_exit(pointer(ExitCode));
       end;
 
 
+{$warning threadhandle can be larger than a dword}
     function  CSuspendThread (threadHandle : dword) : dword;
     begin
       {$Warning SuspendThread needs to be implemented}
     end;
 
+{$warning threadhandle can be larger than a dword}
     function  CResumeThread  (threadHandle : dword) : dword;
     begin
       {$Warning ResumeThread needs to be implemented}
@@ -237,12 +241,14 @@ Uses
       {$Warning ThreadSwitch needs to be implemented}
     end;
 
+{$warning threadhandle can be larger than a dword}
     function  CKillThread (threadHandle : dword) : dword;
     begin
-      pthread_detach(pointer(threadHandle));
-      CKillThread := pthread_cancel(Pointer(threadHandle));
+      pthread_detach(pthread_t(threadHandle));
+      CKillThread := pthread_cancel(pthread_t(threadHandle));
     end;
 
+{$warning threadhandle can be larger than a dword}
     function  CWaitForThreadTerminate (threadHandle : dword; TimeoutMs : longint) : dword;  {0=no timeout}
     var
       LResultP: Pointer;
@@ -250,24 +256,27 @@ Uses
     begin
       LResult := 0;
       LResultP := @LResult;
-      pthread_join(Pointer(threadHandle), @LResultP);
+      pthread_join(pthread_t(threadHandle), @LResultP);
       CWaitForThreadTerminate := LResult;
     end;
 
+{$warning threadhandle can be larger than a dword}
     function  CThreadSetPriority (threadHandle : dword; Prio: longint): boolean; {-15..+15, 0=normal}
     begin
       {$Warning ThreadSetPriority needs to be implemented}
     end;
 
 
+{$warning threadhandle can be larger than a dword}
     function  CThreadGetPriority (threadHandle : dword): Integer;
     begin
       {$Warning ThreadGetPriority needs to be implemented}
     end;
 
+{$warning threadhandle can be larger than a dword}
     function  CGetCurrentThreadId : dword;
     begin
-      CGetCurrentThreadId:=dword(pthread_self);
+      CGetCurrentThreadId:=dword(pthread_self());
     end;
 
 
@@ -277,36 +286,43 @@ Uses
 
     procedure CInitCriticalSection(var CS);
 
-    Var
-      P : PRTLCriticalSection;
-
-      begin
-         P:=PRTLCriticalSection(@CS);
-         With p^ do
-           begin
-           m_spinlock:=0;
-           m_count:=0;
-           m_owner:=nil;
-           m_kind:=1;
-           m_waiting.head:=nil;
-           m_waiting.tail:=nil;
-           end;
-         pthread_mutex_init(P,NIL);
-      end;
+    var
+      MAttr : pthread_mutexattr_t;
+      res: longint;
+    begin
+      res:=pthread_mutexattr_init(@MAttr);
+      if res=0 then
+        begin
+          res:=pthread_mutexattr_settype(@MAttr,longint(_PTHREAD_MUTEX_RECURSIVE));
+          if res=0 then
+            res := pthread_mutex_init(@CS,@MAttr)
+          else
+            { No recursive mutex support :/ }
+            res := pthread_mutex_init(@CS,NIL);
+        end
+      else 
+        res:= pthread_mutex_init(@CS,NIL);
+      pthread_mutexattr_destroy(@MAttr);
+      if res <> 0 then
+        runerror(6);
+    end;                           
 
     procedure CEnterCriticalSection(var CS);
       begin
-         pthread_mutex_lock(@CS);
+         if pthread_mutex_lock(@CS) <> 0 then
+           runerror(6);
       end;
 
     procedure CLeaveCriticalSection(var CS);
       begin
-         pthread_mutex_unlock(@CS);
+         if pthread_mutex_unlock(@CS) <> 0 then
+           runerror(6)
       end;
 
     procedure CDoneCriticalSection(var CS);
       begin
-         pthread_mutex_destroy(@CS);
+         if pthread_mutex_destroy(@CS) <> 0 then
+           runerror(6);
       end;
 
 
@@ -378,7 +394,7 @@ begin
 end;
 
 type
-     TPthreadMutex = ppthread_mutex_t;
+     TPthreadMutex = pthread_mutex_t;
      Tbasiceventstate=record
          FSem: Pointer;
          FManualReset: Boolean;
@@ -396,7 +412,7 @@ Const
 function IntBasicEventCreate(EventAttributes : Pointer; AManualReset,InitialState : Boolean;const Name : ansistring):pEventState;
 
 var
-  MAttr : pthread_mutex_attr_t;
+  MAttr : pthread_mutexattr_t;
   res   : cint;
 
 
@@ -406,15 +422,21 @@ begin
   plocaleventstate(result)^.FSem:=New(PSemaphore);  //sem_t.
 //  plocaleventstate(result)^.feventsection:=nil;
   res:=pthread_mutexattr_init(@MAttr);
-  if Res=0 then
-    try
-      Res:=pthread_mutexattr_settype(@MAttr,longint(PTHREAD_MUTEX_RECURSIVE));
+  if res=0 then
+    begin
+      res:=pthread_mutexattr_settype(@MAttr,longint(_PTHREAD_MUTEX_RECURSIVE));
       if Res=0 then
-        Res:=pthread_mutex_init(@plocaleventstate(result)^.feventsection,@MAttr);
-    finally
-      pthread_mutexattr_destroy(@MAttr);
-    end;
-  sem_init(psem_t(plocaleventstate(result)^.FSem),ord(False),Ord(InitialState));
+        Res:=pthread_mutex_init(@plocaleventstate(result)^.feventsection,@MAttr)
+      else
+        res:=pthread_mutex_init(@plocaleventstate(result)^.feventsection,nil);
+    end
+  else
+    res:=pthread_mutex_init(@plocaleventstate(result)^.feventsection,nil);
+  pthread_mutexattr_destroy(@MAttr);
+  if res <> 0 then
+    runerror(6);
+  if sem_init(psem_t(plocaleventstate(result)^.FSem),ord(False),Ord(InitialState)) <> 0 then
+    runerror(6);
 end;
 
 procedure Intbasiceventdestroy(state:peventstate);
@@ -453,19 +475,19 @@ begin
     result:=wrError
   else
     begin
-    sem_wait(psem_t(plocaleventstate(state)^.FSem));
-    result:=wrSignaled;
-    if plocaleventstate(state)^.FManualReset then
-      begin
-        pthread_mutex_lock(@plocaleventstate(state)^.feventsection);
-        Try
-            intbasiceventresetevent(State);
-            sem_post(psem_t( plocaleventstate(state)^.FSem));
-          Finally
-        pthread_mutex_unlock(@plocaleventstate(state)^.feventsection);
+      sem_wait(psem_t(plocaleventstate(state)^.FSem));
+      result:=wrSignaled;
+      if plocaleventstate(state)^.FManualReset then
+        begin
+          pthread_mutex_lock(@plocaleventstate(state)^.feventsection);
+          Try
+              intbasiceventresetevent(State);
+              sem_post(psem_t( plocaleventstate(state)^.FSem));
+            Finally
+          pthread_mutex_unlock(@plocaleventstate(state)^.feventsection);
+        end;
       end;
     end;
-    end;
 end;
 
 Var
@@ -513,7 +535,20 @@ initialization
 end.
 {
   $Log$
-  Revision 1.11  2004-05-23 15:30:42  marco
+  Revision 1.12  2004-09-09 20:29:06  jonas
+    * fixed definition of pthread_mutex_t for non-linux targets (and for
+      linux as well, actually).
+    * base libpthread definitions are now in ptypes.inc, included in unixtype
+      They sometimes have an extra underscore in front of their name, in
+      case they were also exported by the packages/base/pthreads unit, so
+      they can keep their original name there
+    * cthreadds unit now imports systuils, because it uses exceptions (it
+      already did so before as well)
+    * fixed many linux definitions of libpthread functions in pthrlinux.inc
+      (integer -> cint etc)
+    + added culonglong type to ctype.inc
+
+  Revision 1.11  2004/05/23 15:30:42  marco
    * basicevent, still untested.
 
   Revision 1.10  2004/03/03 22:00:28  peter

+ 17 - 10
rtl/unix/systhrds.pp

@@ -21,19 +21,13 @@ unit systhrds;
 
 interface
 
+  uses
+    unixtype;
 { Posix compliant definition }
 
   type
      PRTLCriticalSection = ^TRTLCriticalSection;
-     TRTLCriticalSection = record
-          m_spinlock : longint;
-          m_count : longint;
-          m_owner : pointer {pthread_t};
-          m_kind : longint;
-          m_waiting : record
-            head,tail : pointer;
-          end; {_pthread_queue}
-       end;
+     TRTLCriticalSection = pthread_mutex_t;
 
 { Include generic thread interface }
 {$i threadh.inc}
@@ -63,7 +57,20 @@ initialization
 end.
 {
   $Log$
-  Revision 1.21  2003-11-26 20:10:59  michael
+  Revision 1.22  2004-09-09 20:29:06  jonas
+    * fixed definition of pthread_mutex_t for non-linux targets (and for
+      linux as well, actually).
+    * base libpthread definitions are now in ptypes.inc, included in unixtype
+      They sometimes have an extra underscore in front of their name, in
+      case they were also exported by the packages/base/pthreads unit, so
+      they can keep their original name there
+    * cthreadds unit now imports systuils, because it uses exceptions (it
+      already did so before as well)
+    * fixed many linux definitions of libpthread functions in pthrlinux.inc
+      (integer -> cint etc)
+    + added culonglong type to ctype.inc
+
+  Revision 1.21  2003/11/26 20:10:59  michael
   + New threadmanager implementation
 
   Revision 1.20  2003/11/19 10:54:32  marco