Skip to content

Commit

Permalink
* sysdeps/unix/sysv/linux/sh/pthread_cond_broadcast.S
Browse files Browse the repository at this point in the history
	(__pthread_cond_broadcast): Pass LLL_PRIVATE to lll_* and or
	FUTEX_PRIVATE_FLAG into SYS_futex op if cv is process private.
	Don't use FUTEX_CMP_REQUEUE if dep_mutex is not process private.
	* sysdeps/unix/sysv/linux/shpthread_cond_signal.S
	(__pthread_cond_signal): Pass LLL_PRIVATE to lll_* and or
	FUTEX_PRIVATE_FLAG into SYS_futex op if cv is process private.
	Use FUTEX_WAKE_OP.
	* sysdeps/unix/sysv/linux/sh/pthread_cond_wait.S: Include
	kernel-features.h and tcb-offsets.h.
	(__pthread_cond_wait, __condvar_w_cleanup): Pass LLL_PRIVATE to
	lll_* and or FUTEX_PRIVATE_FLAG into SYS_futex op if cv is
	process private.
	* sysdeps/unix/sysv/linux/sh/pthread_cond_timedwait.S: Include
	tcb-offsets.h.
	(__pthread_cond_timedwait, __condvar_tw_cleanup): Pass LLL_PRIVATE
	to lll_* and or FUTEX_PRIVATE_FLAG into SYS_futex op if cv is
	process private.
	* sysdeps/unix/sysv/linux/sh/pthread_once.S: Use #ifdef
	__ASSUME_PRIVATE_FUTEX instead of #if __ASSUME_PRIVATE_FUTEX.
	* 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.
  • Loading branch information
Ulrich Drepper committed Aug 15, 2007
1 parent c204559 commit d13f4a4
Show file tree
Hide file tree
Showing 10 changed files with 299 additions and 42 deletions.
28 changes: 28 additions & 0 deletions nptl/ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,31 @@
2007-08-14 Kaz Kojima <kkojima@rr.iij4u.or.jp>

* sysdeps/unix/sysv/linux/sh/pthread_cond_broadcast.S
(__pthread_cond_broadcast): Pass LLL_PRIVATE to lll_* and or
FUTEX_PRIVATE_FLAG into SYS_futex op if cv is process private.
Don't use FUTEX_CMP_REQUEUE if dep_mutex is not process private.
* sysdeps/unix/sysv/linux/shpthread_cond_signal.S
(__pthread_cond_signal): Pass LLL_PRIVATE to lll_* and or
FUTEX_PRIVATE_FLAG into SYS_futex op if cv is process private.
Use FUTEX_WAKE_OP.
* sysdeps/unix/sysv/linux/sh/pthread_cond_wait.S: Include
kernel-features.h and tcb-offsets.h.
(__pthread_cond_wait, __condvar_w_cleanup): Pass LLL_PRIVATE to
lll_* and or FUTEX_PRIVATE_FLAG into SYS_futex op if cv is
process private.
* sysdeps/unix/sysv/linux/sh/pthread_cond_timedwait.S: Include
tcb-offsets.h.
(__pthread_cond_timedwait, __condvar_tw_cleanup): Pass LLL_PRIVATE
to lll_* and or FUTEX_PRIVATE_FLAG into SYS_futex op if cv is
process private.
* sysdeps/unix/sysv/linux/sh/pthread_once.S: Use #ifdef
__ASSUME_PRIVATE_FUTEX instead of #if __ASSUME_PRIVATE_FUTEX.
* 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.

2007-08-14 Jakub Jelinek <jakub@redhat.com>

* sysdeps/unix/sysv/linux/lowlevellock.c: Comment fix.
Expand Down
96 changes: 75 additions & 21 deletions nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_signal.S
Original file line number Diff line number Diff line change
Expand Up @@ -74,14 +74,63 @@ __pthread_cond_signal:
/* Wake up one thread. */
mov r8, r4
add #cond_futex, r4
mov #FUTEX_WAKE, r5
mov.l @(dep_mutex,r8), r0
cmp/eq #-1, r0
bt/s 99f
mov #FUTEX_WAKE_OP, r5
#ifdef __ASSUME_PRIVATE_FUTEX
mov #(FUTEX_WAKE_OP|FUTEX_PRIVATE_FLAG), r5
extu.b r5, r5
#else
stc gbr, r1
mov.w .Lpfoff, r2
add r2, r1
mov.l @r1, r5
mov #FUTEX_WAKE_OP, r0
or r0, r5
#endif
99:
mov #1, r6
mov #0, r7
mov r8, r0
add #cond_lock, r0
mov.l .Lfutexop, r1
mov #SYS_futex, r3
extu.b r3, r3
trapa #0x14
SYSCALL_INST_PAD

