]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
drd: Add a stress test for the barrier implementation
authorBart Van Assche <bvanassche@acm.org>
Fri, 29 Jul 2011 12:32:53 +0000 (12:32 +0000)
committerBart Van Assche <bvanassche@acm.org>
Fri, 29 Jul 2011 12:32:53 +0000 (12:32 +0000)
git-svn-id: svn://svn.valgrind.org/valgrind/trunk@11944

drd/tests/Makefile.am
drd/tests/pth_barrier_thr_cr.c [new file with mode: 0644]
drd/tests/pth_barrier_thr_cr.stderr.exp [new file with mode: 0644]
drd/tests/pth_barrier_thr_cr.vgtest [new file with mode: 0644]

index e85a67167c7ad9550920aea4dbb4212128b5c369..340c438015137cdebc8a360f7dc6906621456a77 100644 (file)
@@ -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 (file)
index 0000000..a6d4743
--- /dev/null
@@ -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 <assert.h>
+#include <pthread.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+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 (file)
index 0000000..d16127f
--- /dev/null
@@ -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 (file)
index 0000000..977217c
--- /dev/null
@@ -0,0 +1,3 @@
+prereq: test -e pth_barrier_thr_cr && ./supported_libpthread
+prog: pth_barrier_thr_cr 200
+stdout_filter: ../../tests/filter_sink