diff options
Diffstat (limited to 'nptl/sysdeps/unix/sysv/linux/i386/i486/libc-lowlevelmutex.S')
-rw-r--r-- | nptl/sysdeps/unix/sysv/linux/i386/i486/libc-lowlevelmutex.S | 95 |
1 files changed, 3 insertions, 92 deletions
diff --git a/nptl/sysdeps/unix/sysv/linux/i386/i486/libc-lowlevelmutex.S b/nptl/sysdeps/unix/sysv/linux/i386/i486/libc-lowlevelmutex.S index ccae01b84a..d17d078374 100644 --- a/nptl/sysdeps/unix/sysv/linux/i386/i486/libc-lowlevelmutex.S +++ b/nptl/sysdeps/unix/sysv/linux/i386/i486/libc-lowlevelmutex.S @@ -1,4 +1,4 @@ -/* Copyright (C) 2002 Free Software Foundation, Inc. +/* Copyright (C) 2002, 2003 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. @@ -68,113 +68,24 @@ __lll_mutex_lock_wait: .size __lll_mutex_lock_wait,.-__lll_mutex_lock_wait - .globl __lll_mutex_timedlock_wait - .type __lll_mutex_timedlock_wait,@function - .hidden __lll_mutex_timedlock_wait - .align 16 -__lll_mutex_timedlock_wait: - /* Check for a valid timeout value. */ - cmpl $1000000000, 4(%edx) - jae 3f - - pushl %edi - pushl %esi - pushl %ebx - pushl %ebp - - /* Stack frame for the timespec and timeval structs. */ - subl $8, %esp - - movl %ecx, %ebp - movl %edx, %edi - leal 1(%eax), %esi - - /* Get current time. */ -1: - movl %esp, %ebx - xorl %ecx, %ecx - movl $SYS_gettimeofday, %eax - ENTER_KERNEL - - /* Compute relative timeout. */ - movl 4(%esp), %eax - movl $1000, %edx - mul %edx /* Milli seconds to nano seconds. */ - movl (%edi), %ecx - movl 4(%edi), %edx - subl (%esp), %ecx - subl %eax, %edx - jns 4f - addl $1000000000, %edx - decl %ecx -4: testl %ecx, %ecx - js 5f /* Time is already up. */ - - /* Futex call. */ - movl %ecx, (%esp) /* Store relative timeout. */ - movl %edx, 4(%esp) - movl %esi, %edx - movl %esp, %esi - xorl %ecx, %ecx /* movl $FUTEX_WAIT, %ecx */ - movl %ebp, %ebx - movl $SYS_futex, %eax - ENTER_KERNEL - - movl $1, %esi -#ifndef UP - cmpl $0, %gs:MULTIPLE_THREADS_OFFSET - je,pt 0f - lock -0: -#endif - xaddl %esi, (%ebx) - testl %esi, %esi - jne 7f - - movl $2, (%ebx) - xorl %eax, %eax - -6: addl $8, %esp - popl %ebp - popl %ebx - popl %esi - popl %edi - ret - - /* Check whether the time expired. */ -7: cmpl $-ETIMEDOUT, %eax - je 5f - jmp 1b - -3: movl $EINVAL, %eax - ret - -5: movl $ETIMEDOUT, %eax - jmp 6b - .size __lll_mutex_timedlock_wait,.-__lll_mutex_timedlock_wait - - .globl __lll_mutex_unlock_wake .type __lll_mutex_unlock_wake,@function .hidden __lll_mutex_unlock_wake .align 16 __lll_mutex_unlock_wake: - pushl %esi pushl %ebx pushl %ecx pushl %edx - movl $FUTEX_WAKE, %ecx movl %eax, %ebx - xorl %esi, %esi - movl $0, (%ebx) + movl $FUTEX_WAKE, %ecx movl $1, %edx /* Wake one thread. */ movl $SYS_futex, %eax + movl $0, (%ebx) ENTER_KERNEL popl %edx popl %ecx popl %ebx - popl %esi ret .size __lll_mutex_unlock_wake,.-__lll_mutex_unlock_wake |