This is the mail archive of the libc-hacker@sourceware.org mailing list for the glibc project.
Note that libc-hacker is a closed list. You may look at the archives of this list, but subscription and posting are not open.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
Other format: | [Raw text] |
Hi! Thanks for the fix, here are just some nits I found while trying to understand. tst-cond22.c doesn't use anything from pthreadP.h what is not in the public pthread.h, so I think it should use the public header instead. But, more importantly, so far we were always holding the invariant that cv->__data.__futex == (unsigned int) (cv->__data.__total_seq + cv->__data.__wakeup_seq) but with today's changes that's no longer true and I think it is likely to cause problems (don't have a testcase, but I fear e.g. pthread_cond_broadcast could suddenly result in no change in __futex value whatsoever and some threads might not notice something changed). All other places that change the values of these 3 variables honor this invariant (e.g. pthread_cond_signal increases both futex and wakeup_seq, pthread_cond_wait increases both total_seq and futex and pthread_cond_broadcast sets wakeup_seq to total_seq and afterwards sets futex to (unsigned int) (2 * total_seq), i.e. the same as (unsigned int) (total_seq + wakeup_seq). 2006-09-08 Jakub Jelinek <jakub@redhat.com> * tst-cond22.c: Include pthread.h instead of pthreadP.h. Include stdlib.h. * sysdeps/pthread/pthread_cond_wait.c (__condvar_cleanup): Only increase FUTEX if increasing WAKEUP_SEQ. Fix comment typo. * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S: Likewise. * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S: Likewise. * sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S: Likewise. --- libc/nptl/tst-cond22.c 8 Sep 2006 10:40:24 -0000 1.1 +++ libc/nptl/tst-cond22.c 8 Sep 2006 12:59:45 -0000 @@ -1,5 +1,6 @@ -#include <pthreadP.h> +#include <pthread.h> #include <stdio.h> +#include <stdlib.h> static pthread_barrier_t b; --- libc/nptl/sysdeps/pthread/pthread_cond_wait.c 8 Sep 2006 10:39:42 -0000 1.17 +++ libc/nptl/sysdeps/pthread/pthread_cond_wait.c 8 Sep 2006 12:59:45 -0000 @@ -51,13 +51,15 @@ __condvar_cleanup (void *arg) { /* This thread is not waiting anymore. Adjust the sequence counters appropriately. We do not increment WAKEUP_SEQ if this would - bump it over the value of TOTAL_SEQ> This can happen if a thread + bump it over the value of TOTAL_SEQ. This can happen if a thread was woken and then canceled. */ if (cbuffer->cond->__data.__wakeup_seq < cbuffer->cond->__data.__total_seq) - ++cbuffer->cond->__data.__wakeup_seq; + { + ++cbuffer->cond->__data.__wakeup_seq; + ++cbuffer->cond->__data.__futex; + } ++cbuffer->cond->__data.__woken_seq; - ++cbuffer->cond->__data.__futex; } cbuffer->cond->__data.__nwaiters -= 1 << COND_CLOCK_BITS; --- libc/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S 8 Sep 2006 10:39:42 -0000 1.38 +++ libc/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S 8 Sep 2006 12:59:45 -0000 @@ -406,7 +406,7 @@ __condvar_tw_cleanup: cmpl 20(%esp), %eax jne 3f - /* We increment the woken_seq counter only if it is lower than + /* We increment the wakeup_seq counter only if it is lower than total_seq. If this is not the case the thread was woken and then canceled. In this case we ignore the signal. */ movl total_seq(%ebx), %eax @@ -419,10 +419,9 @@ __condvar_tw_cleanup: 6: addl $1, wakeup_seq(%ebx) adcl $0, wakeup_seq+4(%ebx) + addl $1, cond_futex(%ebx) -7: addl $1, cond_futex(%ebx) - - addl $1, woken_seq(%ebx) +7: addl $1, woken_seq(%ebx) adcl $0, woken_seq+4(%ebx) 3: subl $(1 << clock_bits), cond_nwaiters(%ebx) --- libc/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S 8 Sep 2006 10:39:42 -0000 1.33 +++ libc/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S 8 Sep 2006 12:59:45 -0000 @@ -297,7 +297,7 @@ __condvar_w_cleanup: cmpl 12(%esp), %eax jne 3f - /* We increment the woken_seq counter only if it is lower than + /* We increment the wakeup_seq counter only if it is lower than total_seq. If this is not the case the thread was woken and then canceled. In this case we ignore the signal. */ movl total_seq(%ebx), %eax @@ -310,8 +310,9 @@ __condvar_w_cleanup: 6: addl $1, wakeup_seq(%ebx) adcl $0, wakeup_seq+4(%ebx) + addl $1, cond_futex(%ebx) -7: addl $1, cond_futex(%ebx) +7: addl $1, woken_seq(%ebx) adcl $0, woken_seq+4(%ebx) --- libc/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S 8 Sep 2006 10:39:41 -0000 1.23 +++ libc/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S 8 Sep 2006 12:59:45 -0000 @@ -67,15 +67,15 @@ __condvar_cleanup: cmpl 4(%r8), %edx jne 3f - /* We increment the woken_seq counter only if it is lower than + /* We increment the wakeup_seq counter only if it is lower than total_seq. If this is not the case the thread was woken and then canceled. In this case we ignore the signal. */ movq total_seq(%rdi), %rax cmpq wakeup_seq(%rdi), %rax jbe 6f incq wakeup_seq(%rdi) -6: incq woken_seq(%rdi) incl cond_futex(%rdi) +6: incq woken_seq(%rdi) 3: subl $(1 << clock_bits), cond_nwaiters(%rdi) --- libc/nptl/ChangeLog 8 Sep 2006 10:41:17 -0000 1.919 +++ libc/nptl/ChangeLog 8 Sep 2006 12:59:45 -0000 @@ -3,9 +3,9 @@ [BZ #3123] * sysdeps/pthread/pthread_cond_wait.c (__condvar_cleanup): Don't increment WAKEUP_SEQ if this would increase the value beyond TOTAL_SEQ. - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.c: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.c: Likewise. - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.c: Likewise. + * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S: Likewise. + * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S: Likewise. + * sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S: Likewise. * Makefile (tests): Add tst-cond22. * tst-cond22.c: New file. Jakub
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |