]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Added the pth_cancel_locked test.
authorBart Van Assche <bvanassche@acm.org>
Sat, 27 Sep 2008 12:26:17 +0000 (12:26 +0000)
committerBart Van Assche <bvanassche@acm.org>
Sat, 27 Sep 2008 12:26:17 +0000 (12:26 +0000)
git-svn-id: svn://svn.valgrind.org/valgrind/trunk@8635

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

index 8dce8bc88ce7a78549ccb0c7ae8558ce368ee9ee..bf98e10cc7ea704be3c0690af8f9cfc66f52ae62 100644 (file)
@@ -74,6 +74,8 @@ EXTRA_DIST =                                        \
        pth_barrier_reinit.vgtest                   \
        pth_broadcast.stderr.exp                    \
        pth_broadcast.vgtest                        \
+       pth_cancel_locked.stderr.exp                \
+       pth_cancel_locked.vgtest                    \
        pth_cond_race.stderr.exp                    \
        pth_cond_race.vgtest                        \
        pth_cond_race2.stderr.exp                   \
@@ -203,6 +205,7 @@ check_PROGRAMS =      \
   pth_barrier         \
   pth_barrier_reinit  \
   pth_broadcast       \
+  pth_cancel_locked   \
   pth_cond_race       \
   pth_create_chain    \
   pth_detached        \
@@ -299,6 +302,9 @@ pth_barrier_reinit_LDADD    = -lpthread
 pth_broadcast_SOURCES       = pth_broadcast.c
 pth_broadcast_LDADD         = -lpthread
 
+pth_cancel_locked_SOURCES   = pth_cancel_locked.c
+pth_cancel_locked_LDADD     = -lpthread
+
 pth_cond_race_SOURCES       = pth_cond_race.c
 pth_cond_race_LDADD         = -lpthread
 
diff --git a/drd/tests/pth_cancel_locked.c b/drd/tests/pth_cancel_locked.c
new file mode 100644 (file)
index 0000000..86c15b8
--- /dev/null
@@ -0,0 +1,51 @@
+/** Cancel a thread that holds a lock on a mutex. */
+
+
+#include <assert.h>
+#include <pthread.h>
+#include <stdio.h>
+
+
+pthread_cond_t  s_cond;
+pthread_mutex_t s_mutex1;
+pthread_mutex_t s_mutex2;
+
+
+static void* thread(void* arg)
+{
+  /* Lock s_mutex2. */
+  pthread_mutex_lock(&s_mutex2);
+  /* Inform the main thread that s_mutex2 has been locked, and wait for pthread_cancel(). */
+  pthread_mutex_lock(&s_mutex1);
+  pthread_cond_signal(&s_cond);
+  pthread_cond_wait(&s_cond, &s_mutex1);
+  return 0;
+}
+
+int main(int argc, char** argv)
+{
+  pthread_t tid;
+
+  /* Initialize synchronization objects. */
+  pthread_cond_init(&s_cond, 0);
+  pthread_mutex_init(&s_mutex1, 0);
+  pthread_mutex_init(&s_mutex2, 0);
+
+  /* Create thread. */
+  pthread_mutex_lock(&s_mutex1);
+  pthread_create(&tid, 0, &thread, 0);
+
+  /* Wait until the created thread has locked s_mutex2. */
+  pthread_cond_wait(&s_cond, &s_mutex1);
+  pthread_mutex_unlock(&s_mutex1);
+
+  /* Cancel the created thread. */
+  pthread_cancel(tid);
+
+  /* Join the created thread. */
+  pthread_join(tid, 0);
+
+  fprintf(stderr, "Test finished.\n");
+
+  return 0;
+}
diff --git a/drd/tests/pth_cancel_locked.stderr.exp b/drd/tests/pth_cancel_locked.stderr.exp
new file mode 100644 (file)
index 0000000..ea32d4a
--- /dev/null
@@ -0,0 +1,10 @@
+
+Mutex still locked at thread exit: mutex 0x........, recursion count 1, owner 2.
+   at 0x........: pthread_join (drd_pthread_intercepts.c:?)
+   by 0x........: main (pth_cancel_locked.c:?)
+mutex 0x........ was first observed at:
+   at 0x........: pthread_mutex_init (drd_pthread_intercepts.c:?)
+   by 0x........: main (pth_cancel_locked.c:?)
+Test finished.
+
+ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
diff --git a/drd/tests/pth_cancel_locked.vgtest b/drd/tests/pth_cancel_locked.vgtest
new file mode 100644 (file)
index 0000000..b09e38e
--- /dev/null
@@ -0,0 +1,2 @@
+prereq: ./supported_libpthread
+prog: pth_cancel_locked