|
From: <sv...@va...> - 2008-07-07 17:22:32
|
Author: bart
Date: 2008-07-07 18:22:41 +0100 (Mon, 07 Jul 2008)
New Revision: 8382
Log:
Added Qt4 semaphore test.
Added:
trunk/drd/tests/qt4_semaphore.cpp
trunk/drd/tests/qt4_semaphore.stderr.exp
trunk/drd/tests/qt4_semaphore.vgtest
Modified:
trunk/drd/tests/Makefile.am
Modified: trunk/drd/tests/Makefile.am
===================================================================
--- trunk/drd/tests/Makefile.am 2008-07-07 17:19:17 UTC (rev 8381)
+++ trunk/drd/tests/Makefile.am 2008-07-07 17:22:41 UTC (rev 8382)
@@ -94,6 +94,8 @@
pth_spinlock.vgtest \
qt4_mutex.stderr.exp \
qt4_mutex.vgtest \
+ qt4_semaphore.stderr.exp \
+ qt4_semaphore.vgtest \
recursive_mutex.stderr.exp \
recursive_mutex.stdout.exp \
recursive_mutex.vgtest \
@@ -232,7 +234,7 @@
trylock
if HAVE_QTCORE
-check_PROGRAMS += qt4_mutex
+check_PROGRAMS += qt4_mutex qt4_semaphore
endif
if HAVE_OPENMP
@@ -308,7 +310,10 @@
if HAVE_QTCORE
qt4_mutex_SOURCES = qt4_mutex.cpp
-qt4_mutex_LDADD = -lpthread -lQtCore
+qt4_mutex_LDADD = -lQtCore -lpthread
+
+qt4_semaphore_SOURCES = qt4_semaphore.cpp
+qt4_semaphore_LDADD = -lQtCore -lpthread
endif
recursive_mutex_SOURCES = recursive_mutex.c
Added: trunk/drd/tests/qt4_semaphore.cpp
===================================================================
--- trunk/drd/tests/qt4_semaphore.cpp (rev 0)
+++ trunk/drd/tests/qt4_semaphore.cpp 2008-07-07 17:22:41 UTC (rev 8382)
@@ -0,0 +1,82 @@
+/// Qt4 semaphore test.
+
+#ifndef _GNU_SOURCE
+#define _GNU_SOURCE
+#endif
+
+#include <QtCore/QThread> // class QMutex
+#include <QtCore/QSemaphore> // class QSemaphore
+#include <cstdio> // fprintf()
+#include <cstdlib> // atoi()
+#include <new>
+#include <pthread.h> // pthread_barrier_t
+#include <vector>
+
+
+static pthread_barrier_t s_barrier;
+static QSemaphore* s_pSema;
+static int s_iterations;
+static int s_counter;
+
+
+class IncThread: public QThread
+{
+ virtual void run();
+};
+
+void IncThread::run()
+{
+ int i;
+
+ pthread_barrier_wait(&s_barrier);
+ for (i = s_iterations; i > 0; i--)
+ {
+ s_pSema->acquire();
+ s_counter++;
+ s_pSema->release();
+ }
+}
+
+int main(int argc, char** argv)
+{
+ int i;
+ const int n_threads = 10;
+ std::vector<QThread*> tid(n_threads);
+
+ s_iterations = argc > 1 ? atoi(argv[1]) : 1000;
+
+ fprintf(stderr, "Start of test.\n");
+
+ {
+ // Stack-allocated semaphore.
+ QSemaphore S(1);
+ S.acquire();
+ S.release();
+ S.acquire();
+ S.release();
+ }
+
+ pthread_barrier_init(&s_barrier, 0, n_threads);
+ s_pSema = new QSemaphore(1);
+ for (i = 0; i < n_threads; i++)
+ {
+ tid[i] = new IncThread;
+ tid[i]->start();
+ }
+ for (i = 0; i < n_threads; i++)
+ {
+ tid[i]->wait();
+ delete tid[i];
+ }
+ delete s_pSema;
+ s_pSema = 0;
+ pthread_barrier_destroy(&s_barrier);
+
+ if (s_counter == n_threads * s_iterations)
+ fprintf(stderr, "Test successful.\n");
+ else
+ fprintf(stderr, "Test failed: counter = %d, should be %d\n",
+ s_counter, n_threads * s_iterations);
+
+ return 0;
+}
Added: trunk/drd/tests/qt4_semaphore.stderr.exp
===================================================================
--- trunk/drd/tests/qt4_semaphore.stderr.exp (rev 0)
+++ trunk/drd/tests/qt4_semaphore.stderr.exp 2008-07-07 17:22:41 UTC (rev 8382)
@@ -0,0 +1,5 @@
+
+Start of test.
+Test successful.
+
+ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
Added: trunk/drd/tests/qt4_semaphore.vgtest
===================================================================
--- trunk/drd/tests/qt4_semaphore.vgtest (rev 0)
+++ trunk/drd/tests/qt4_semaphore.vgtest 2008-07-07 17:22:41 UTC (rev 8382)
@@ -0,0 +1,2 @@
+vgopts: --check-stack-var=yes
+prog: qt4_semaphore
|