diff options
author | David 'Digit' Turner <digit@google.com> | 2010-03-18 17:13:41 -0700 |
---|---|---|
committer | David 'Digit' Turner <digit@google.com> | 2010-03-18 17:13:41 -0700 |
commit | 88f06cd84a70f8a5212cb03272ec2c7cf0017afa (patch) | |
tree | 4ff0a88177cd5fb2ca9c0e6df9a331cea7ecad1c /libc/arch-x86/bionic | |
parent | ee7b077abf1d99503b986489ad93374a057cb354 (diff) | |
download | bionic-88f06cd84a70f8a5212cb03272ec2c7cf0017afa.zip bionic-88f06cd84a70f8a5212cb03272ec2c7cf0017afa.tar.gz bionic-88f06cd84a70f8a5212cb03272ec2c7cf0017afa.tar.bz2 |
Use private futexes for pthread_mutex_t.
This does not change the implementation of conditional variables
since we're waiting for other system components to properly use
pthread_condattr_init/setpshared before that.
Also remove an obsolete x86 source file.
Change-Id: Ia3e3fbac35b87a534fb04d4381c3c66b975bc8f7
Diffstat (limited to 'libc/arch-x86/bionic')
-rw-r--r-- | libc/arch-x86/bionic/atomics_x86.S | 32 | ||||
-rw-r--r-- | libc/arch-x86/bionic/atomics_x86.c | 104 |
2 files changed, 32 insertions, 104 deletions
diff --git a/libc/arch-x86/bionic/atomics_x86.S b/libc/arch-x86/bionic/atomics_x86.S index 2370f23..666e182 100644 --- a/libc/arch-x86/bionic/atomics_x86.S +++ b/libc/arch-x86/bionic/atomics_x86.S @@ -41,6 +41,38 @@ __futex_wake: popl %ebx ret +/* int __futex_syscall3(volatile void *ftx, int op, int count) */ +.text +.globl __futex_syscall3 +.type __futex_syscall3, @function +.align 4 +__futex_syscall3: + pushl %ebx + movl 8(%esp), %ebx /* ftx */ + movl 12(%esp), %ecx /* op */ + movl 16(%esp), %edx /* value */ + movl $__NR_futex, %eax + int $0x80 + popl %ebx + ret + +/* int __futex_syscall4(volatile void *ftx, int op, int val, const struct timespec *timeout) */ +.text +.globl __futex_syscall4 +.type __futex_syscall4, @function +.align 4 +__futex_syscall4: + pushl %ebx + pushl %esi + movl 12(%esp), %ebx /* ftx */ + movl 16(%esp), %ecx /* op */ + movl 20(%esp), %edx /* val */ + movl 24(%esp), %esi /* timeout */ + movl $__NR_futex, %eax + int $0x80 + popl %esi + popl %ebx + ret /* int __atomic_cmpxchg(int old, int new, volatile int* addr) */ diff --git a/libc/arch-x86/bionic/atomics_x86.c b/libc/arch-x86/bionic/atomics_x86.c deleted file mode 100644 index b7b20e6..0000000 --- a/libc/arch-x86/bionic/atomics_x86.c +++ /dev/null @@ -1,104 +0,0 @@ -/* - * Copyright (C) 2008 The Android Open Source Project - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ -#include <sys/atomics.h> - -#define FUTEX_SYSCALL 240 -#define FUTEX_WAIT 0 -#define FUTEX_WAKE 1 - -int __futex_wait(volatile void *ftx, int val) -{ - int ret; - asm volatile ( - "int $0x80;" - : "=a" (ret) - : "0" (FUTEX_SYSCALL), - "b" (ftx), - "c" (FUTEX_WAIT), - "d" (val), - "S" (0) - ); - return ret; -} - -int __futex_wake(volatile void *ftx, int count) -{ - int ret; - asm volatile ( - "int $0x80;" - : "=a" (ret) - : "0" (FUTEX_SYSCALL), - "b" (ftx), - "c" (FUTEX_WAKE), - "d" (count) - ); - return ret; -} - -int __atomic_cmpxchg(int old, int new, volatile int* addr) { - int xchg; - asm volatile ( - "lock;" - "cmpxchg %%ecx, (%%edx);" - "setne %%al;" - : "=a" (xchg) - : "a" (old), - "c" (new), - "d" (addr) - ); - return xchg; -} - -int __atomic_swap(int new, volatile int* addr) { - int old; - asm volatile ( - "lock;" - "xchg %%ecx, (%%edx);" - : "=c" (old) - : "c" (new), - "d" (addr) - ); - return old; -} - -int __atomic_dec(volatile int* addr) { - int old; - do { - old = *addr; - } while (atomic_cmpxchg(old, old-1, addr)); - return old; -} - -int __atomic_inc(volatile int* addr) { - int old; - do { - old = *addr; - } while (atomic_cmpxchg(old, old+1, addr)); - return old; -} - |