Initial revision
[kopensolaris-gnu/glibc.git] / nptl / tst-cancel3.c
1 /* Copyright (C) 2002 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
3    Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
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, write to the Free
17    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
18    02111-1307 USA.  */
19
20 #include <pthread.h>
21 #include <signal.h>
22 #include <stdio.h>
23 #include <unistd.h>
24
25
26 static int fd[2];
27
28
29 static void *
30 tf (void *arg)
31 {
32   char buf[100];
33
34   if (read (fd[0], buf, sizeof (buf)) == sizeof (buf))
35     {
36       puts ("read succeeded");
37       return (void *) 1l;
38     }
39
40   return NULL;
41 }
42
43
44 static int
45 do_test (void)
46 {
47   pthread_t th;
48   void *r;
49   struct sigaction sa;
50
51   sa.sa_handler = SIG_IGN;
52   sigemptyset (&sa.sa_mask);
53   sa.sa_flags = 0;
54
55   if (sigaction (SIGPIPE, &sa, NULL) != 0)
56     {
57       puts ("sigaction failed");
58       return 1;
59     }
60
61   if (pipe (fd) != 0)
62     {
63       puts ("pipe failed");
64       return 1;
65     }
66
67   if (pthread_create (&th, NULL, tf, NULL) != 0)
68     {
69       puts ("create failed");
70       return 1;
71     }
72
73   if (pthread_cancel (th) != 0)
74     {
75       puts ("cancel failed");
76       return 1;
77     }
78
79   /* This will cause the read in the child to return.  */
80   close (fd[0]);
81
82   if (pthread_join (th, &r) != 0)
83     {
84       puts ("join failed");
85       return 1;
86     }
87
88   if (r != PTHREAD_CANCELED)
89     {
90       puts ("result is wrong");
91       return 1;
92     }
93
94   return 0;
95 }
96
97 #define TEST_FUNCTION do_test ()
98 #include "../test-skeleton.c"