diff options
author | Ulrich Drepper <drepper@redhat.com> | 2004-03-20 06:16:26 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2004-03-20 06:16:26 +0000 |
commit | 07bd2a3fda47e7cfa83e808eb99a0da9d1184a30 (patch) | |
tree | a0e41495d990b736c8981a58677bc28175621728 /nptl/sysdeps/unix/sysv/linux/sh/pthread_barrier_wait.S | |
parent | 3abb1ff7d1c7a2941df3c6234ec71b40a3879baa (diff) |
Update.
2004-03-17 Kaz Kojima <kkojima@rr.iij4u.or.jp>
* sysdeps/unix/sysv/linux/kernel-features.h
(__ASSUME_CLONE_THREAD_FLAGS ): Define for newer SH kernel.
(__ASSUME_TGKILL, __ASSUME_UTIMES): Likewise.
* sysdeps/unix/sysv/linux/sh/socket.S: Add unwind information.
Diffstat (limited to 'nptl/sysdeps/unix/sysv/linux/sh/pthread_barrier_wait.S')
-rw-r--r-- | nptl/sysdeps/unix/sysv/linux/sh/pthread_barrier_wait.S | 42 |
1 files changed, 39 insertions, 3 deletions
diff --git a/nptl/sysdeps/unix/sysv/linux/sh/pthread_barrier_wait.S b/nptl/sysdeps/unix/sysv/linux/sh/pthread_barrier_wait.S index 6696898c18..1fbb23a5a6 100644 --- a/nptl/sysdeps/unix/sysv/linux/sh/pthread_barrier_wait.S +++ b/nptl/sysdeps/unix/sysv/linux/sh/pthread_barrier_wait.S @@ -1,4 +1,4 @@ -/* Copyright (C) 2003 Free Software Foundation, Inc. +/* Copyright (C) 2003, 2004 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 @@ -80,6 +80,23 @@ pthread_barrier_wait: cmp/eq r0, r6 bt 8b + /* Increment LEFT. If this brings the count back to the + initial count unlock the object. */ + mov #1, r3 + mov.l @(INIT_COUNT,r8), r4 + XADD (r3, @(LEFT,r8), r2) + add #-1, r4 + cmp/eq r2, r4 + bf 10f + + /* Release the mutex. We cannot release the lock before + waking the waiting threads since otherwise a new thread might + arrive and gets waken up, too. */ + DEC (@(MUTEX,r8), r2) + tst r2, r2 + bf 9f + +10: mov #0, r0 /* != PTHREAD_BARRIER_SERIAL_THREAD */ lds.l @r15+, pr mov.l @r15+, r8 @@ -88,8 +105,6 @@ pthread_barrier_wait: 3: /* The necessary number of threads arrived. */ - mov.l @(INIT_COUNT,r8), r0 - mov.l r0, @(LEFT,r8) mov.l @(CURR_EVENT,r8), r1 add #1, r1 mov.l r1, @(CURR_EVENT,r8) @@ -108,6 +123,15 @@ pthread_barrier_wait: trapa #0x14 SYSCALL_INST_PAD + /* Increment LEFT. If this brings the count back to the + initial count unlock the object. */ + mov #1, r3 + mov.l @(INIT_COUNT,r8), r4 + XADD (r3, @(LEFT,r8), r2) + add #-1, r4 + cmp/eq r2, r4 + bf 5f + /* Release the mutex. */ DEC (@(MUTEX,r8), r2) tst r2, r2 @@ -148,6 +172,16 @@ pthread_barrier_wait: bra 7b mov r9, r6 +9: + mov r6, r9 + mov r8, r4 + mov.l .Lwake2, r1 + bsrf r1 + add #MUTEX, r4 +.Lwake2b: + bra 10b + mov r9, r6 + .align 2 .Lall: .long 0x7fffffff @@ -157,4 +191,6 @@ pthread_barrier_wait: .long __lll_mutex_unlock_wake-.Lwake0b .Lwake1: .long __lll_mutex_unlock_wake-.Lwake1b +.Lwake2: + .long __lll_mutex_unlock_wake-.Lwake2b .size pthread_barrier_wait,.-pthread_barrier_wait |