|
From: <sv...@va...> - 2012-08-24 17:57:53
|
bart 2012-08-24 18:57:44 +0100 (Fri, 24 Aug 2012)
New Revision: 12896
Log:
drd/tests: Add test program that makes sem_trywait() return a non-zero value
(provided by Graham Whitted <7wz...@sn...> - see also #305690).
Added files:
trunk/drd/tests/sem_wait.cpp
trunk/drd/tests/sem_wait.stderr.exp
trunk/drd/tests/sem_wait.vgtest
Modified files:
trunk/drd/tests/Makefile.am
Added: trunk/drd/tests/sem_wait.vgtest (+3 -0)
===================================================================
--- trunk/drd/tests/sem_wait.vgtest 2012-08-24 17:53:02 +01:00 (rev 12895)
+++ trunk/drd/tests/sem_wait.vgtest 2012-08-24 18:57:44 +01:00 (rev 12896)
@@ -0,0 +1,3 @@
+prereq: ./supported_libpthread
+vgopts: --check-stack-var=yes --read-var-info=yes
+prog: sem_wait
Modified: trunk/drd/tests/Makefile.am (+5 -0)
===================================================================
--- trunk/drd/tests/Makefile.am 2012-08-24 17:53:02 +01:00 (rev 12895)
+++ trunk/drd/tests/Makefile.am 2012-08-24 18:57:44 +01:00 (rev 12896)
@@ -217,6 +217,8 @@
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 @@
rwlock_type_checking \
sem_as_mutex \
sem_open \
+ sem_wait \
sigalrm \
thread_name \
threaded-fork \
@@ -436,3 +439,5 @@
std_thread_SOURCES = std_thread.cpp
std_thread_CXXFLAGS = $(AM_CXXFLAGS) -std=c++0x
+
+sem_wait_SOURCES = sem_wait.cpp
Added: trunk/drd/tests/sem_wait.cpp (+42 -0)
===================================================================
--- trunk/drd/tests/sem_wait.cpp 2012-08-24 17:53:02 +01:00 (rev 12895)
+++ trunk/drd/tests/sem_wait.cpp 2012-08-24 18:57:44 +01:00 (rev 12896)
@@ -0,0 +1,42 @@
+#include <iostream>
+#include <cerrno>
+#include <cstring>
+#include <pthread.h>
+#include <semaphore.h>
+
+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;
+}
Added: trunk/drd/tests/sem_wait.stderr.exp (+5 -0)
===================================================================
--- trunk/drd/tests/sem_wait.stderr.exp 2012-08-24 17:53:02 +01:00 (rev 12895)
+++ trunk/drd/tests/sem_wait.stderr.exp 2012-08-24 18:57:44 +01:00 (rev 12896)
@@ -0,0 +1,5 @@
+
+Calling sem_trywait
+Wait would have blocked
+
+ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
|