From: Bart Van Assche Date: Mon, 7 Jul 2008 17:22:41 +0000 (+0000) Subject: Added Qt4 semaphore test. X-Git-Tag: svn/VALGRIND_3_4_0~356 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=88a28a78f9b275c3fdee3d3498d705b96755754d;p=thirdparty%2Fvalgrind.git Added Qt4 semaphore test. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@8382 --- diff --git a/drd/tests/Makefile.am b/drd/tests/Makefile.am index 6c82843a76..c485f7c28c 100644 --- a/drd/tests/Makefile.am +++ b/drd/tests/Makefile.am @@ -94,6 +94,8 @@ EXTRA_DIST = \ 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 @@ check_PROGRAMS = \ trylock if HAVE_QTCORE -check_PROGRAMS += qt4_mutex +check_PROGRAMS += qt4_mutex qt4_semaphore endif if HAVE_OPENMP @@ -308,7 +310,10 @@ pth_spinlock_LDADD = -lpthread 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 diff --git a/drd/tests/qt4_semaphore.cpp b/drd/tests/qt4_semaphore.cpp new file mode 100644 index 0000000000..cb19aa4e49 --- /dev/null +++ b/drd/tests/qt4_semaphore.cpp @@ -0,0 +1,82 @@ +/// Qt4 semaphore test. + +#ifndef _GNU_SOURCE +#define _GNU_SOURCE +#endif + +#include // class QMutex +#include // class QSemaphore +#include // fprintf() +#include // atoi() +#include +#include // pthread_barrier_t +#include + + +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 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; +} diff --git a/drd/tests/qt4_semaphore.stderr.exp b/drd/tests/qt4_semaphore.stderr.exp new file mode 100644 index 0000000000..21dba22019 --- /dev/null +++ b/drd/tests/qt4_semaphore.stderr.exp @@ -0,0 +1,5 @@ + +Start of test. +Test successful. + +ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0) diff --git a/drd/tests/qt4_semaphore.vgtest b/drd/tests/qt4_semaphore.vgtest new file mode 100644 index 0000000000..8a923c6738 --- /dev/null +++ b/drd/tests/qt4_semaphore.vgtest @@ -0,0 +1,2 @@ +vgopts: --check-stack-var=yes +prog: qt4_semaphore