/* For any kind of error, we try again with WAKE.
The general test also covers running on old kernels. */
mov r0, r1
mov #-12, r2
shad r2, r1
not r1, r1
tst r1, r1
bt 7f

6:
mov #0, r0
lds.l @r15+, pr
rts
mov.l @r15+, r8

#ifndef __ASSUME_PRIVATE_FUTEX
.Lpfoff:
.word PRIVATE_FUTEX - TLS_PRE_TCB_SIZE
#endif
.align 2
.Lfutexop:
.long FUTEX_OP_CLEAR_WAKE_IF_GT_ONE

7:
/* r5 should be either FUTEX_WAKE_OP or
FUTEX_WAKE_OP|FUTEX_PRIVATE_FLAG from the previous syscall. */
mov #(FUTEX_WAKE ^ FUTEX_WAKE_OP), r0
xor r0, r5
trapa #0x14
SYSCALL_INST_PAD

4:
/* Unlock. */
#if cond_lock != 0
Expand All @@ -90,20 +139,39 @@ __pthread_cond_signal:
DEC (@r8, r2)
#endif
tst r2, r2
bf 5f
6:
mov #0, r0
lds.l @r15+, pr
rts
mov.l @r15+, r8
bt 6b

5:
/* Unlock in loop requires wakeup. */
mov r8, r4
#if cond_lock != 0
add #cond_lock, r4
#endif
mov.l @(dep_mutex,r8), r0
cmp/eq #-1, r0
bf/s 99f
mov #LLL_PRIVATE, r5
mov #LLL_SHARED, r5
99:
mov.l .Lwake4, r1
bsrf r1
extu.b r5, r5
.Lwake4b:
bra 6b
nop

1:
/* Initial locking failed. */
mov r8, r5
#if cond_lock != 0
add #cond_lock, r5
#endif
mov.l @(dep_mutex,r8), r0
cmp/eq #-1, r0
bf/s 99f
mov #LLL_PRIVATE, r6
mov #LLL_SHARED, r6
99:
extu.b r6, r6
mov.l .Lwait4, r1
bsrf r1
Expand All @@ -112,20 +180,6 @@ __pthread_cond_signal:
bra 2b
nop

5:
/* Unlock in loop requires wakeup. */
mov r8, r4
#if cond_lock != 0
add #cond_lock, r4
#endif
mov #LLL_SHARED, r5
mov.l .Lwake4, r1
bsrf r1
extu.b r5, r5
.Lwake4b:
bra 6b
nop

.align 2
.Lwait4:
.long __lll_lock_wait-.Lwait4b
Expand Down
76 changes: 73 additions & 3 deletions nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_timedwait.S
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,9 @@
#include <lowlevellock.h>
#include <lowlevelcond.h>
#include <pthread-errnos.h>
#include "lowlevel-atomic.h"
#include <kernel-features.h>
#include <tcb-offsets.h>
#include "lowlevel-atomic.h"

.text

Expand Down Expand Up @@ -230,7 +231,22 @@ __pthread_cond_timedwait:

mov r15, r7
add #16, r7
mov #FUTEX_WAIT, r5
mov.l @(dep_mutex,r8), r0
cmp/eq #-1, r0
bt/s 99f
mov #FUTEX_WAIT, r5
#ifdef __ASSUME_PRIVATE_FUTEX
mov #(FUTEX_WAIT|FUTEX_PRIVATE_FLAG), r5
extu.b r5, r5
#else
stc gbr, r1
mov.w .Lpfoff, r2
add r2, r1
mov.l @r1, r5
mov #FUTEX_WAIT, r0
or r0, r5
#endif
99:
mov.l @(8,r15), r6
mov r8, r4
add #cond_futex, r4
Expand Down Expand Up @@ -339,7 +355,22 @@ __pthread_cond_timedwait:

