Revert "Lose the hand-written futex assembler."
This reverts commit ced906c849704f379d7191822f6d74993d4fa296.
Causes issues on art / dalvik due to a broken return value
check and other undiagnosed issues.
bug: 15195455
Change-Id: I5d6bbb389ecefb0e33a5237421a9d56d32a9317c
diff --git a/libc/private/bionic_futex.h b/libc/private/bionic_futex.h
index dd277ed..11699ce 100644
--- a/libc/private/bionic_futex.h
+++ b/libc/private/bionic_futex.h
@@ -28,42 +28,31 @@
#ifndef _BIONIC_FUTEX_H
#define _BIONIC_FUTEX_H
-#include <errno.h>
#include <linux/futex.h>
+#include <sys/cdefs.h>
#include <stdbool.h>
#include <stddef.h>
-#include <sys/cdefs.h>
-#include <sys/syscall.h>
__BEGIN_DECLS
struct timespec;
-static inline int __futex(volatile void* ftx, int op, int value, const struct timespec* timeout) {
- // Our generated syscall assembler sets errno, but our callers (pthread functions) don't want to.
- int saved_errno = errno;
- if (syscall(__NR_futex, ftx, op, value, timeout) == 0) {
- return 0;
- }
- int result = -errno;
- errno = saved_errno;
- return result;
-}
+extern int __futex_syscall4(volatile void* ftx, int op, int value, const struct timespec* timeout);
static inline int __futex_wake(volatile void* ftx, int count) {
- return __futex(ftx, FUTEX_WAKE, count, NULL);
+ return __futex_syscall4(ftx, FUTEX_WAKE, count, NULL);
}
static inline int __futex_wake_ex(volatile void* ftx, bool shared, int count) {
- return __futex(ftx, shared ? FUTEX_WAKE : FUTEX_WAKE_PRIVATE, count, NULL);
+ return __futex_syscall4(ftx, shared ? FUTEX_WAKE : FUTEX_WAKE_PRIVATE, count, NULL);
}
static inline int __futex_wait(volatile void* ftx, int value, const struct timespec* timeout) {
- return __futex(ftx, FUTEX_WAIT, value, timeout);
+ return __futex_syscall4(ftx, FUTEX_WAIT, value, timeout);
}
static inline int __futex_wait_ex(volatile void* ftx, bool shared, int value, const struct timespec* timeout) {
- return __futex(ftx, shared ? FUTEX_WAIT : FUTEX_WAIT_PRIVATE, value, timeout);
+ return __futex_syscall4(ftx, shared ? FUTEX_WAIT : FUTEX_WAIT_PRIVATE, value, timeout);
}
__END_DECLS