summaryrefslogtreecommitdiffstats
path: root/libc/arch-x86
diff options
context:
space:
mode:
authorDavid 'Digit' Turner <digit@google.com>2010-03-10 16:44:08 -0800
committerDavid 'Digit' Turner <digit@google.com>2010-03-11 11:48:38 -0800
commitba9c6f0989ae94778ba2b9f597adc827c9dc81e8 (patch)
tree2376f2a87f6ac304bd93beca7c8139b890a6227f /libc/arch-x86
parent1cfbda826ce66e9bd1507a31b7e6df62e0dbcc6e (diff)
downloadbionic-ba9c6f0989ae94778ba2b9f597adc827c9dc81e8.zip
bionic-ba9c6f0989ae94778ba2b9f597adc827c9dc81e8.tar.gz
bionic-ba9c6f0989ae94778ba2b9f597adc827c9dc81e8.tar.bz2
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
Diffstat (limited to 'libc/arch-x86')
-rw-r--r--libc/arch-x86/bionic/atomics_x86.c37
1 files changed, 37 insertions, 0 deletions
diff --git a/libc/arch-x86/bionic/atomics_x86.c b/libc/arch-x86/bionic/atomics_x86.c
index b7b20e6..d6e3247 100644
--- a/libc/arch-x86/bionic/atomics_x86.c
+++ b/libc/arch-x86/bionic/atomics_x86.c
@@ -60,6 +60,43 @@ int __futex_wake(volatile void *ftx, int count)
return ret;
}
+/* Private futexes belong to a single address space and cannot be
+ * shared among processes. They are however significantly faster to
+ * operate than standard futexes.
+ */
+#define FUTEX_PRIVATE_FLAG 128
+#define FUTEX_WAIT_PRIVATE (FUTEX_WAIT|FUTEX_PRIVATE_FLAG)
+#define FUTEX_WAKE_PRIVATE (FUTEX_WAKE|FUTEX_PRIVATE_FLAG)
+
+int __futex_wait_private(volatile void *ftx, int val)
+{
+ int ret;
+ asm volatile (
+ "int $0x80;"
+ : "=a" (ret)
+ : "0" (FUTEX_SYSCALL),
+ "b" (ftx),
+ "c" (FUTEX_WAIT_PRIVATE),
+ "d" (val),
+ "S" (0)
+ );
+ return ret;
+}
+
+int __futex_wake_private(volatile void *ftx, int count)
+{
+ int ret;
+ asm volatile (
+ "int $0x80;"
+ : "=a" (ret)
+ : "0" (FUTEX_SYSCALL),
+ "b" (ftx),
+ "c" (FUTEX_WAKE_PRIVATE),
+ "d" (count)
+ );
+ return ret;
+}
+
int __atomic_cmpxchg(int old, int new, volatile int* addr) {
int xchg;
asm volatile (