diff options
| author | Ulrich Drepper <drepper@redhat.com> | 2003-10-12 23:05:45 +0000 |
|---|---|---|
| committer | Ulrich Drepper <drepper@redhat.com> | 2003-10-12 23:05:45 +0000 |
| commit | fa3cbe3d5d0c6e6b4de642de8693f9f58347d18c (patch) | |
| tree | b9a8b9759bffa3a9514409d3c7ca3bf462b41241 | |
| parent | cc0af5f451b47358315c9c180b9bf908aed61b89 (diff) | |
| download | glibc-fa3cbe3d5d0c6e6b4de642de8693f9f58347d18c.tar.xz glibc-fa3cbe3d5d0c6e6b4de642de8693f9f58347d18c.zip | |
Update.
2003-10-09 Kaz Kojima <kkojima@rr.iij4u.or.jp>
* sysdeps/unix/sysv/linux/sh/syscalls.list: Add waitpid.
18 files changed, 300 insertions, 427 deletions
@@ -1,3 +1,7 @@ +2003-10-09 Kaz Kojima <kkojima@rr.iij4u.or.jp> + + * sysdeps/unix/sysv/linux/sh/syscalls.list: Add waitpid. + 2003-10-10 Carlos O'Donell <carlos@baldric.uwo.ca> * sysdeps/hppa/Makefile (CFLAGS-malloc.c): Variable removed. diff --git a/nptl/ChangeLog b/nptl/ChangeLog index 3a399f0936..233375cddb 100644 --- a/nptl/ChangeLog +++ b/nptl/ChangeLog @@ -1,3 +1,27 @@ +2003-10-09 Kaz Kojima <kkojima@rr.iij4u.or.jp> + + * sysdeps/unix/sysv/linux/sh/lowlevellock.h: Completely revamp the + locking macros. No distinction between normal and mutex locking + anymore. + * sysdeps/unix/sysv/linux/sh/lowlevellock.S: Rewrite mutex locking. + Merge bits from lowlevelmutex.S we still need. + * sysdeps/unix/sysv/linux/sh/libc-lowlevelmutex.S: Remove. + * sysdeps/unix/sysv/linux/sh/lowlevelmutex.S: Likewise. + * sysdeps/unix/sysv/linux/sh/not-cancel.h: New file. + * sysdeps/unix/sysv/linux/sh/pthread_barrier_wait.S: Adjust for + new mutex implementation. + * sysdeps/unix/sysv/linux/sh/pthread_cond_broadcast.S: Likewise. + * sysdeps/unix/sysv/linux/sh/pthread_cond_signal.S: Likewise. + * sysdeps/unix/sysv/linux/sh/pthread_cond_timedwait.S: Likewise. + * sysdeps/unix/sysv/linux/sh/pthread_cond_wait.S: Likewise. + * sysdeps/unix/sysv/linux/sh/pthread_rwlock_rdlock.S: Likewise. + * sysdeps/unix/sysv/linux/sh/pthread_rwlock_timedrdlock.S: Likewise. + * sysdeps/unix/sysv/linux/sh/pthread_rwlock_timedwrlock.S: Likewise. + * sysdeps/unix/sysv/linux/sh/pthread_rwlock_unlock.S: Likewise. + * sysdeps/unix/sysv/linux/sh/pthread_rwlock_wrlock.S: Likewise. + * sysdeps/unix/sysv/linux/sh/sysdep-cancel.h (PSEUDO): Also defined + symbol for entry point to avoid cancellation. + 2003-10-07 Jakub Jelinek <jakub@redhat.com> * sysdeps/unix/sysv/linux/i386/sysdep-cancel.h: Backout 2003-10-02 diff --git a/nptl/sysdeps/unix/sysv/linux/sh/libc-lowlevelmutex.S b/nptl/sysdeps/unix/sysv/linux/sh/libc-lowlevelmutex.S deleted file mode 100644 index fc5ab3dc08..0000000000 --- a/nptl/sysdeps/unix/sysv/linux/sh/libc-lowlevelmutex.S +++ /dev/null @@ -1,19 +0,0 @@ -/* Copyright (C) 2003 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, write to the Free - Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - 02111-1307 USA. */ - -#include "lowlevelmutex.S" diff --git a/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.S b/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.S index 115c5292dd..936a4e3868 100644 --- a/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.S +++ b/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.S @@ -28,111 +28,204 @@ #define FUTEX_WAKE 1 - .globl __lll_lock_wait - .type __lll_lock_wait,@function - .hidden __lll_lock_wait + .globl __lll_mutex_lock_wait + .type __lll_mutex_lock_wait,@function + .hidden __lll_mutex_lock_wait .align 5 -__lll_lock_wait: +__lll_mutex_lock_wait: + mov.l r8, @-r15 mov r4, r6 - mov r5, r4 + mov r5, r8 mov #0, r7 /* No timeout. */ mov #FUTEX_WAIT, r5 -2: - add #-1, r6 /* account for the preceeded xadd. */ +1: + mov #2, r4 + cmp/eq r4, r6 + bt 3f + + mov #1, r3 + CMPXCHG (r3, @r8, r4, r2) + tst r2, r2 + bt 2f + +3: + mov r8, r4 mov #SYS_futex, r3 extu.b r3, r3 trapa #0x14 SYSCALL_INST_PAD - mov #-1, r3 - XADD (r3, @r4, r2) - tst r3, r3 - bf/s 2b - mov r2, r6 +2: + mov #0, r3 + mov #2, r4 + CMPXCHG (r3, @r8, r4, r2) + bf 1b - mov #-1, r1 - mov.l r1, @r4 - rts + mov.l @r15+, r8 + ret mov r2, r0 - .size __lll_lock_wait,.-__lll_lock_wait + .size __lll_mutex_lock_wait,.-__lll_mutex_lock_wait #ifdef NOT_IN_libc - .globl lll_unlock_wake_cb - .type lll_unlock_wake_cb,@function - .hidden lll_unlock_wake_cb + .globl __lll_mutex_timedlock_wait + .type __lll_mutex_timedlock_wait,@function + .hidden __lll_mutex_timedlock_wait .align 5 -lll_unlock_wake_cb: +__lll_mutex_timedlock_wait: + /* Check for a valid timeout value. */ + mov.l @(4,r6), r1 + mov.l .L1g, r0 + cmp/hs r0, r1 + bt 3f + + mov.l r10, @-r15 + mov.l r9, @-r15 + mov.l r8, @-r15 + mov r4, r10 + mov r6, r9 + mov r5, r8 + + /* Stack frame for the timespec and timeval structs. */ + add #-8, r15 - .align 2 - mova 1f, r0 - mov r15, r1 - mov #-6, r15 -0: - mov.l @r4, r2 - add #1, r2 - mov.l r2, @r4 1: - mov r1, r15 - cmp/pl r2 - bf 2f + /* Get current time. */ + mov r15, r4 + mov #0, r5 + mov #SYS_gettimeofday, r3 + trapa #0x12 + SYSCALL_INST_PAD + + /* Compute relative timeout. */ + mov.l @(4,r15), r0 + mov.w .L1k, r1 + dmulu.l r0, r1 /* Micro seconds to nano seconds. */ + mov.l @r9, r2 + mov.l @(4,r9), r3 + mov.l @r15, r0 + sts macl, r1 + sub r0, r2 + clrt + subc r1, r3 + bf 4f + mov.l .L1g, r1 + add r1, r3 + add #-1, r2 +4: + cmp/pz r2 + bf 5f /* Time is already up. */ + + mov.l r2, @r15 /* Store relative timeout. */ + mov.l r3, @(4,r15) + + mov #1, r3 + mov #2, r4 + CMPXCHG (r3, @r8, r4, r2) + bt 8f + + mov r8, r4 + mov #FUTEX_WAIT, r5 + mov r10, r6 + mov r15, r7 + mov #SYS_futex, r3 + extu.b r3, r3 + trapa #0x14 + SYSCALL_INST_PAD + mov r0, r4 + +8: + mov #0, r3 + mov #2, r4 + CMPXCHG (r3, @r8, r4, r2) + bf 7f + +6: + add #8, r15 + mov.l @r15+, r8 + mov.l @r15+, r9 rts + mov.l @r15+, r10 +7: + /* Check whether the time expired. */ + mov #-ETIMEDOUT, r1 + cmp/eq r4, r1 + bt 5f + bra 1b nop - .size lll_unlock_wake_cb,.-lll_unlock_wake_cb +3: + rts + mov #EINVAL, r0 +5: + bra 6b + mov #ETIMEDOUT, r0 + +.L1k: + .word 1000 + .align 2 +.L1g: + .long 1000000000 + + .size __lll_mutex_timedlock_wait,.-__lll_mutex_timedlock_wait #endif - .globl __lll_unlock_wake - .type __lll_unlock_wake,@function - .hidden __lll_unlock_wake -__lll_unlock_wake: -2: +#ifdef NOT_IN_libc + .globl lll_unlock_wake_cb + .type lll_unlock_wake_cb,@function + .hidden lll_unlock_wake_cb + .align 5 +lll_unlock_wake_cb: + DEC (@r4, r2) + tst r2, r2 + bt 1f + mov #FUTEX_WAKE, r5 mov #1, r6 /* Wake one thread. */ mov #0, r7 - mov.l r6, @r4 /* Stores 1. */ + mov.l r7, @r4 /* Stores 0. */ mov #SYS_futex, r3 extu.b r3, r3 trapa #0x14 SYSCALL_INST_PAD + +1: rts nop - .size __lll_unlock_wake,.-__lll_unlock_wake + .size lll_unlock_wake_cb,.-lll_unlock_wake_cb +#endif -#ifdef NOT_IN_libc - .globl __lll_wait_tid - .type __lll_wait_tid,@function - .hidden __lll_wait_tid -__lll_wait_tid: - mov.l @r4, r6 -1: - mov #FUTEX_WAIT, r5 + .globl __lll_mutex_unlock_wake + .type __lll_mutex_unlock_wake,@function + .hidden __lll_mutex_unlock_wake + .align 5 +__lll_mutex_unlock_wake: + mov #FUTEX_WAKE, r5 + mov #1, r6 /* Wake one thread. */ mov #0, r7 + mov.l r7, @r4 /* Stores 0. */ mov #SYS_futex, r3 extu.b r3, r3 trapa #0x14 SYSCALL_INST_PAD - - mov r0, r1 - - mov.l @r4, r0 - tst r0, r0 - bf/s 1b - mov r0, r6 rts nop - .size __lll_wait_tid,.-__lll_wait_tid + .size __lll_mutex_unlock_wake,.-__lll_mutex_unlock_wake +#ifdef NOT_IN_libc .globl __lll_timedwait_tid .type __lll_timedwait_tid,@function .hidden __lll_timedwait_tid + .align 5 __lll_timedwait_tid: mov.l r9, @-r15 mov.l r8, @-r15 mov r4, r8 mov r5, r9 + + /* Stack frame for the timespec and timeval structs. */ add #-8, r15 2: @@ -145,8 +238,8 @@ __lll_timedwait_tid: /* Compute relative timeout. */ mov.l @(4,r15), r0 - mov.w .L1k, r1 - dmulu.l r0, r1 /* Milli seconds to nano seconds. */ + mov.w .L1k2, r1 + dmulu.l r0, r1 /* Micro seconds to nano seconds. */ mov.l @r9, r2 mov.l @(4,r9), r3 mov.l @r15, r0 @@ -155,7 +248,7 @@ __lll_timedwait_tid: clrt subc r1, r3 bf 5f - mov.l .L1g, r1 + mov.l .L1g2, r1 add r1, r3 add #-1, r2 5: @@ -165,20 +258,21 @@ __lll_timedwait_tid: mov.l r2, @r15 /* Store relative timeout. */ mov.l r3, @(4,r15) - mov.l @r8, r6 - tst r6, r6 + mov.l @r8, r2 + tst r2, r2 bt 4f mov r8, r4 mov #FUTEX_WAIT, r5 + mov r2, r6 mov r15, r7 mov #SYS_futex, r3 extu.b r3, r3 trapa #0x14 SYSCALL_INST_PAD - mov.l @r8, r0 - tst r0, r0 + mov.l @r8, r2 + tst r2, r2 bf 1f 4: mov #0, r0 @@ -187,8 +281,8 @@ __lll_timedwait_tid: mov.l @r15+, r8 rts mov.l @r15+, r9 - 1: + /* Check whether the time expired. */ mov #-ETIMEDOUT, r1 cmp/eq r0, r1 bf 2b @@ -196,11 +290,10 @@ __lll_timedwait_tid: bra 3b mov #ETIMEDOUT, r0 -.L1k: +.L1k2: .word 1000 .align 2 -.L1g: +.L1g2: .long 1000000000 - .size __lll_timedwait_tid,.-__lll_timedwait_tid #endif diff --git a/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.h b/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.h index 4a392e84d7..37842263b6 100644 --- a/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.h +++ b/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.h @@ -29,7 +29,8 @@ /* Initializer for compatibility lock. */ -#define LLL_MUTEX_LOCK_INITIALIZER (0) +#define LLL_MUTEX_LOCK_INITIALIZER (0) +#define LLL_MUTEX_LOCK_INITIALIZER_LOCKED (1) extern int __lll_mutex_lock_wait (int val, int *__futex) attribute_hidden; extern int __lll_mutex_timedlock_wait (int val, int *__futex, @@ -53,7 +54,10 @@ extern int __lll_mutex_unlock_wake (int *__futex) attribute_hidden; 1: mov r1,r15\n\ mov #-1,%0\n\ negc %0,%0"\ - : "=r" (__result) : "r" (&(futex)), "r" (1), "r" (0) \ + : "=r" (__result) \ + : "r" (&(futex)), \ + "r" (LLL_MUTEX_LOCK_INITIALIZER_LOCKED), \ + "r" (LLL_MUTEX_LOCK_INITIALIZER) \ : "r0", "r1", "r2", "t", "memory"); \ __result; }) @@ -63,13 +67,14 @@ extern int __lll_mutex_unlock_wake (int *__futex) attribute_hidden; .align 2\n\ mova 1f,r0\n\ mov r15,r1\n\ - mov #-6,r15\n\ + mov #-8,r15\n\ 0: mov.l @%2,%0\n\ - add %0,%1\n\ + tst %0,%0\n\ + bf 1f\n\ mov.l %1,@%2\n\ 1: mov r1,r15"\ - : "=&r" (__result), "=&r" (val) : "r" (__futex), "1" (1) \ - : "r0", "r1", "memory"); \ + : "=&r" (__result) : "r" (1), "r" (__futex) \ + : "r0", "r1", "t", "memory"); \ if (__result) \ __lll_mutex_lock_wait (__result, __futex); }) @@ -81,13 +86,14 @@ extern int __lll_mutex_unlock_wake (int *__futex) attribute_hidden; .align 2\n\ mova 1f,r0\n\ mov r15,r1\n\ - mov #-6,r15\n\ + mov #-8,r15\n\ 0: mov.l @%2,%0\n\ - add %0,%1\n\ + tst %0,%0\n\ + bf 1f\n\ mov.l %1,@%2\n\ 1: mov r1,r15"\ - : "=&r" (__result), "=&r" (val) : "r" (__futex), "1" (2) \ - : "r0", "r1", "memory"); \ + : "=&r" (__result) : "r" (2), "r" (__futex) \ + : "r0", "r1", "t", "memory"); \ if (__result) \ __lll_mutex_lock_wait (__result, __futex); }) @@ -97,13 +103,14 @@ extern int __lll_mutex_unlock_wake (int *__futex) attribute_hidden; .align 2\n\ mova 1f,r0\n\ mov r15,r1\n\ - mov #-6,r15\n\ + mov #-8,r15\n\ 0: mov.l @%2,%0\n\ - add %0,%1\n\ + tst %0,%0\n\ + bf 1f\n\ mov.l %1,@%2\n\ 1: mov r1,r15"\ - : "=&r" (__result), "=&r" (val) : "r" (__futex), "1" (1) \ - : "r0", "r1", "memory"); \ + : "=&r" (__result) : "r" (1), "r" (__futex) \ + : "r0", "r1", "t", "memory"); \ if (__result) \ __result = __lll_mutex_timedlock_wait (__result, __futex, timeout); \ __result; }) @@ -135,8 +142,8 @@ extern int __lll_mutex_unlock_wake (int *__futex) attribute_hidden; typedef int lll_lock_t; /* Initializers for lock. */ -#define LLL_LOCK_INITIALIZER (1) -#define LLL_LOCK_INITIALIZER_LOCKED (0) +#define LLL_LOCK_INITIALIZER (0) +#define LLL_LOCK_INITIALIZER_LOCKED (1) # ifdef NEED_SYSCALL_INST_PAD @@ -179,70 +186,20 @@ typedef int lll_lock_t; } while (0) -extern int __lll_lock_wait (int val, int *__futex) attribute_hidden; -extern int __lll_unlock_wake (int *__futex) attribute_hidden; extern int lll_unlock_wake_cb (int *__futex) attribute_hidden; /* The states of a lock are: - 1 - untaken - 0 - taken by one user - <0 - taken by more users */ - - -#define lll_trylock(futex) \ - ({ unsigned char __result; \ - __asm __volatile ("\ - .align 2\n\ - mova 1f,r0\n\ - nop\n\ - mov r15,r1\n\ - mov #-8,r15\n\ - 0: mov.l @%1,r2\n\ - cmp/eq r2,%3\n\ - bf 1f\n\ - mov.l %2,@%1\n\ - 1: mov r1,r15\n\ - mov #-1,%0\n\ - negc %0,%0"\ - : "=r" (__result) : "r" (&(futex)), "r" (0), "r" (1) \ - : "r0", "r1", "r2", "t", "memory"); \ - __result; }) - -#define lll_lock(futex) \ - (void) ({ int __result, val, *__futex = &(futex); \ - __asm __volatile ("\ - .align 2\n\ - mova 1f,r0\n\ - mov r15,r1\n\ - mov #-6,r15\n\ - 0: mov.l @%2,%0\n\ - add %0,%1\n\ - mov.l %1,@%2\n\ - 1: mov r1,r15"\ - : "=&r" (__result), "=&r" (val) : "r" (__futex), "1" (-1) \ - : "r0", "r1", "memory"); \ - if (val < 0) \ - __lll_lock_wait (__result, __futex); }) + 0 - untaken + 1 - taken by one user + 2 - taken by more users */ -#define lll_unlock(futex) \ - (void) ({ int __result, *__futex = &(futex); \ - __asm __volatile ("\ - .align 2\n\ - mova 1f,r0\n\ - mov r15,r1\n\ - mov #-6,r15\n\ - 0: mov.l @%1,%0\n\ - add #1,%0\n\ - mov.l %0,@%1\n\ - 1: mov r1,r15"\ - : "=&r" (__result) : "r" (__futex) \ - : "r0", "r1", "memory"); \ - if (__result <= 0) \ - __lll_unlock_wake (__futex); }) +#define lll_trylock(futex) lll_mutex_trylock (futex) +#define lll_lock(futex) lll_mutex_lock (futex) +#define lll_unlock(futex) lll_mutex_unlock (futex) #define lll_islocked(futex) \ - (futex <= 0) + (futex != LLL_LOCK_INITIALIZER) /* The kernel notifies a process with uses CLONE_CLEARTID via futex @@ -254,8 +211,8 @@ extern int __lll_wait_tid (int *tid) attribute_hidden; #define lll_wait_tid(tid) \ do { \ __typeof (tid) *__tid = &(tid); \ - if (*__tid != 0) \ - __lll_wait_tid (__tid); \ + while (*__tid != 0) \ + lll_futex_wait (__tid, *__tid); \ } while (0) extern int __lll_timedwait_tid (int *tid, const struct timespec *abstime) diff --git a/nptl/sysdeps/unix/sysv/linux/sh/lowlevelmutex.S b/nptl/sysdeps/unix/sysv/linux/sh/lowlevelmutex.S deleted file mode 100644 index 0aa2048d11..0000000000 --- a/nptl/sysdeps/unix/sysv/linux/sh/lowlevelmutex.S +++ /dev/null @@ -1,175 +0,0 @@ -/* Copyright (C) 2003 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, write to the Free - Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - 02111-1307 USA. */ - -#include <sysdep.h> -#include <pthread-errnos.h> -#include "lowlevel-atomic.h" - - .text - -#define SYS_gettimeofday __NR_gettimeofday -#define SYS_futex 240 -#define FUTEX_WAIT 0 -#define FUTEX_WAKE 1 - - - .globl __lll_mutex_lock_wait - .type __lll_mutex_lock_wait,@function - .hidden __lll_mutex_lock_wait - .align 5 -__lll_mutex_lock_wait: - mov r4, r6 - mov r5, r4 - mov #0, r7 /* No timeout. */ - mov #FUTEX_WAIT, r5 -1: - add #1, r6 /* account for the preceeded xadd. */ - mov #SYS_futex, r3 - extu.b r3, r3 - trapa #0x14 - SYSCALL_INST_PAD - - mov #1, r3 - XADD (r3, @r4, r6) - tst r6, r6 - bf 1b - mov #2, r1 - mov.l r1, @r4 - ret - mov #0, r0 - .size __lll_mutex_lock_wait,.-__lll_mutex_lock_wait - - -#ifdef NOT_IN_libc - .globl __lll_mutex_timedlock_wait - .type __lll_mutex_timedlock_wait,@function - .hidden __lll_mutex_timedlock_wait < |
