#ifndef ISO
constant PTHREAD_CANCEL_ASYNCHRONOUS
constant PTHREAD_CANCEL_ENABLE
constant PTHREAD_CANCEL_DEFERRED
constant PTHREAD_CANCEL_DISABLE
constant PTHREAD_CANCELED
macro PTHREAD_COND_INITIALIZER
constant PTHREAD_CREATE_DETACHED
constant PTHREAD_CREATE_JOINABLE
constant PTHREAD_EXPLICIT_SCHED
constant PTHREAD_INHERIT_SCHED
constant PTHREAD_ONCE_INIT
optional-constant PTHREAD_PRIO_INHERIT
optional-constant PTHREAD_PRIO_NONE
optional-constant PTHREAD_PRIO_PROTECT
constant PTHREAD_PROCESS_SHARED
constant PTHREAD_PROCESS_PRIVATE
constant PTHREAD_SCOPE_PROCESS
constant PTHREAD_SCOPE_SYSTEM
# ifndef POSIX
constant PTHREAD_MUTEX_DEFAULT
constant PTHREAD_MUTEX_ERRORCHECK
constant PTHREAD_MUTEX_NORMAL
macro PTHREAD_MUTEX_INITIALIZER
constant PTHREAD_MUTEX_RECURSIVE
macro PTHREAD_RWLOCK_INITIALIZER
# endif
# if defined XOPEN2K8 || defined POSIX2008
constant PTHREAD_MUTEX_ROBUST
constant PTHREAD_MUTEX_STALLED
# endif

type pthread_attr_t
type pthread_barrier_t
type pthread_barrierattr_t
type pthread_cond_t
type pthread_condattr_t
type pthread_key_t
type pthread_mutex_t
type pthread_mutexattr_t
type pthread_once_t
type pthread_rwlock_t
type pthread_rwlockattr_t
type pthread_spinlock_t
type pthread_t

