From: Bart Van Assche Date: Fri, 29 Jul 2011 12:32:53 +0000 (+0000) Subject: drd: Add a stress test for the barrier implementation X-Git-Tag: svn/VALGRIND_3_7_0~293 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5c64e2ce11c517fd2946b705a95804f91750fb39;p=thirdparty%2Fvalgrind.git drd: Add a stress test for the barrier implementation git-svn-id: svn://svn.valgrind.org/valgrind/trunk@11944 --- diff --git a/drd/tests/Makefile.am b/drd/tests/Makefile.am index e85a67167c..340c438015 100644 --- a/drd/tests/Makefile.am +++ b/drd/tests/Makefile.am @@ -133,6 +133,8 @@ EXTRA_DIST = \ pth_barrier_race.vgtest \ pth_barrier_reinit.stderr.exp \ pth_barrier_reinit.vgtest \ + pth_barrier_thr_cr.stderr.exp \ + pth_barrier_thr_cr.vgtest \ pth_broadcast.stderr.exp \ pth_broadcast.vgtest \ pth_cancel_locked.stderr.exp \ @@ -342,7 +344,8 @@ check_PROGRAMS += omp_matinv omp_prime omp_printf endif if HAVE_PTHREAD_BARRIER -check_PROGRAMS += matinv pth_barrier pth_barrier_race pth_barrier_reinit +check_PROGRAMS += matinv pth_barrier pth_barrier_race pth_barrier_reinit \ + pth_barrier_thr_cr endif if HAVE_PTHREAD_CREATE_GLIBC_2_0 diff --git a/drd/tests/pth_barrier_thr_cr.c b/drd/tests/pth_barrier_thr_cr.c new file mode 100644 index 0000000000..a6d474381b --- /dev/null +++ b/drd/tests/pth_barrier_thr_cr.c @@ -0,0 +1,50 @@ +/* -*- mode: C; c-basic-offset: 2; indent-tabs-mode: nil; -*- */ +/* + * Test program that triggers pthread_barrier_wait() where each + * pthread_barrier_wait() call is invoked by another thread. This is the only + * test program that triggers the code guarded by if (q->thread_finished) in + * DRD_(barrier_pre_wait)(). + */ + +#define _GNU_SOURCE + +#include +#include +#include +#include +#include + +static pthread_barrier_t s_barrier; + +static void* thread(void* arg) +{ + write(STDOUT_FILENO, ".", 1); + pthread_barrier_wait(&s_barrier); + return NULL; +} + +int main(int argc, char** argv) +{ + pthread_t *tid; + int barriers = argc > 2 ? atoi(argv[1]) : 20; + int barrier_participants = 2; + int thread_count = barriers * barrier_participants; + int i; + + pthread_barrier_init(&s_barrier, NULL, barrier_participants); + + tid = malloc(thread_count * sizeof(*tid)); + assert(tid); + for (i = 0; i < thread_count; i++) + pthread_create(&tid[i], NULL, thread, NULL); + for (i = 0; i < thread_count; i++) + pthread_join(tid[i], NULL); + free(tid); + + pthread_barrier_destroy(&s_barrier); + + write(STDOUT_FILENO, "\n", 1); + fprintf(stderr, "Done.\n"); + + return 0; +} diff --git a/drd/tests/pth_barrier_thr_cr.stderr.exp b/drd/tests/pth_barrier_thr_cr.stderr.exp new file mode 100644 index 0000000000..d16127fb58 --- /dev/null +++ b/drd/tests/pth_barrier_thr_cr.stderr.exp @@ -0,0 +1,4 @@ + +Done. + +ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0) diff --git a/drd/tests/pth_barrier_thr_cr.vgtest b/drd/tests/pth_barrier_thr_cr.vgtest new file mode 100644 index 0000000000..977217cd6c --- /dev/null +++ b/drd/tests/pth_barrier_thr_cr.vgtest @@ -0,0 +1,3 @@ +prereq: test -e pth_barrier_thr_cr && ./supported_libpthread +prog: pth_barrier_thr_cr 200 +stdout_filter: ../../tests/filter_sink