|
From: <sv...@va...> - 2009-02-22 09:26:30
|
Author: bart Date: 2009-02-22 09:26:22 +0000 (Sun, 22 Feb 2009) New Revision: 9215 Log: Added regression test for detection of unsynchronized pthread_barrier_wait() and pthread_barrier_delete() calls. Added: trunk/drd/tests/pth_barrier_race.c trunk/drd/tests/pth_barrier_race.stderr.exp trunk/drd/tests/pth_barrier_race.vgtest Modified: trunk/drd/tests/ trunk/drd/tests/Makefile.am Property changes on: trunk/drd/tests ___________________________________________________________________ Name: svn:ignore - *.stderr.diff* *.stderr.out *.stdout.diff* *.stdout.out .deps atomic_var bar_bad bar_trivial boost_thread circular_buffer drd_bitmap_test fp_race hg01_all_ok hg02_deadlock hg03_inherit hg04_race hg05_race2 hg06_readshared hold_lock linuxthreads_det Makefile Makefile.in matinv memory_allocation monitor_example new_delete omp_matinv omp_prime omp_printf pth_barrier pth_barrier_reinit pth_broadcast pth_cancel_locked pth_cond_race pth_create_chain pth_detached pth_detached_sem pth_inconsistent_cond_wait pth_spinlock qt4_mutex qt4_rwlock qt4_semaphore recursive_mutex rwlock_race rwlock_test sem_as_mutex sigalrm tc01_simple_race tc02_simple_tls tc03_re_excl tc04_free_lock tc05_simple_race tc06_two_races tc07_hbl1 tc08_hbl2 tc09_bad_unlock tc10_rec_lock tc11_XCHG tc12_rwl_trivial tc13_laog1 tc15_laog_lockdel tc16_byterace tc17_sembar tc18_semabuse tc19_shadowmem tc20_verifywrap tc21_pthonce tc22_exit_w_lock tc23_bogus_condwait tc24_nonzero_sem trylock vg_regtest.tmp* + *.stderr.diff* *.stderr.out *.stdout.diff* *.stdout.out .deps atomic_var bar_bad bar_trivial boost_thread circular_buffer drd_bitmap_test fp_race hg01_all_ok hg02_deadlock hg03_inherit hg04_race hg05_race2 hg06_readshared hold_lock linuxthreads_det Makefile Makefile.in matinv memory_allocation monitor_example new_delete omp_matinv omp_prime omp_printf pth_barrier pth_barrier_race pth_barrier_reinit pth_broadcast pth_cancel_locked pth_cond_race pth_create_chain pth_detached pth_detached_sem pth_inconsistent_cond_wait pth_spinlock qt4_mutex qt4_rwlock qt4_semaphore recursive_mutex rwlock_race rwlock_test sem_as_mutex sigalrm tc01_simple_race tc02_simple_tls tc03_re_excl tc04_free_lock tc05_simple_race tc06_two_races tc07_hbl1 tc08_hbl2 tc09_bad_unlock tc10_rec_lock tc11_XCHG tc12_rwl_trivial tc13_laog1 tc15_laog_lockdel tc16_byterace tc17_sembar tc18_semabuse tc19_shadowmem tc20_verifywrap tc21_pthonce tc22_exit_w_lock tc23_bogus_condwait tc24_nonzero_sem trylock vg_regtest.tmp* Modified: trunk/drd/tests/Makefile.am =================================================================== --- trunk/drd/tests/Makefile.am 2009-02-21 16:17:50 UTC (rev 9214) +++ trunk/drd/tests/Makefile.am 2009-02-22 09:26:22 UTC (rev 9215) @@ -81,6 +81,8 @@ pth_barrier2.vgtest \ pth_barrier3.stderr.exp \ pth_barrier3.vgtest \ + pth_barrier_race.stderr.exp \ + pth_barrier_race.vgtest \ pth_barrier_reinit.stderr.exp \ pth_barrier_reinit.vgtest \ pth_broadcast.stderr.exp \ @@ -226,7 +228,7 @@ endif if HAVE_PTHREAD_BARRIER -check_PROGRAMS += matinv pth_barrier pth_barrier_reinit +check_PROGRAMS += matinv pth_barrier pth_barrier_race pth_barrier_reinit endif if HAVE_PTHREAD_SPINLOCK Added: trunk/drd/tests/pth_barrier_race.c =================================================================== --- trunk/drd/tests/pth_barrier_race.c (rev 0) +++ trunk/drd/tests/pth_barrier_race.c 2009-02-22 09:26:22 UTC (rev 9215) @@ -0,0 +1,46 @@ +/* + * Test program that triggers a race between pthread_barrier_wait() and + * pthread_barrier_destroy(): proper synchronization is missing between + * the pthread_barrier_wait() and the pthread_barrier_destroy() calls. This + * test program is based on the example that was posted on February 5, 2009 by + * Christoph Bartoschek on the valgrind-users mailing list. Redistribution of + * the source code below is permitted under the GPLv2 license. + * + * See also http://article.gmane.org/gmane.comp.debugging.valgrind/8945/match=pthread_barrier_wait + */ + + +#include <pthread.h> +#include <stdlib.h> + + +static pthread_barrier_t* barrier; + + +static void* thread(void* arg) +{ + pthread_barrier_wait(barrier); + return NULL; +} + +int main() +{ + pthread_t tid; + + barrier = (pthread_barrier_t *) malloc(sizeof(*barrier)); + pthread_barrier_init(barrier, NULL, 2); + + pthread_create(&tid, NULL, thread, NULL); + + pthread_barrier_wait(barrier); + /* + * The sleep() call below ensures that the pthread_barrier_destroy() call + * happens after the created thread has returned from pthread_barrier_wait(). + */ + sleep(1); + pthread_barrier_destroy(barrier); + free(barrier); + + pthread_join(tid, NULL); + return 0; +} Added: trunk/drd/tests/pth_barrier_race.stderr.exp =================================================================== --- trunk/drd/tests/pth_barrier_race.stderr.exp (rev 0) +++ trunk/drd/tests/pth_barrier_race.stderr.exp 2009-02-22 09:26:22 UTC (rev 9215) @@ -0,0 +1,15 @@ + +Destruction of barrier not synchronized with barrier wait call: barrier 0x........ + at 0x........: pthread_barrier_destroy (drd_pthread_intercepts.c:?) + by 0x........: main (pth_barrier_race.c:?) +Conflicting wait call by thread 0/2: + at 0x........: pthread_barrier_wait (drd_pthread_intercepts.c:?) + by 0x........: thread (pth_barrier_race.c:?) + by 0x........: vgDrd_thread_wrapper (drd_pthread_intercepts.c:?) + by 0x........: (within libpthread-?.?.so) + by 0x........: clone (in /...libc...) +barrier 0x........ was first observed at: + at 0x........: pthread_barrier_init (drd_pthread_intercepts.c:?) + by 0x........: main (pth_barrier_race.c:?) + +ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0) Added: trunk/drd/tests/pth_barrier_race.vgtest =================================================================== --- trunk/drd/tests/pth_barrier_race.vgtest (rev 0) +++ trunk/drd/tests/pth_barrier_race.vgtest 2009-02-22 09:26:22 UTC (rev 9215) @@ -0,0 +1,2 @@ +prereq: test -e pth_barrier_race && ./supported_libpthread +prog: pth_barrier_race |