fbcc3e5004
This is complex, but I think it is reasonably documented in the source. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Reviewed-by: Fam Zheng <famz@redhat.com> Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> Message-id: 20170112180800.21085-5-pbonzini@redhat.com Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
37 lines
824 B
C
37 lines
824 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.
|
|
*
|
|
*/
|
|
|
|
#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();
|
|
}
|
|
}
|
|
}
|