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