]> rtime.felk.cvut.cz Git - l4.git/blob - l4/pkg/valgrind/src/valgrind-3.6.0-svn/none/tests/pth_cancel1.c
update
[l4.git] / l4 / pkg / valgrind / src / valgrind-3.6.0-svn / none / tests / pth_cancel1.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <pthread.h>
4 #include <unistd.h>
5
6 static void thread_cleanup(void *arg)
7 {
8   printf("cleaning up 0x%lx\n", (long)arg);
9
10   return;
11 }
12
13 static void *thread_main(void *arg)
14 {
15   pthread_cleanup_push(thread_cleanup, (void *)0x1234);
16   pthread_cleanup_push(thread_cleanup, (void *)0x5678);
17
18   if (pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL) != 0)
19     {
20       perror("pthread_setcanceltype");
21       return NULL;
22     }
23   
24   if (pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL) != 0)
25     {
26       perror("pthread_setcancelstate");
27       return NULL;
28     }
29
30   pause();
31
32   pthread_cleanup_pop(0);
33   pthread_cleanup_pop(0);
34
35   return NULL;
36 }
37
38 int main(int argc, char **argv)
39 {
40   pthread_t tid;
41   void *result;
42   
43   if (pthread_create(&tid, NULL, thread_main, NULL) != 0)
44     {
45       perror("pthread_create");
46       exit(1);
47     }
48
49   sleep(1);
50
51   if (pthread_cancel(tid) != 0)
52     {
53       perror("pthread_cancel");
54       exit(1);
55     }
56
57   if (pthread_join(tid, &result) != 0)
58     {
59       perror("pthread_join");
60       exit(1);
61     }
62
63   printf("result is %s\n", result == PTHREAD_CANCELED ? "correct" : "incorrect");
64   
65   exit(0);
66 }