bionic: pthread: use private futexes by default for mutexes and condvars
Private futexes are a recent kernel addition: faster futexes that cannot be
shared between processes. This patch uses them by default, unless the PROCESS_SHARED
attribute flag is used when creating a mutex and/or conditional variable.
Also introduces pthread_condattr_init/destroy/setpshared/getpshared.
Change-Id: I3a0e2116f467072b046524cb5babc00e41057a53
diff --git a/libc/arch-arm/bionic/atomics_arm.S b/libc/arch-arm/bionic/atomics_arm.S
index 55c642f..5076fe3 100644
--- a/libc/arch-arm/bionic/atomics_arm.S
+++ b/libc/arch-arm/bionic/atomics_arm.S
@@ -43,6 +43,19 @@
#define FUTEX_WAIT 0
#define FUTEX_WAKE 1
+/* Private futexes belong to a single address space and cannot be
+ * shared among processes. They are however significantly faster to
+ * operate than standard futexes.
+ */
+.global __futex_wait_private
+.type __futex_wait_private, %function
+.global __futex_wake_private
+.type __futex_wake_private, %function
+
+#define FUTEX_PRIVATE_FLAG 128
+#define FUTEX_WAIT_PRIVATE (FUTEX_WAIT|FUTEX_PRIVATE_FLAG)
+#define FUTEX_WAKE_PRIVATE (FUTEX_WAKE|FUTEX_PRIVATE_FLAG)
+
#if 1
.equ kernel_cmpxchg, 0xFFFF0FC0
.equ kernel_atomic_base, 0xFFFF0FFF
@@ -185,6 +198,28 @@
ldmia sp!, {r4, r7}
bx lr
+__futex_wait_private:
+ .fnstart
+ stmdb sp!, {r4, r7}
+ .save {r4, r7}
+ mov r3, r2
+ mov r2, r1
+ mov r1, #FUTEX_WAIT_PRIVATE
+ ldr r7, =__NR_futex
+ swi #0
+ ldmia sp!, {r4, r7}
+ bx lr
+ .fnend
+
+__futex_wake_private:
+ stmdb sp!, {r4, r7}
+ mov r2, r1
+ mov r1, #FUTEX_WAKE_PRIVATE
+ ldr r7, =__NR_futex
+ swi #0
+ ldmia sp!, {r4, r7}
+ bx lr
+
#else
__futex_wait:
@@ -200,4 +235,17 @@
swi #__NR_futex
bx lr
+__futex_wait_private:
+ mov r3, r2
+ mov r2, r1
+ mov r1, #FUTEX_WAIT_PRIVATE
+ swi #__NR_futex
+ bx lr
+
+__futex_wake_private:
+ mov r2, r1
+ mov r1, #FUTEX_WAKE_PRIVATE
+ swi #__NR_futex
+ bx lr
+
#endif