1 | /* |
2 | * Wrappers around Linux futex syscall |
3 | * |
4 | * Copyright Red Hat, Inc. 2017 |
5 | * |
6 | * Author: |
7 | * Paolo Bonzini <pbonzini@redhat.com> |
8 | * |
9 | * This work is licensed under the terms of the GNU GPL, version 2 or later. |
10 | * See the COPYING file in the top-level directory. |
11 | * |
12 | */ |
13 | |
14 | #ifndef QEMU_FUTEX_H |
15 | #define QEMU_FUTEX_H |
16 | |
17 | #include <sys/syscall.h> |
18 | #include <linux/futex.h> |
19 | |
20 | #define qemu_futex(...) syscall(__NR_futex, __VA_ARGS__) |
21 | |
22 | static inline void qemu_futex_wake(void *f, int n) |
23 | { |
24 | qemu_futex(f, FUTEX_WAKE, n, NULL, NULL, 0); |
25 | } |
26 | |
27 | static inline void qemu_futex_wait(void *f, unsigned val) |
28 | { |
29 | while (qemu_futex(f, FUTEX_WAIT, (int) val, NULL, NULL, 0)) { |
30 | switch (errno) { |
31 | case EWOULDBLOCK: |
32 | return; |
33 | case EINTR: |
34 | break; /* get out of switch and retry */ |
35 | default: |
36 | abort(); |
37 | } |
38 | } |
39 | } |
40 | |
41 | #endif /* QEMU_FUTEX_H */ |
42 | |