forked from mirror/qemu
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
42 lines
894 B
C
42 lines
894 B
C
/*
|
|
* Wrappers around Linux futex syscall
|
|
*
|
|
* Copyright Red Hat, Inc. 2017
|
|
*
|
|
* Author:
|
|
* Paolo Bonzini <pbonzini@redhat.com>
|
|
*
|
|
* This work is licensed under the terms of the GNU GPL, version 2 or later.
|
|
* See the COPYING file in the top-level directory.
|
|
*
|
|
*/
|
|
|
|
#ifndef QEMU_FUTEX_H
|
|
#define QEMU_FUTEX_H
|
|
|
|
#include <sys/syscall.h>
|
|
#include <linux/futex.h>
|
|
|
|
#define qemu_futex(...) syscall(__NR_futex, __VA_ARGS__)
|
|
|
|
static inline void qemu_futex_wake(void *f, int n)
|
|
{
|
|
qemu_futex(f, FUTEX_WAKE, n, NULL, NULL, 0);
|
|
}
|
|
|
|
static inline void qemu_futex_wait(void *f, unsigned val)
|
|
{
|
|
while (qemu_futex(f, FUTEX_WAIT, (int) val, NULL, NULL, 0)) {
|
|
switch (errno) {
|
|
case EWOULDBLOCK:
|
|
return;
|
|
case EINTR:
|
|
break; /* get out of switch and retry */
|
|
default:
|
|
abort();
|
|
}
|
|
}
|
|
}
|
|
|
|
#endif /* QEMU_FUTEX_H */
|