mov r8, r4
add #cond_nwaiters, r4
mov #FUTEX_WAKE, r5
mov.l @(dep_mutex,r8), r0
cmp/eq #-1, r0
bt/s 99f
mov #FUTEX_WAKE, r5
#ifdef __ASSUME_PRIVATE_FUTEX
mov #(FUTEX_WAKE|FUTEX_PRIVATE_FLAG), r5
extu.b r5, r5
#else
stc gbr, r1
mov.w .Lpfoff, r2
add r2, r1
mov.l @r1, r5
mov #FUTEX_WAKE, r0
or r0, r5
#endif
99:
mov #1, r6
mov #0, r7
mov #SYS_futex, r3
Expand Down Expand Up @@ -379,6 +410,10 @@ __pthread_cond_timedwait:
rts
mov.l @r15+, r8

#ifndef __ASSUME_PRIVATE_FUTEX
.Lpfoff:
.word PRIVATE_FUTEX - TLS_PRE_TCB_SIZE
#endif
.L1k:
.word 1000
.align 2
Expand All @@ -399,7 +434,12 @@ __pthread_cond_timedwait:
#if cond_lock != 0
add #cond_lock, r5
#endif
mov.l @(dep_mutex,r8), r0
cmp/eq #-1, r0
bf/s 99f
mov #LLL_PRIVATE, r6
mov #LLL_SHARED, r6
99:
extu.b r6, r6
mov.l .Lwait2, r1
bsrf r1
Expand All @@ -414,7 +454,12 @@ __pthread_cond_timedwait:
#if cond_lock != 0
add #cond_lock, r4
#endif
mov.l @(dep_mutex,r8), r0
cmp/eq #-1, r0
bf/s 99f
mov #LLL_PRIVATE, r5
mov #LLL_SHARED, r5
99:
mov.l .Lmwait2, r1
bsrf r1
extu.b r5, r5
Expand All @@ -428,7 +473,12 @@ __pthread_cond_timedwait:
#if cond_lock != 0
add #cond_lock, r5
#endif
mov.l @(dep_mutex,r8), r0
cmp/eq #-1, r0
bf/s 99f
mov #LLL_PRIVATE, r6
mov #LLL_SHARED, r6
99:
extu.b r6, r6
mov.l .Lwait3, r1
bsrf r1
Expand All @@ -443,7 +493,12 @@ __pthread_cond_timedwait:
#if cond_lock != 0
add #cond_lock, r4
#endif
mov.l @(dep_mutex,r8), r0
cmp/eq #-1, r0
bf/s 99f
mov #LLL_PRIVATE, r5
mov #LLL_SHARED, r5
99:
mov.l .Lmwait3, r1
bsrf r1
extu.b r5, r5
Expand All @@ -466,7 +521,12 @@ __pthread_cond_timedwait:
#if cond_lock != 0
add #cond_lock, r4
#endif
mov.l @(dep_mutex,r8), r0
cmp/eq #-1, r0
bf/s 99f
mov #LLL_PRIVATE, r5
mov #LLL_SHARED, r5
99:
mov.l .Lmwait4, r1
bsrf r1
extu.b r5, r5
Expand Down Expand Up @@ -510,7 +570,12 @@ __condvar_tw_cleanup:
#if cond_lock != 0
add #cond_lock, r5
#endif
mov.l @(dep_mutex,r8), r0
cmp/eq #-1, r0
bf/s 99f
mov #LLL_PRIVATE, r6
mov #LLL_SHARED, r6
99:
extu.b r6, r6
mov.l .Lwait5, r1
bsrf r1
Expand Down Expand Up @@ -605,7 +670,12 @@ __condvar_tw_cleanup:
#if cond_lock != 0
add #cond_lock, r4
#endif
mov.l @(dep_mutex,r8), r0
cmp/eq #-1, r0
bf/s 99f
mov #LLL_PRIVATE, r5
mov #LLL_SHARED, r5
99:
mov.l .Lmwait5, r1
bsrf r1
extu.b r5, r5
Expand Down
Loading

0 comments on commit d13f4a4

Please sign in to comment.