From: Bart Van Assche Date: Fri, 24 Aug 2012 17:57:44 +0000 (+0000) Subject: drd/tests: Add test program that makes sem_trywait() return a non-zero value X-Git-Tag: svn/VALGRIND_3_9_0~744 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=04a00aa87966b40a89484e0628fed730bdef53bf;p=thirdparty%2Fvalgrind.git drd/tests: Add test program that makes sem_trywait() return a non-zero value (provided by Graham Whitted <7wz69ejteg@snkmail.com> - see also #305690). git-svn-id: svn://svn.valgrind.org/valgrind/trunk@12896 --- diff --git a/drd/tests/Makefile.am b/drd/tests/Makefile.am index e7f1f3aa02..820ef2b4aa 100644 --- a/drd/tests/Makefile.am +++ b/drd/tests/Makefile.am @@ -217,6 +217,8 @@ EXTRA_DIST = \ sem_open3.vgtest \ sem_open_traced.stderr.exp \ sem_open_traced.vgtest \ + sem_wait.stderr.exp \ + sem_wait.vgtest \ sigalrm.stderr.exp \ sigalrm.vgtest \ sigaltstack.stderr.exp \ @@ -328,6 +330,7 @@ check_PROGRAMS = \ rwlock_type_checking \ sem_as_mutex \ sem_open \ + sem_wait \ sigalrm \ thread_name \ threaded-fork \ @@ -436,3 +439,5 @@ endif std_thread_SOURCES = std_thread.cpp std_thread_CXXFLAGS = $(AM_CXXFLAGS) -std=c++0x + +sem_wait_SOURCES = sem_wait.cpp diff --git a/drd/tests/sem_wait.cpp b/drd/tests/sem_wait.cpp new file mode 100644 index 0000000000..b22944c458 --- /dev/null +++ b/drd/tests/sem_wait.cpp @@ -0,0 +1,42 @@ +#include +#include +#include +#include +#include + +struct FailedOn +{ + FailedOn(const char *f, int e) : func(f), eno(e) {} + std::string func; + int eno; +}; + +int main(void) +{ + try { + sem_t mySemaphore; + if (sem_init(&mySemaphore, 0, 0) != 0) + throw FailedOn("sem_init", errno); + + std::cerr << "Calling sem_trywait\n"; + if (sem_trywait(&mySemaphore) != 0) { + if (errno != EAGAIN) + throw FailedOn("sem_trywait", errno); + + std::cerr << "Wait would have blocked" << std::endl; + } else { + std::cerr << "Wait succeeded" << std::endl; + } + + if (sem_destroy(&mySemaphore) != 0) + throw FailedOn("sem_destroy", errno); + + return 0; + } catch (FailedOn &e) { + std::cerr << e.func << " failed: " << strerror(e.eno) << std::endl; + } catch (...) { + std::cerr << "Unknown exception" << std::endl; + } + + return -1; +} diff --git a/drd/tests/sem_wait.stderr.exp b/drd/tests/sem_wait.stderr.exp new file mode 100644 index 0000000000..3b374dd4aa --- /dev/null +++ b/drd/tests/sem_wait.stderr.exp @@ -0,0 +1,5 @@ + +Calling sem_trywait +Wait would have blocked + +ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0) diff --git a/drd/tests/sem_wait.vgtest b/drd/tests/sem_wait.vgtest new file mode 100644 index 0000000000..d9a27b943c --- /dev/null +++ b/drd/tests/sem_wait.vgtest @@ -0,0 +1,3 @@ +prereq: ./supported_libpthread +vgopts: --check-stack-var=yes --read-var-info=yes +prog: sem_wait