Fix ChangeLogs
[platform/upstream/glibc.git] / nptl / tst-cancel22.c
1 /* Copyright (C) 2003-2013 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
3    Contributed by Jakub Jelinek <jakub@redhat.com>, 2003.
4
5    The GNU C Library is free software; you can redistribute it and/or
6    modify it under the terms of the GNU Lesser General Public
7    License as published by the Free Software Foundation; either
8    version 2.1 of the License, or (at your option) any later version.
9
10    The GNU C Library is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13    Lesser General Public License for more details.
14
15    You should have received a copy of the GNU Lesser General Public
16    License along with the GNU C Library; if not, see
17    <http://www.gnu.org/licenses/>.  */
18
19 #include <errno.h>
20 #include <pthread.h>
21 #include <stdio.h>
22 #include <stdlib.h>
23 #include <unistd.h>
24
25 pthread_barrier_t b;
26 int seen;
27
28 static void *
29 tf (void *arg)
30 {
31   int old;
32   int r = pthread_setcancelstate (PTHREAD_CANCEL_DISABLE, &old);
33   if (r != 0)
34     {
35       puts ("setcancelstate failed");
36       exit (1);
37     }
38
39   r = pthread_barrier_wait (&b);
40   if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD)
41     {
42       puts ("barrier_wait failed");
43       exit (1);
44     }
45
46   for (int i = 0; i < 10; ++i)
47     {
48       struct timespec ts = { .tv_sec = 0, .tv_nsec = 100000000 };
49       TEMP_FAILURE_RETRY (nanosleep (&ts, &ts));
50     }
51
52   seen = 1;
53   pthread_setcancelstate (old, NULL);
54
55   struct timespec ts = { .tv_sec = 0, .tv_nsec = 100000000 };
56   TEMP_FAILURE_RETRY (nanosleep (&ts, &ts));
57
58   exit (1);
59 }
60
61
62 static int
63 do_test (void)
64 {
65   if (pthread_barrier_init (&b, NULL, 2) != 0)
66    {
67      puts ("barrier init failed");
68      return 1;
69    }
70
71   pthread_t th;
72   if (pthread_create (&th, NULL, tf, NULL) != 0)
73     {
74       puts ("thread creation failed");
75       return 1;
76     }
77
78   int r = pthread_barrier_wait (&b);
79   if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD)
80     {
81       puts ("barrier_wait failed");
82       return 1;
83     }
84
85   if (pthread_cancel (th) != 0)
86     {
87       puts ("cancel failed");
88       return 1;
89     }
90
91   void *status;
92   if (pthread_join (th, &status) != 0)
93     {
94       puts ("join failed");
95       return 1;
96     }
97   if (status != PTHREAD_CANCELED)
98     {
99       puts ("thread not canceled");
100       return 1;
101     }
102
103   if (pthread_barrier_destroy (&b) != 0)
104     {
105       puts ("barrier_destroy failed");
106       return 1;
107     }
108
109   if (seen != 1)
110     {
111       puts ("thread cancelled when PTHREAD_CANCEL_DISABLED");
112       return 1;
113     }
114
115   return 0;
116 }
117
118 #define TIMEOUT 5
119 #define TEST_FUNCTION do_test ()
120 #include "../test-skeleton.c"