75d6c0de665d70ef65e6d0e64bcb5754998d2a07
[kopensolaris-gnu/glibc.git] / linuxthreads / tst-cancel.c
1 /* Tests for cancelation handling.  */
2
3 #include <pthread.h>
4 #include <stdio.h>
5 #include <stdlib.h>
6 #include <string.h>
7 #include <unistd.h>
8 #include <sys/stat.h>
9
10 int fd;
11
12 pthread_barrier_t bar;
13
14
15 static void
16 cleanup (void *arg)
17 {
18   int nr = (int) (long int) arg;
19   char s[30];
20   char *cp = stpcpy (s, "cleanup ");
21   *cp++ = '0' + nr;
22   *cp++ = '\n';
23   __libc_write (fd, s, cp - s);
24 }
25
26
27 static void *
28 t1 (void *arg)
29 {
30   pthread_cleanup_push (cleanup, (void *) (long int) 1);
31   return NULL;
32   pthread_cleanup_pop (0);
33 }
34
35
36 static void
37 inner (int a)
38 {
39   pthread_cleanup_push (cleanup, (void *) (long int) a);
40   if (a)
41     return;
42   pthread_cleanup_pop (0);
43 }
44
45
46 static void *
47 t2 (void *arg)
48 {
49   pthread_cleanup_push (cleanup, (void *) (long int) 2);
50   inner ((int) (long int) arg);
51   return NULL;
52   pthread_cleanup_pop (0);
53 }
54
55
56 static void *
57 t3 (void *arg)
58 {
59   pthread_cleanup_push (cleanup, (void *) (long int) 4);
60   inner ((int) (long int) arg);
61   pthread_exit (NULL);
62   pthread_cleanup_pop (0);
63 }
64
65
66 int
67 main (void)
68 {
69   pthread_t td;
70   int err;
71   char tmp[] = "thtstXXXXXX";
72   struct stat64 st;
73   int result = 0;
74
75   fd = mkstemp (tmp);
76   if (fd == -1)
77     {
78       printf ("cannot create temporary file: %m");
79       exit (1);
80     }
81   unlink (tmp);
82
83   err = pthread_barrier_init (&bar, NULL, 2);
84   if (err != 0 )
85     {
86       printf ("cannot create barrier: %s\n", strerror (err));
87       exit (1);
88     }
89
90   err = pthread_create (&td, NULL, t1, NULL);
91   if (err != 0)
92     {
93       printf ("cannot create thread t1: %s\n", strerror (err));
94       exit (1);
95     }
96
97   err = pthread_join (td, NULL);
98   if (err != 0)
99     {
100       printf ("cannot join thread: %s\n", strerror (err));
101       exit (1);
102     }
103
104   err = pthread_create (&td, NULL, t2, (void *) 3);
105   if (err != 0)
106     {
107       printf ("cannot create thread t2: %s\n", strerror (err));
108       exit (1);
109     }
110
111   err = pthread_join (td, NULL);
112   if (err != 0)
113     {
114       printf ("cannot join thread: %s\n", strerror (err));
115       exit (1);
116     }
117
118   err = pthread_create (&td, NULL, t3, (void *) 5);
119   if (err != 0)
120     {
121       printf ("cannot create thread t3: %s\n", strerror (err));
122       exit (1);
123     }
124
125   err = pthread_join (td, NULL);
126   if (err != 0)
127     {
128       printf ("cannot join thread: %s\n", strerror (err));
129       exit (1);
130     }
131
132   if (fstat64 (fd, &st) < 0)
133     {
134       printf ("cannot stat temporary file: %m\n");
135       result = 1;
136     }
137   else if (st.st_size != 0)
138     {
139       char buf[512];
140       puts ("some cleanup handlers ran:");
141       fflush (stdout);
142       while (1)
143         {
144           ssize_t n = read (fd, buf, sizeof buf);
145           if (n <= 0)
146             break;
147           write (STDOUT_FILENO, buf, n);
148         }
149       result = 1;
150     }
151
152   return result;
153 }