1 /* Copyright (C) 2002-2022 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
3 
4    The GNU C Library is free software; you can redistribute it and/or
5    modify it under the terms of the GNU Lesser General Public
6    License as published by the Free Software Foundation; either
7    version 2.1 of the License, or (at your option) any later version.
8 
9    The GNU C Library is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12    Lesser General Public License for more details.
13 
14    You should have received a copy of the GNU Lesser General Public
15    License along with the GNU C Library; if not, see
16    <https://www.gnu.org/licenses/>.  */
17 
18 #include <pthread.h>
19 #include <signal.h>
20 #include <stdio.h>
21 #include <unistd.h>
22 
23 
24 static int fd[2];
25 
26 
27 static void *
tf(void * arg)28 tf (void *arg)
29 {
30   /* The buffer size must be larger than the pipe size so that the
31      write blocks.  */
32   char buf[100000];
33 
34   while (write (fd[1], buf, sizeof (buf)) > 0);
35 
36   return (void *) 42l;
37 }
38 
39 
40 static int
do_test(void)41 do_test (void)
42 {
43   pthread_t th;
44   void *r;
45   struct sigaction sa;
46 
47   sa.sa_handler = SIG_IGN;
48   sigemptyset (&sa.sa_mask);
49   sa.sa_flags = 0;
50 
51   if (sigaction (SIGPIPE, &sa, NULL) != 0)
52     {
53       puts ("sigaction failed");
54       return 1;
55     }
56 
57   if (pipe (fd) != 0)
58     {
59       puts ("pipe failed");
60       return 1;
61     }
62 
63   if (pthread_create (&th, NULL, tf, NULL) != 0)
64     {
65       puts ("create failed");
66       return 1;
67     }
68 
69   if (pthread_cancel (th) != 0)
70     {
71       puts ("cancel failed");
72       return 1;
73     }
74 
75   /* This will cause the write in the child to return.  */
76   close (fd[0]);
77 
78   if (pthread_join (th, &r) != 0)
79     {
80       puts ("join failed");
81       return 1;
82     }
83 
84   if (r != PTHREAD_CANCELED)
85     {
86       printf ("result is wrong: expected %p, got %p\n", PTHREAD_CANCELED, r);
87       return 1;
88     }
89 
90   return 0;
91 }
92 
93 #define TEST_FUNCTION do_test ()
94 #include "../test-skeleton.c"
95