aboutsummaryrefslogtreecommitdiff
path: root/nptl/tst-cancel24.cc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2007-07-12 18:26:36 +0000
committerJakub Jelinek <jakub@redhat.com>2007-07-12 18:26:36 +0000
commit0ecb606cb6cf65de1d9fc8a919bceb4be476c602 (patch)
tree2ea1f8305970753e4a657acb2ccc15ca3eec8e2c /nptl/tst-cancel24.cc
parent7d58530341304d403a6626d7f7a1913165fe2f32 (diff)
downloadglibc-0ecb606cb6cf65de1d9fc8a919bceb4be476c602.tar
glibc-0ecb606cb6cf65de1d9fc8a919bceb4be476c602.tar.gz
glibc-0ecb606cb6cf65de1d9fc8a919bceb4be476c602.tar.bz2
glibc-0ecb606cb6cf65de1d9fc8a919bceb4be476c602.zip
2.5-18.1
Diffstat (limited to 'nptl/tst-cancel24.cc')
-rw-r--r--nptl/tst-cancel24.cc113
1 files changed, 113 insertions, 0 deletions
diff --git a/nptl/tst-cancel24.cc b/nptl/tst-cancel24.cc
new file mode 100644
index 0000000000..1af709a8ca
--- /dev/null
+++ b/nptl/tst-cancel24.cc
@@ -0,0 +1,113 @@
+#include <pthread.h>
+#include <semaphore.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <unistd.h>
+
+
+static volatile bool destr_called;
+static volatile bool except_caught;
+
+static pthread_barrier_t b;
+
+
+struct monitor
+{
+ // gcc is broken and would generate a warning without this dummy
+ // constructor.
+ monitor () { }
+ ~monitor() { destr_called = true; }
+};
+
+
+static void *
+tf (void *arg)
+{
+ sem_t *s = static_cast<sem_t *> (arg);
+
+ try
+ {
+ monitor m;
+
+ pthread_barrier_wait (&b);
+
+ while (1)
+ sem_wait (s);
+ }
+ catch (...)
+ {
+ except_caught = true;
+ throw;
+ }
+
+ return NULL;
+}
+
+
+static int
+do_test ()
+{
+ if (pthread_barrier_init (&b, NULL, 2) != 0)
+ {
+ puts ("barrier_init failed");
+ return 1;
+ }
+
+ sem_t s;
+ if (sem_init (&s, 0, 0) != 0)
+ {
+ puts ("sem_init failed");
+ return 1;
+ }
+
+ pthread_t th;
+ if (pthread_create (&th, NULL, tf, &s) != 0)
+ {
+ puts ("pthread_create failed");
+ return 1;
+ }
+
+ pthread_barrier_wait (&b);
+
+ /* There is unfortunately no better method to try to assure the
+ child thread reached the sem_wait call and is actually waiting
+ than to sleep here. */
+ sleep (1);
+
+ if (pthread_cancel (th) != 0)
+ {
+ puts ("cancel failed");
+ return 1;
+ }
+
+ void *res;
+ if (pthread_join (th, &res) != 0)
+ {
+ puts ("join failed");
+ return 1;
+ }
+
+ if (res != PTHREAD_CANCELED)
+ {
+ puts ("thread was not canceled");
+ return 1;
+ }
+
+ if (! except_caught)
+ {
+ puts ("exception not caught");
+ return 1;
+ }
+
+ if (! destr_called)
+ {
+ puts ("destructor not called");
+ return 1;
+ }
+
+ return 0;
+}
+
+#define TEST_FUNCTION do_test ()
+#define TIMEOUT 3
+#include "../test-skeleton.c"