diff options
author | Ulrich Drepper <drepper@redhat.com> | 2005-12-23 01:55:26 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2005-12-23 01:55:26 +0000 |
commit | 7735afa212034346f31baa6aee5466de74309541 (patch) | |
tree | eaabd29135191d9edf4f6c2f5fcd75e2a57e69a9 /nptl/tst-cancel24.cc | |
parent | 331926097f7dd22ef585d75c16bc5d992b991ee4 (diff) | |
download | glibc-7735afa212034346f31baa6aee5466de74309541.tar.gz |
* Makeconfig: Define CXXFLAGS. Split out warnings from +gccwarn which
are not understood by the C++ compiler.
* Makerules: Add rules to build C++ code for test cases.
* include/stdlib.h: Protect for inclusion in C++ code.
* include/time.h: Likewise.
* test-skeleton.c (timeout_handler): Rewrite ts initialization for
C++ compatibility.
Diffstat (limited to 'nptl/tst-cancel24.cc')
-rw-r--r-- | nptl/tst-cancel24.cc | 113 |
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..52cf079d5a --- /dev/null +++ b/nptl/tst-cancel24.cc @@ -0,0 +1,113 @@ +#include <cstdlib> +#include <cstdio> +#include <pthread.h> +#include <semaphore.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" |