1/*-
2 * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
3 *
4 * Copyright (c) 2011 Ed Schouten <ed@FreeBSD.org>
5 * Copyright (c) 2022 Dominic Martinez <dom@dominicm.dev>
6 * All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 * 1. Redistributions of source code must retain the above copyright
12 *    notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 *    notice, this list of conditions and the following disclaimer in the
15 *    documentation and/or other materials provided with the distribution.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 * SUCH DAMAGE.
28 *
29 * $FreeBSD$
30 */
31
32#if __GNUC__ > 2 /* not available on gcc2 */
33
34#ifndef _THREADS_H_
35#define _THREADS_H_
36
37#include <sys/types.h>
38#include <time.h>
39
40typedef pthread_cond_t cnd_t;
41typedef pthread_mutex_t mtx_t;
42typedef pthread_t thrd_t;
43typedef pthread_key_t tss_t;
44typedef pthread_once_t once_flag;
45
46typedef void (*tss_dtor_t)(void *);
47typedef int (*thrd_start_t)(void *);
48
49enum {
50	mtx_plain = 0x1,
51	mtx_recursive = 0x2,
52	mtx_timed = 0x4
53};
54
55enum {
56	thrd_busy = 1,
57	thrd_error = 2,
58	thrd_nomem = 3,
59	thrd_success = 4,
60	thrd_timedout = 5
61};
62
63#if !defined(__cplusplus) || __cplusplus < 201103L
64#define	thread_local		_Thread_local
65#endif
66#define	ONCE_FLAG_INIT		{ -1 }
67#define	TSS_DTOR_ITERATIONS	4
68
69#ifdef __cplusplus
70extern "C" {
71#endif
72
73void call_once(once_flag *, void (*)(void));
74int	cnd_broadcast(cnd_t *);
75void cnd_destroy(cnd_t *);
76int	cnd_init(cnd_t *);
77int	cnd_signal(cnd_t *);
78int	cnd_timedwait(cnd_t *__restrict, mtx_t *__restrict __mtx,
79    const struct timespec *__restrict);
80int	cnd_wait(cnd_t *, mtx_t *__mtx);
81void mtx_destroy(mtx_t *__mtx);
82int	mtx_init(mtx_t *__mtx, int);
83int	mtx_lock(mtx_t *__mtx);
84int	mtx_timedlock(mtx_t *__restrict __mtx,
85    const struct timespec *__restrict);
86int	mtx_trylock(mtx_t *__mtx);
87int	mtx_unlock(mtx_t *__mtx);
88int	thrd_create(thrd_t *thread, thrd_start_t, void *);
89thrd_t	thrd_current(void);
90int	thrd_detach(thrd_t);
91int	thrd_equal(thrd_t, thrd_t);
92void thrd_exit(int) __attribute__((noreturn));
93int	thrd_join(thrd_t, int *);
94int	thrd_sleep(const struct timespec *, struct timespec *);
95void	thrd_yield(void);
96
97int	tss_create(tss_t *, tss_dtor_t);
98void	tss_delete(tss_t);
99void *	tss_get(tss_t);
100int	tss_set(tss_t, void *);
101
102#ifdef __cplusplus
103}
104#endif
105
106#endif /* _THREADS_H_ */
107
108#endif /* __GNUC__ > 2 */
109