1#include <stdio.h>
2#include <stdlib.h>
3#include <pthread.h>
4#include <unistd.h>
5
6static void thread_cleanup(void *arg)
7{
8  printf("cleaning up 0x%lx\n", (long)arg);
9
10  return;
11}
12
13static 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
38int 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}
67