Skip to content

Commit

Permalink
(__pthread_cond_broadcast): Pass LLL_PRIVATE to lll_* and or FUTEX_PR…
Browse files Browse the repository at this point in the history
…IVATE_FLAG into SYS_futex op if cv is process private. Don't use FUTEX_CMP_REQUEUE if dep_mutex is not process private.
  • Loading branch information
Ulrich Drepper committed Aug 15, 2007
1 parent 467d134 commit c204559
Showing 1 changed file with 50 additions and 4 deletions.
54 changes: 50 additions & 4 deletions nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_broadcast.S
Original file line number Diff line number Diff line change
Expand Up @@ -93,13 +93,24 @@ __pthread_cond_broadcast:
bt/s 9f
add #cond_futex, r4

/* XXX: The kernel so far doesn't support requeue to PI futex. */
/* XXX: The kernel only supports FUTEX_CMP_REQUEUE to the same
type of futex (private resp. shared). */
mov.l @(MUTEX_KIND,r9), r0
tst #PI_BIT, r0
tst #(PI_BIT|PS_BIT), r0
bf 9f

/* Wake up all threads. */
mov #FUTEX_CMP_REQUEUE, r5
#ifdef __ASSUME_PRIVATE_FUTEX
mov #(FUTEX_CMP_REQUEUE|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_CMP_REQUEUE, r0
or r0, r5
#endif
mov #1, r6
mov #-1, r7
shlr r7 /* r7 = 0x7fffffff */
Expand Down Expand Up @@ -156,7 +167,12 @@ __pthread_cond_broadcast:
#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 All @@ -171,7 +187,12 @@ __pthread_cond_broadcast:
#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 .Lwake5, r1
bsrf r1
extu.b r5, r5
Expand All @@ -185,7 +206,12 @@ __pthread_cond_broadcast:
#if cond_lock != 0
add #cond_lock, r4
#endif
mov #-1, r0
cmp/eq r0, r9
bf/s 99f
mov #LLL_PRIVATE, r5
mov #LLL_SHARED, r5
99:
mov.l .Lwake6, r1
bsrf r1
extu.b r5, r5
Expand All @@ -194,7 +220,22 @@ __pthread_cond_broadcast:
nop

9:
mov #FUTEX_WAKE, r5
mov #-1, r0
cmp/eq r0, r9
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
shlr r6 /* r6 = 0x7fffffff */
mov #0, r7
Expand All @@ -205,6 +246,11 @@ __pthread_cond_broadcast:
bra 10b
nop

#ifndef __ASSUME_PRIVATE_FUTEX
.Lpfoff:
.word PRIVATE_FUTEX - TLS_PRE_TCB_SIZE
#endif

.align 2
.Lwait5:
.long __lll_lock_wait-.Lwait5b
Expand Down

0 comments on commit c204559

Please sign in to comment.