xref: /titanic_44/usr/src/head/threads.h (revision d1c5dc47e23888b05d4095e8983ccf62acbc69fa)
1*d1c5dc47SRobert Mustacchi /*
2*d1c5dc47SRobert Mustacchi  * This file and its contents are supplied under the terms of the
3*d1c5dc47SRobert Mustacchi  * Common Development and Distribution License ("CDDL"), version 1.0.
4*d1c5dc47SRobert Mustacchi  * You may only use this file in accordance with the terms of version
5*d1c5dc47SRobert Mustacchi  * 1.0 of the CDDL.
6*d1c5dc47SRobert Mustacchi  *
7*d1c5dc47SRobert Mustacchi  * A full copy of the text of the CDDL should have accompanied this
8*d1c5dc47SRobert Mustacchi  * source.  A copy of the CDDL is also available via the Internet at
9*d1c5dc47SRobert Mustacchi  * http://www.illumos.org/license/CDDL.
10*d1c5dc47SRobert Mustacchi  */
11*d1c5dc47SRobert Mustacchi 
12*d1c5dc47SRobert Mustacchi /*
13*d1c5dc47SRobert Mustacchi  * Copyright 2016 Joyent, Inc.
14*d1c5dc47SRobert Mustacchi  */
15*d1c5dc47SRobert Mustacchi 
16*d1c5dc47SRobert Mustacchi #ifndef _THREADS_H
17*d1c5dc47SRobert Mustacchi #define	_THREADS_H
18*d1c5dc47SRobert Mustacchi 
19*d1c5dc47SRobert Mustacchi /*
20*d1c5dc47SRobert Mustacchi  * ISO/IEC C11 threads.h support
21*d1c5dc47SRobert Mustacchi  */
22*d1c5dc47SRobert Mustacchi 
23*d1c5dc47SRobert Mustacchi #include <sys/feature_tests.h>
24*d1c5dc47SRobert Mustacchi 
25*d1c5dc47SRobert Mustacchi #include <sys/types.h>
26*d1c5dc47SRobert Mustacchi #include <limits.h>
27*d1c5dc47SRobert Mustacchi #include <time.h>
28*d1c5dc47SRobert Mustacchi #include <pthread.h>
29*d1c5dc47SRobert Mustacchi 
30*d1c5dc47SRobert Mustacchi #ifdef __cplusplus
31*d1c5dc47SRobert Mustacchi extern "C" {
32*d1c5dc47SRobert Mustacchi #endif
33*d1c5dc47SRobert Mustacchi 
34*d1c5dc47SRobert Mustacchi #if !defined(_STRICT_SYMBOLS) || defined(_STDC_C11)
35*d1c5dc47SRobert Mustacchi 
36*d1c5dc47SRobert Mustacchi #if !defined(_NORETURN_KYWD)
37*d1c5dc47SRobert Mustacchi #if __STDC_VERSION__ - 0 >= 201112L
38*d1c5dc47SRobert Mustacchi #define	_NORETURN_KYWD	_Noreturn
39*d1c5dc47SRobert Mustacchi #else
40*d1c5dc47SRobert Mustacchi #define	_NORETURN_KYWD
41*d1c5dc47SRobert Mustacchi #endif	/* __STDC_VERSION__ - 0 >= 201112L */
42*d1c5dc47SRobert Mustacchi #endif	/* !defined(_NORETURN_KYWD) */
43*d1c5dc47SRobert Mustacchi 
44*d1c5dc47SRobert Mustacchi #define	thread_local	_Thread_local
45*d1c5dc47SRobert Mustacchi #define	ONCE_FLAG_INIT	PTHREAD_ONCE_INIT
46*d1c5dc47SRobert Mustacchi #define	TSS_DTOR_ITERATIONS	PTHREAD_DESTRUCTOR_ITERATIONS
47*d1c5dc47SRobert Mustacchi 
48*d1c5dc47SRobert Mustacchi typedef	pthread_cond_t cnd_t;
49*d1c5dc47SRobert Mustacchi typedef	pthread_t thrd_t;
50*d1c5dc47SRobert Mustacchi typedef	pthread_key_t tss_t;
51*d1c5dc47SRobert Mustacchi typedef	pthread_mutex_t mtx_t;
52*d1c5dc47SRobert Mustacchi typedef	void (*tss_dtor_t)(void *);
53*d1c5dc47SRobert Mustacchi typedef int (*thrd_start_t)(void *);
54*d1c5dc47SRobert Mustacchi typedef	pthread_once_t once_flag;
55*d1c5dc47SRobert Mustacchi 
56*d1c5dc47SRobert Mustacchi enum {
57*d1c5dc47SRobert Mustacchi 	mtx_plain = 0x1,
58*d1c5dc47SRobert Mustacchi 	mtx_recursive = 0x2,
59*d1c5dc47SRobert Mustacchi 	mtx_timed = 0x4
60*d1c5dc47SRobert Mustacchi };
61*d1c5dc47SRobert Mustacchi 
62*d1c5dc47SRobert Mustacchi enum {
63*d1c5dc47SRobert Mustacchi 	thrd_success = 0,
64*d1c5dc47SRobert Mustacchi 	thrd_error = 1,
65*d1c5dc47SRobert Mustacchi 	thrd_busy = 2,
66*d1c5dc47SRobert Mustacchi 	thrd_timedout = 3,
67*d1c5dc47SRobert Mustacchi 	thrd_nomem = 4
68*d1c5dc47SRobert Mustacchi };
69*d1c5dc47SRobert Mustacchi 
70*d1c5dc47SRobert Mustacchi extern void call_once(once_flag *, void (*)(void));
71*d1c5dc47SRobert Mustacchi extern int cnd_broadcast(cnd_t *);
72*d1c5dc47SRobert Mustacchi extern void cnd_destroy(cnd_t *);
73*d1c5dc47SRobert Mustacchi extern int cnd_init(cnd_t *);
74*d1c5dc47SRobert Mustacchi extern int cnd_signal(cnd_t *);
75*d1c5dc47SRobert Mustacchi extern int cnd_timedwait(cnd_t *_RESTRICT_KYWD, mtx_t *_RESTRICT_KYWD,
76*d1c5dc47SRobert Mustacchi     const struct timespec *_RESTRICT_KYWD);
77*d1c5dc47SRobert Mustacchi extern int cnd_wait(cnd_t *, mtx_t *);
78*d1c5dc47SRobert Mustacchi extern void mtx_destroy(mtx_t *);
79*d1c5dc47SRobert Mustacchi extern int mtx_init(mtx_t *, int);
80*d1c5dc47SRobert Mustacchi extern int mtx_lock(mtx_t *);
81*d1c5dc47SRobert Mustacchi extern int mtx_timedlock(mtx_t *_RESTRICT_KYWD,
82*d1c5dc47SRobert Mustacchi     const struct timespec *_RESTRICT_KYWD);
83*d1c5dc47SRobert Mustacchi extern int mtx_trylock(mtx_t *);
84*d1c5dc47SRobert Mustacchi extern int mtx_unlock(mtx_t *);
85*d1c5dc47SRobert Mustacchi extern int thrd_create(thrd_t *, thrd_start_t, void *);
86*d1c5dc47SRobert Mustacchi extern thrd_t thrd_current(void);
87*d1c5dc47SRobert Mustacchi extern int thrd_detach(thrd_t);
88*d1c5dc47SRobert Mustacchi extern int thrd_equal(thrd_t, thrd_t);
89*d1c5dc47SRobert Mustacchi extern _NORETURN_KYWD void thrd_exit(int) __NORETURN;
90*d1c5dc47SRobert Mustacchi extern int thrd_join(thrd_t, int *);
91*d1c5dc47SRobert Mustacchi extern int thrd_sleep(const struct timespec *, struct timespec *);
92*d1c5dc47SRobert Mustacchi extern void thrd_yield(void);
93*d1c5dc47SRobert Mustacchi extern int tss_create(tss_t *, tss_dtor_t);
94*d1c5dc47SRobert Mustacchi extern void tss_delete(tss_t);
95*d1c5dc47SRobert Mustacchi extern void *tss_get(tss_t);
96*d1c5dc47SRobert Mustacchi extern int tss_set(tss_t, void *);
97*d1c5dc47SRobert Mustacchi 
98*d1c5dc47SRobert Mustacchi #endif /* !_STRICT_SYMBOLS | _STDC_C11 */
99*d1c5dc47SRobert Mustacchi 
100*d1c5dc47SRobert Mustacchi #ifdef __cplusplus
101*d1c5dc47SRobert Mustacchi }
102*d1c5dc47SRobert Mustacchi #endif
103*d1c5dc47SRobert Mustacchi 
104*d1c5dc47SRobert Mustacchi #endif /* _THREADS_H */
105