(__condvar_tw_cleanup): Fix access to saved broadcast_seq value.

This commit is contained in:
Ulrich Drepper 2004-06-01 18:14:07 +00:00
parent d3db7f9258
commit 016deb4c4f
1 changed files with 19 additions and 13 deletions

View File

@ -82,6 +82,7 @@ __pthread_cond_timedwait:
addl $1, total_seq(%ebx)
adcl $0, total_seq+4(%ebx)
addl $1, cond_futex(%ebx)
#define FRAME_SIZE 24
subl $FRAME_SIZE, %esp
@ -148,6 +149,8 @@ __pthread_cond_timedwait:
21: movl %ecx, 4(%esp)
movl %edx, 8(%esp)
movl cond_futex(%ebx), %edi
/* Unlock. */
LOCK
#if cond_lock == 0
@ -164,12 +167,12 @@ __pthread_cond_timedwait:
leal 4(%esp), %esi
xorl %ecx, %ecx /* movl $FUTEX_WAIT, %ecx */
movl %edi, %edx
addl $wakeup_seq, %ebx
.Ladd_wakeup:
addl $cond_futex, %ebx
.Ladd_cond_futex:
movl $SYS_futex, %eax
ENTER_KERNEL
subl $wakeup_seq, %ebx
.Lsub_wakeup:
subl $cond_futex, %ebx
.Lsub_cond_futex:
movl %eax, %esi
movl (%esp), %eax
@ -212,6 +215,7 @@ __pthread_cond_timedwait:
addl $1, wakeup_seq(%ebx)
adcl $0, wakeup_seq+4(%ebx)
addl $1, cond_futex(%ebx)
movl $ETIMEDOUT, %esi
jmp 14f
@ -359,7 +363,7 @@ __condvar_tw_cleanup3:
.size __condvar_tw_cleanup3, .-__condvar_tw_cleanup3
.type __condvar_tw_cleanup2, @function
__condvar_tw_cleanup2:
subl $wakeup_seq, %ebx
subl $cond_futex, %ebx
.size __condvar_tw_cleanup2, .-__condvar_tw_cleanup2
.type __condvar_tw_cleanup, @function
__condvar_tw_cleanup:
@ -384,12 +388,14 @@ __condvar_tw_cleanup:
call __lll_mutex_lock_wait
1: movl broadcast_seq(%ebx), %eax
cmpl 12(%esp), %eax
cmpl 20(%esp), %eax
jne 3f
addl $1, wakeup_seq(%ebx)
adcl $0, wakeup_seq+4(%ebx)
addl $1, cond_futex(%ebx)
addl $1, woken_seq(%ebx)
adcl $0, woken_seq+4(%ebx)
@ -409,7 +415,7 @@ __condvar_tw_cleanup:
call __lll_mutex_unlock_wake
/* Wake up all waiters to make sure no signal gets lost. */
2: addl $wakeup_seq, %ebx
2: addl $cond_futex, %ebx
movl $FUTEX_WAKE, %ecx
movl $SYS_futex, %eax
movl $0x7fffffff, %edx
@ -435,7 +441,7 @@ __condvar_tw_cleanup:
.uleb128 .Lcstend-.Lcstbegin
.Lcstbegin:
.long .LcleanupSTART-.LSTARTCODE
.long .Ladd_wakeup-.LcleanupSTART
.long .Ladd_cond_futex-.LcleanupSTART
.long __condvar_tw_cleanup-.LSTARTCODE
.uleb128 0
.long .LebxmovedUR-.LSTARTCODE
@ -443,15 +449,15 @@ __condvar_tw_cleanup:
.long __condvar_tw_cleanup3-.LSTARTCODE
.uleb128 0
.long .LebxmovedUR-.LSTARTCODE
.long .Ladd_wakeup-.LebxmovedUR
.long .Ladd_cond_futex-.LebxmovedUR
.long __condvar_tw_cleanup-.LSTARTCODE
.uleb128 0
.long .Ladd_wakeup-.LSTARTCODE
.long .Lsub_wakeup-.Ladd_wakeup
.long .Ladd_cond_futex-.LSTARTCODE
.long .Lsub_cond_futex-.Ladd_cond_futex
.long __condvar_tw_cleanup2-.LSTARTCODE
.uleb128 0
.long .Lsub_wakeup-.LSTARTCODE
.long .LcleanupEND-.Lsub_wakeup
.long .Lsub_cond_futex-.LSTARTCODE
.long .LcleanupEND-.Lsub_cond_futex
.long __condvar_tw_cleanup-.LSTARTCODE
.uleb128 0
.long .LcallUR-.LSTARTCODE