Files
seta75D d6fe8fe829 Init
2021-10-11 22:19:34 -03:00

562 lines
13 KiB
C

/* static char sccsid[] = "@(#)15 1.31 src/bos/usr/ccs/lib/libpthreads/pthread.h, libpth, bos41J, 9515A_all 3/31/95 08:34:57"; */
/*
* COMPONENT_NAME: libpth
*
* FUNCTIONS:
*
* ORIGINS: 71, 83
*
* LEVEL 1, 5 Years Bull Confidential Information
*
* (c) Copyright 1990, 1991, 1992, 1993 OPEN SOFTWARE FOUNDATION, INC.
* ALL RIGHTS RESERVED
*
* OSF/1 1.2
*/
/*
* file: pthread.h
*/
/* -----------------------------------------------------------------------------
* Definitions for the Pthreads package.
*/
#ifndef _PTHREAD_H_
#define _PTHREAD_H_
#include <standards.h>
#define _THREAD_SAFE 1
#include <unistd.h> /* for SC_PAGE_SIZE */
#include <sys/types.h>
#include <sys/timers.h>
#include <errno.h>
#include <sys/sched.h>
#define MUTEX_FAST_NP 2 /* for DCE support */
#define MUTEX_RECURSIVE_NP 1
#define MUTEX_NONRECURSIVE_NP 0 /* Default */
#define PTHREAD_CANCELED -1
/* Provisoire */
/* struct sched_param should be in <sched.h> */
struct sched_param {
int sched_priority;
int sched_policy;
int sched_reserved[6];
};
int __page_size;
int __page_size_K;
int __page_sizeX16;
int __page_sizeX24;
int __page_sizeM1;
/*
* POSIX CHOICES of LIBPTHREADS
* (must be after <unistd.h>)
*/
#ifndef _POSIX_REENTRANT_FUNCTIONS
#define _POSIX_REENTRANT_FUNCTIONS
#endif
#ifndef _POSIX_THREADS
#define _POSIX_THREADS
#endif
#ifdef _POSIX_THREAD_ATTR_STACKADDR
#undef _POSIX_THREAD_ATTR_STACKADDR
#endif
#ifndef _POSIX_THREAD_ATTR_STACKSIZE
#define _POSIX_THREAD_ATTR_STACKSIZE
#endif
#ifdef _POSIX_THREAD_FORKALL
#undef _POSIX_THREAD_FORKALL
#endif
#ifndef _POSIX_THREAD_PRIORITY_SCHEDULING
#define _POSIX_THREAD_PRIORITY_SCHEDULING
#endif
#ifdef _POSIX_THREAD_PRIO_INHERIT
#undef _POSIX_THREAD_PRIO_INHERIT
#endif
#ifdef _POSIX_THREAD_PRIO_PROTECT
#undef _POSIX_THREAD_PRIO_PROTECT
#endif
#ifdef _POSIX_THREAD_PROCESS_SHARED
#undef _POSIX_THREAD_PROCESS_SHARED
#endif
/* scheduling
*/
#define DEFAULT_SCHED SCHED_OTHER
#define PTHREAD_PRIO_MAX 127
#define PTHREAD_PRIO_MIN 1
#define DEFAULT_PRIO PTHREAD_PRIO_MIN
#define PTHREAD_INHERIT_SCHED 0
#define PTHREAD_EXPLICIT_SCHED 1
#define DEFAULT_INHERIT PTHREAD_INHERIT_SCHED
#define PTHREAD_SCOPE_SYSTEM 0
#define PTHREAD_SCOPE_PROCESS 1
#define PTHREAD_SCOPE_GLOBAL PTHREAD_SCOPE_SYSTEM
#define PTHREAD_SCOPE_LOCAL PTHREAD_SCOPE_PROCESS
#define DEFAULT_SCOPE PTHREAD_SCOPE_LOCAL
/* detach state
*/
#define PTHREAD_CREATE_DETACHED 1
#define PTHREAD_CREATE_UNDETACHED 0
#define DEFAULT_DETACHSTATE PTHREAD_CREATE_DETACHED
/* cancelability
*/
#define PTHREAD_CANCEL_DISABLE 0 /* general cancellation off */
#define PTHREAD_CANCEL_ENABLE 1 /* general cancellation on */
#define PTHREAD_CANCEL_DEFERRED 0 /* async cancellation off */
#define PTHREAD_CANCEL_ASYNCHRONOUS 1 /* async cancellation on */
/* specific-data
*/
#define PTHREAD_SPECIFIC_DATA __page_size /* per-thread data */
#define APTHREAD_DATAKEYS_MAX (PTHREAD_SPECIFIC_DATA / sizeof(specific_data_t))
#ifndef PTHREAD_DATAKEYS_MAX
#define PTHREAD_DATAKEYS_MAX (APTHREAD_DATAKEYS_MAX - 4)
#endif
/* some limits
*/
#ifndef PTHREAD_STACK_MIN
#define PTHREAD_STACK_MIN (__page_sizeX24)
#endif
#ifdef PTHREAD_THREADS_MAX
#undef PTHREAD_THREADS_MAX
#endif
#ifndef PTHREAD_THREADS_MAX
#define PTHREAD_THREADS_MAX 512 /* per-segment */
#endif
extern int
sigthreadmask(int how, const sigset_t *set, sigset_t *oset);
/* -----------------------------------------------------------------------------
* Machine Dependent definitions for the Pthreads Package.
*/
#ifndef _MACHINE_PTHREAD_H_
#define _MACHINE_PTHREAD_H_
typedef volatile int __ptlock_type;
#endif /*_MACHINE_PTHREAD_H_*/
#ifdef _NO_PROTO
#define __(args) ()
#else /* _NO_PROTO */
#define __(args) args
#endif /* _NO_PROTO */
/* -----------------------------------------------------------------------------
* Pthread Attributes
*/
typedef struct __pt_attr *pthread_attr_t;
extern pthread_attr_t pthread_attr_default;
extern int
pthread_attr_init __((pthread_attr_t *));
extern int
pthread_attr_destroy __((pthread_attr_t *));
extern int
pthread_attr_setstacksize __((pthread_attr_t *, size_t));
extern int
pthread_attr_getstacksize __((const pthread_attr_t *, size_t *));
extern int
pthread_attr_setstackaddr __((pthread_attr_t *, void *));
extern int
pthread_attr_getstackaddr __((const pthread_attr_t *, void **));
extern int
pthread_attr_setschedpolicy __((pthread_attr_t *, int));
extern int
pthread_attr_getschedpolicy __((const pthread_attr_t *, int *));
extern int
pthread_attr_setschedparam __((pthread_attr_t *, const struct sched_param *));
extern int
pthread_attr_getschedparam __((const pthread_attr_t *,
struct sched_param *));
extern int
pthread_attr_setinheritsched __((pthread_attr_t *, int));
extern int
pthread_attr_getinheritsched __((const pthread_attr_t *, int *));
extern int
pthread_attr_setdetachstate __((pthread_attr_t *, int));
extern int
pthread_attr_getdetachstate __((const pthread_attr_t *, int *));
/* -----------------------------------------------------------------------------
* Functions for fork()
*/
extern int
pthread_atfork(void (*)(void), void (*)(void), void (*)(void));
extern int
forkall(pid_t *);
/* -----------------------------------------------------------------------------
* Pthreads
*/
typedef void *pthread_t;
extern int
pthread_setschedparam __((pthread_t, int , const struct sched_param *));
extern int
pthread_getschedparam __((pthread_t, int *, struct sched_param *));
extern pthread_t
pthread_self __((void));
extern int
pthread_create __((pthread_t *, const pthread_attr_t *, void *(*)(void *), void *));
extern int
pthread_detach __((pthread_t));
extern int
pthread_join __((pthread_t, void **));
extern void
pthread_exit __((void *));
extern void
pthread_yield __((void));
extern void
pthread_cleanup_push __((void (*)(void *), void *));
extern void
pthread_cleanup_pop __((int));
extern int
pthread_cancel __((pthread_t));
extern int
pthread_attr_setscope __((pthread_attr_t *, int));
extern int
pthread_attr_getscope __((const pthread_attr_t *, int *));
extern int
pthread_equal __((pthread_t, pthread_t));
extern int
pthread_kill __((pthread_t, int));
#define pthread_equal(t1, t2) ((t1) == (t2))
/* -----------------------------------------------------------------------------
* Pthread Queue Structures
*/
typedef struct __ptq_queue {
struct __ptq_queue *__ptq_next;
struct __ptq_queue *__ptq_prev;
} __ptq_queue;
/* -----------------------------------------------------------------------------
* Mutex Attributes
*/
typedef struct __pt_attr *pthread_mutexattr_t;
extern pthread_mutexattr_t pthread_mutexattr_default;
extern int
pthread_mutexattr_init __((pthread_mutexattr_t *));
extern int
pthread_mutexattr_destroy __((pthread_mutexattr_t *));
extern int
pthread_mutexattr_setprotocol __((pthread_mutexattr_t *, int));
extern int
pthread_mutexattr_getprotocol __((const pthread_mutexattr_t *, int *));
extern int
pthread_mutexattr_setprioceiling __((pthread_mutexattr_t *, int));
extern int
pthread_mutexattr_getprioceiling __((const pthread_mutexattr_t *, int *));
extern int
pthread_mutexattr_getpshared __((const pthread_mutexattr_t *, int *));
extern int
pthread_mutexattr_setpshared __((const pthread_mutexattr_t *, int));
/* -----------------------------------------------------------------------------
* Mutexes
*/
typedef struct {
__ptq_queue link;
__ptlock_type __ptmtx_lock;
long __ptmtx_flags;
#ifdef _POSIX_THREAD_PRIO_INHERIT
int protocol;
#ifdef _POSIX_THREAD_PRIO_PROTECT
int prioceiling;
#endif
#endif
pthread_t __ptmtx_owner;
int mtx_id;
pthread_attr_t attr; /* attributes pointer*/
int mtx_kind; /* kind of the mutex */
int lock_cpt; /* number of recursive locks */
int reserved[4];
} pthread_mutex_t;
extern int
pthread_mutex_init __((pthread_mutex_t *, pthread_mutexattr_t *));
extern int
pthread_mutex_destroy __((pthread_mutex_t *));
extern int
pthread_mutex_lock __((pthread_mutex_t *));
extern int
pthread_mutex_trylock __((pthread_mutex_t *));
extern int
pthread_mutex_unlock __((pthread_mutex_t *));
extern int
pthread_mutex_setprioceiling __((pthread_mutex_t *, int, int *));
extern int
pthread_mutex_getprioceiling __((pthread_mutex_t *, int *));
#define pthread_mutex_getowner_np(mutex) ((mutex)->__ptmtx_owner)
#define MUTEX_INITSTATIC 2
#define PTHREAD_MUTEX_INITIALIZER {0, 0, 0, MUTEX_INITSTATIC, 0, 0, 0}
/* -----------------------------------------------------------------------------
* Condition Variable Attributes
*/
typedef struct __pt_attr *pthread_condattr_t;
extern pthread_condattr_t pthread_condattr_default;
extern int
pthread_condattr_init __((pthread_condattr_t *));
extern int
pthread_condattr_destroy __((pthread_condattr_t *));
extern int
pthread_condattr_getpshared __((const pthread_condattr_t *, int *));
extern int
pthread_condattr_setpshared __((const pthread_condattr_t *, int));
#define COND_INITSTATIC 2
#define PTHREAD_COND_INITIALIZER {0, 0, 0, COND_INITSTATIC, 0, 0, 0, 0}
/* -----------------------------------------------------------------------------
* Condition Variables
*/
typedef struct {
__ptq_queue link;
__ptlock_type __ptcv_lock;
long __ptcv_flags;
__ptq_queue __ptcv_waiters;
int cv_id;
pthread_attr_t attr; /* attributes pointer*/
pthread_mutex_t *mutex; /* mutex attachs to condition variable*/
int cptwait; /* number blocks on the condition */
int reserved;
} pthread_cond_t;
extern int
pthread_cond_init __((pthread_cond_t *, pthread_condattr_t *));
extern int
pthread_cond_destroy __((pthread_cond_t *));
extern int
pthread_cond_wait __((pthread_cond_t *, pthread_mutex_t *));
extern int
pthread_cond_timedwait __((pthread_cond_t *, pthread_mutex_t *,
const struct timespec *));
extern int
pthread_cond_signal __((pthread_cond_t *));
extern int
pthread_cond_broadcast __((pthread_cond_t *));
/* -----------------------------------------------------------------------------
* Thread Specific Data
*/
struct specific_data {
long flags;
const void *value;
};
typedef struct specific_data specific_data_t;
typedef unsigned int pthread_key_t;
extern int
pthread_key_create __((pthread_key_t *, void (*)(void *)));
extern int
pthread_key_delete __((pthread_key_t ));
extern void *
pthread_getspecific __((pthread_key_t));
extern int
pthread_setspecific __((pthread_key_t, const void *));
/* -----------------------------------------------------------------------------
* Cancellation
*/
extern void
pthread_testcancel __((void));
extern int
pthread_setcancelstate __((int, int *));
extern int
pthread_setcanceltype __((int, int *));
typedef struct __pthread_cleanup_handler_t {
struct __pthread_cleanup_handler_t *__next_handler;
void (*__handler_function)();
void *__handler_arg;
} __pthread_cleanup_handler_t;
extern pthread_key_t __pthread_cleanup_handlerqueue;
/* -----------------------------------------------------------------------------
* Pthread once
*/
typedef struct {
__ptlock_type __ptonce_lock;
int __ptonce_initialized;
int __ptonce_executing;
int __ptonce_completed;
pthread_mutex_t __ptonce_mutex;
pthread_cond_t __ptonce_executed;
} pthread_once_t;
#define PTHREAD_ONCE_INIT {UL_FREE, 0, 0, 0}
extern int
pthread_once __((pthread_once_t *, void (*)(void)));
/* -----------------------------------------------------------------------------
* Non Posix interface
*/
#ifdef _POSIX_THREAD_PRIORITY_SCHEDULING
extern int pthread_setconcurrency_np(int level);
extern int pthread_getconcurrency_np(int *level);
#endif
/* -----------------------------------------------------------------------------
* DBX interface
*/
extern void __funcblock_np();
/* -----------------------------------------------------------------------------
* DCE Compatibility
*/
#ifndef _AIX32_THREADS
extern int
pthread_getunique_np __((pthread_t *, int *));
extern int
pthread_mutexattr_getkind_np __((pthread_mutexattr_t *, int *));
#endif /* _AIX32_THREADS */
extern int
pthread_mutexattr_setkind_np __((pthread_mutexattr_t *, int ));
extern int
pthread_set_mutexattr_default_np __(( int ));
extern int
pthread_signal_to_cancel_np __((sigset_t *, pthread_t *));
extern int
pthread_delay_np __((struct timespec *));
extern int
pthread_get_expiration_np __((struct timespec *, struct timespec *));
extern void
pthread_lock_global_np __((void));
extern void
pthread_unlock_global_np __((void));
extern int
pthread_atfork_np __((void *, void (*)(void *), void (*)(void *), void (*)(void *)));
extern int
pthread_test_exit_np __((int *));
extern void
pthread_clear_exit_np __((pthread_t));
extern int
pthread_setcancelstate_np __((int, int *));
extern int
pthread_join_np __((pthread_t, void **));
pthread_mutex_t _mutex_global_np; /* recursive mutex */
extern void
pthread_cleanup_push_np __((void (*)(void *), void *, pthread_t *));
extern void
pthread_cleanup_pop_np __((int, pthread_t));
#endif /*_PTHREAD_H_*/