|
From: <sv...@va...> - 2011-07-29 12:37:41
|
Author: bart
Date: 2011-07-29 13:32:53 +0100 (Fri, 29 Jul 2011)
New Revision: 11944
Log:
drd: Add a stress test for the barrier implementation
Added:
trunk/drd/tests/pth_barrier_thr_cr.c
trunk/drd/tests/pth_barrier_thr_cr.stderr.exp
trunk/drd/tests/pth_barrier_thr_cr.vgtest
Modified:
trunk/drd/tests/Makefile.am
Modified: trunk/drd/tests/Makefile.am
===================================================================
--- trunk/drd/tests/Makefile.am 2011-07-29 12:31:33 UTC (rev 11943)
+++ trunk/drd/tests/Makefile.am 2011-07-29 12:32:53 UTC (rev 11944)
@@ -133,6 +133,8 @@
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 @@
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
Added: trunk/drd/tests/pth_barrier_thr_cr.c
===================================================================
--- trunk/drd/tests/pth_barrier_thr_cr.c (rev 0)
+++ trunk/drd/tests/pth_barrier_thr_cr.c 2011-07-29 12:32:53 UTC (rev 11944)
@@ -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;
+}
Added: trunk/drd/tests/pth_barrier_thr_cr.stderr.exp
===================================================================
--- trunk/drd/tests/pth_barrier_thr_cr.stderr.exp (rev 0)
+++ trunk/drd/tests/pth_barrier_thr_cr.stderr.exp 2011-07-29 12:32:53 UTC (rev 11944)
@@ -0,0 +1,4 @@
+
+Done.
+
+ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
Added: trunk/drd/tests/pth_barrier_thr_cr.vgtest
===================================================================
--- trunk/drd/tests/pth_barrier_thr_cr.vgtest (rev 0)
+++ trunk/drd/tests/pth_barrier_thr_cr.vgtest 2011-07-29 12:32:53 UTC (rev 11944)
@@ -0,0 +1,3 @@
+prereq: test -e pth_barrier_thr_cr && ./supported_libpthread
+prog: pth_barrier_thr_cr 200
+stdout_filter: ../../tests/filter_sink
|