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