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