function int pthread_attr_destroy (pthread_attr_t*)
function int pthread_attr_getdetachstate (const pthread_attr_t*, int*)
# ifndef POSIX
function int pthread_attr_getguardsize (const pthread_attr_t*, size_t*)
# endif
function int pthread_attr_getinheritsched (const pthread_attr_t*, int*)
function int pthread_attr_getschedparam (const pthread_attr_t*, struct sched_param*)
function int pthread_attr_getschedpolicy (const pthread_attr_t*, int*)
function int pthread_attr_getscope (const pthread_attr_t*, int*)
function int pthread_attr_getstackaddr (const pthread_attr_t*, void**)
function int pthread_attr_getstacksize (const pthread_attr_t*, size_t*)
function int pthread_attr_init (pthread_attr_t*)
function int pthread_attr_setdetachstate (pthread_attr_t*, int)
# ifndef POSIX
function int pthread_attr_setguardsize (pthread_attr_t*, size_t)
# endif
function int pthread_attr_setinheritsched (pthread_attr_t*, int)
function int pthread_attr_setschedparam (pthread_attr_t*, const struct sched_param*)
function int pthread_attr_setschedpolicy (pthread_attr_t*, int)
function int pthread_attr_setscope (pthread_attr_t*, int)
function int pthread_attr_setstackaddr (pthread_attr_t*, void*)
function int pthread_attr_setstacksize (pthread_attr_t*, size_t)
function int pthread_barrier_destroy (pthread_barrier_t*)
function int pthread_barrier_init (pthread_barrier_t*, const pthread_barrierattr_t*, unsigned int)
function int pthread_barrier_wait (pthread_barrier_t*)
function int pthread_barrierattr_destroy (pthread_barrierattr_t*)
function int pthread_barrierattr_getpshared (const pthread_barrierattr_t*, int*)
function int pthread_barrierattr_init (pthread_barrierattr_t*)
function int pthread_barrierattr_setpshared (pthread_barrierattr_t*, int)
function int pthread_cancel (pthread_t)
// function int pthread_cleanup_push (void (*) (void*), void*)
macro pthread_cleanup_push
// function int pthread_cleanup_pop (int)
macro pthread_cleanup_pop
function int pthread_cond_broadcast (pthread_cond_t*)
function int pthread_cond_destroy (pthread_cond_t*)
function int pthread_cond_init (pthread_cond_t*, const pthread_condattr_t*)
function int pthread_cond_signal (pthread_cond_t*)
function int pthread_cond_timedwait (pthread_cond_t*, pthread_mutex_t*, const struct timespec*)
function int pthread_cond_wait (pthread_cond_t*, pthread_mutex_t*)
function int pthread_condattr_destroy (pthread_condattr_t*)
optional-function int pthread_condattr_getclock (const pthread_condattr_t*, clockid_t*)
function int pthread_condattr_getpshared (const pthread_condattr_t*, int*)
function int pthread_condattr_init (pthread_condattr_t*)
optional-function int pthread_condattr_setclock (pthread_condattr_t*, clockid_t)
function int pthread_condattr_setpshared (pthread_condattr_t*, int)
function int pthread_create (pthread_t*, const pthread_attr_t*, void *(*) (void*), void*)
function int pthread_detach (pthread_t)
function int pthread_equal (pthread_t, pthread_t)
function void pthread_exit (void*)
# if !defined POSIX && !defined POSIX2008
function int pthread_getconcurrency (void)
# endif
function int pthread_getcpuclockid (pthread_t, clockid_t*)
function int pthread_getschedparam (pthread_t, int*, struct sched_param*)
function {void*} pthread_getspecific (pthread_key_t)
function int pthread_join (pthread_t, void**)
function int pthread_key_create (pthread_key_t*, void (*)(void*))
function int pthread_key_delete (pthread_key_t)
function int pthread_mutex_destroy (pthread_mutex_t*)
optional-function int pthread_mutex_getprioceiling (const pthread_mutex_t*, int*)
function int pthread_mutex_init (pthread_mutex_t*, const pthread_mutexattr_t*)
function int pthread_mutex_lock (pthread_mutex_t*)
optional-function int pthread_mutex_setprioceiling (pthread_mutex_t*, int, int*)
function int pthread_mutex_timedlock (pthread_mutex_t*, const struct timespec*)
function int pthread_mutex_trylock (pthread_mutex_t*)
function int pthread_mutex_unlock (pthread_mutex_t*)
function int pthread_mutexattr_destroy (pthread_mutexattr_t*)
optional-function int pthread_mutexattr_getprioceiling (const pthread_mutexattr_t*, int*)
optional-function int pthread_mutexattr_getprotocol (const pthread_mutexattr_t*, int*)
function int pthread_mutexattr_getpshared (const pthread_mutexattr_t*, int*)
function int pthread_mutexattr_gettype (const pthread_mutexattr_t*, int*)
function int pthread_mutexattr_init (pthread_mutexattr_t*)
optional-function int pthread_mutexattr_setprioceiling (pthread_mutexattr_t*, int)
optional-function int pthread_mutexattr_setprotocol (pthread_mutexattr_t*, int)
function int pthread_mutexattr_setpshared (pthread_mutexattr_t*, int)
function int pthread_mutexattr_settype (pthread_mutexattr_t*, int)
function int pthread_once (pthread_once_t*, void (*) (void))
# ifndef POSIX
function int pthread_rwlock_init (pthread_rwlock_t*, const pthread_rwlockattr_t*)
function int pthread_rwlock_rdlock (pthread_rwlock_t*)
function int pthread_rwlock_timedrdlock (pthread_rwlock_t*, const struct timespec*)
function int pthread_rwlock_timedwrlock (pthread_rwlock_t*, const struct timespec*)
function int pthread_rwlock_tryrdlock (pthread_rwlock_t*)
function int pthread_rwlock_trywrlock (pthread_rwlock_t*)
function int pthread_rwlock_unlock (pthread_rwlock_t*)
function int pthread_rwlock_wrlock (pthread_rwlock_t*)
function int pthread_rwlockattr_destroy (pthread_rwlockattr_t*)
function int pthread_rwlockattr_getpshared (const pthread_rwlockattr_t*, int*)
function int pthread_rwlockattr_init (pthread_rwlockattr_t*)
function int pthread_rwlockattr_setpshared (pthread_rwlockattr_t*, int)
# endif
function pthread_t pthread_self (void)
function int pthread_setcancelstate (int, int*)
function int pthread_setcanceltype (int, int*)
# if !defined POSIX && !defined POSIX2008
function int pthread_setconcurrency (int)
# endif
function int pthread_setschedparam (pthread_t, int, const struct sched_param*)
function int pthread_setspecific (pthread_key_t, const void*)
#if !defined XOPEN2K && !defined XOPEN2K8 && !defined POSIX2008
function int pthread_sigmask (int, const sigset_t*, sigset_t*)
#endif
function int pthread_spin_destroy (pthread_spinlock_t*)
function int pthread_spin_init (pthread_spinlock_t*, int)
function int pthread_spin_lock (pthread_spinlock_t*)
function int pthread_spin_trylock (pthread_spinlock_t*)
function int pthread_spin_unlock (pthread_spinlock_t*)
function void pthread_testcancel (void)
# if defined XOPEN2K8 || defined POSIX2008
function int pthread_mutex_consistent (pthread_mutex_t *)
function int pthread_mutexattr_getrobust (__const pthread_mutexattr_t*, int*)
function int pthread_mutexattr_setrobust (pthread_mutexattr_t*, int)
# endif

allow-header sched.h
allow-header time.h

allow PTHREAD_*
allow pthread_*
allow *_t
#endif
