xref: /openbsd-src/regress/sys/kern/futex/futex.h (revision 116b6a5ef01f5b8841eb46b536173785ac7e4670)
1*116b6a5eSvisa /*	$OpenBSD: futex.h,v 1.2 2018/08/26 06:50:30 visa Exp $ */
22b5b01cfSmpi /*
32b5b01cfSmpi  * Copyright (c) 2017 Martin Pieuchot
42b5b01cfSmpi  *
52b5b01cfSmpi  * Permission to use, copy, modify, and distribute this software for any
62b5b01cfSmpi  * purpose with or without fee is hereby granted, provided that the above
72b5b01cfSmpi  * copyright notice and this permission notice appear in all copies.
82b5b01cfSmpi  *
92b5b01cfSmpi  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
102b5b01cfSmpi  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
112b5b01cfSmpi  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
122b5b01cfSmpi  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
132b5b01cfSmpi  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
142b5b01cfSmpi  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
152b5b01cfSmpi  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
162b5b01cfSmpi  */
172b5b01cfSmpi 
182b5b01cfSmpi static inline int
futex_wake(volatile uint32_t * p,int n,int priv)19*116b6a5eSvisa futex_wake(volatile uint32_t *p, int n, int priv)
202b5b01cfSmpi {
21*116b6a5eSvisa 	return futex(p, FUTEX_WAKE | priv, n, NULL, NULL);
222b5b01cfSmpi }
232b5b01cfSmpi 
242b5b01cfSmpi static inline void
futex_wait(volatile uint32_t * p,int val,int priv)25*116b6a5eSvisa futex_wait(volatile uint32_t *p, int val, int priv)
262b5b01cfSmpi {
272b5b01cfSmpi 	while (*p != (uint32_t)val)
28*116b6a5eSvisa 		futex(p, FUTEX_WAIT | priv, val, NULL, NULL);
292b5b01cfSmpi }
302b5b01cfSmpi 
312b5b01cfSmpi static inline int
futex_twait(volatile uint32_t * p,int val,clockid_t clockid,const struct timespec * timeout,int priv)322b5b01cfSmpi futex_twait(volatile uint32_t *p, int val, clockid_t clockid,
33*116b6a5eSvisa     const struct timespec *timeout, int priv)
342b5b01cfSmpi {
35*116b6a5eSvisa 	return futex(p, FUTEX_WAIT | priv, val, timeout, NULL);
362b5b01cfSmpi }
372b5b01cfSmpi 
382b5b01cfSmpi static inline int
futex_requeue(volatile uint32_t * p,int n,int m,volatile uint32_t * q)392b5b01cfSmpi futex_requeue(volatile uint32_t *p, int n, int m, volatile uint32_t *q)
402b5b01cfSmpi {
412b5b01cfSmpi 	return futex(p, FUTEX_REQUEUE, n, (void *)(long)m, q);
422b5b01cfSmpi }
43