]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
drd/tests: Add test program that makes sem_trywait() return a non-zero value
authorBart Van Assche <bvanassche@acm.org>
Fri, 24 Aug 2012 17:57:44 +0000 (17:57 +0000)
committerBart Van Assche <bvanassche@acm.org>
Fri, 24 Aug 2012 17:57:44 +0000 (17:57 +0000)
(provided by Graham Whitted <7wz69ejteg@snkmail.com> - see also #305690).

git-svn-id: svn://svn.valgrind.org/valgrind/trunk@12896

drd/tests/Makefile.am
drd/tests/sem_wait.cpp [new file with mode: 0644]
drd/tests/sem_wait.stderr.exp [new file with mode: 0644]
drd/tests/sem_wait.vgtest [new file with mode: 0644]

index e7f1f3aa023ec59b6a3bf3e289d1d67c05262b6c..820ef2b4aa09aae68a120c5b2fb86ff6b2f1e8d2 100644 (file)
@@ -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 (file)
index 0000000..b22944c
--- /dev/null
@@ -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;
+}
diff --git a/drd/tests/sem_wait.stderr.exp b/drd/tests/sem_wait.stderr.exp
new file mode 100644 (file)
index 0000000..3b374dd
--- /dev/null
@@ -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 (file)
index 0000000..d9a27b9
--- /dev/null
@@ -0,0 +1,3 @@
+prereq: ./supported_libpthread
+vgopts: --check-stack-var=yes --read-var-info=yes
+prog: sem_wait