OSDN Git Service

h8300: O_DIRECT and O_DIRECTIRY swapping.
[uclinux-h8/uclibc-ng.git] / test / nptl / tst-join5.c
1 /* Copyright (C) 2003 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
3    Contributed by Ulrich Drepper <drepper@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
24
25 static void *
26 tf1 (void *arg)
27 {
28   pthread_join ((pthread_t) arg, NULL);
29
30   puts ("1st join returned");
31
32   return (void *) 1l;
33 }
34
35
36 static void *
37 tf2 (void *arg)
38 {
39   int a;
40   a = pthread_join ((pthread_t) arg, NULL);
41
42   puts ("2nd join returned");
43   printf("a = %i\n", a);
44
45   return (void *) 1l;
46 }
47
48
49 static int
50 do_test (void)
51 {
52   pthread_t th;
53
54   int err = pthread_join (pthread_self (), NULL);
55   if (err == 0)
56     {
57       puts ("1st circular join succeeded");
58       exit (1);
59     }
60   if (err != EDEADLK)
61     {
62       printf ("1st circular join %d, not EDEADLK\n", err);
63       exit (1);
64     }
65
66   if (pthread_create (&th, NULL, tf1, (void *) pthread_self ()) != 0)
67     {
68       puts ("1st create failed");
69       exit (1);
70     }
71
72   if (pthread_cancel (th) != 0)
73     {
74       puts ("cannot cancel 1st thread");
75       exit (1);
76     }
77
78   void *r;
79   err = pthread_join (th, &r);
80   if (err != 0)
81     {
82       printf ("cannot join 1st thread: %d\n", err);
83       exit (1);
84     }
85   if (r != PTHREAD_CANCELED)
86     {
87       puts ("1st thread not canceled");
88       exit (1);
89     }
90
91   err = pthread_join (pthread_self (), NULL);
92   if (err == 0)
93     {
94       puts ("2nd circular join succeeded");
95       exit (1);
96     }
97   if (err != EDEADLK)
98     {
99       printf ("2nd circular join %d, not EDEADLK\n", err);
100       exit (1);
101     }
102
103   if (pthread_create (&th, NULL, tf2, (void *) pthread_self ()) != 0)
104     {
105       puts ("2nd create failed");
106       exit (1);
107     }
108
109   if (pthread_cancel (th) != 0)
110     {
111       puts ("cannot cancel 2nd thread");
112       exit (1);
113     }
114
115   if (pthread_join (th, &r) != 0)
116     {
117       puts ("cannot join 2nd thread");
118       exit (1);
119     }
120   if (r != PTHREAD_CANCELED)
121     {
122       puts ("2nd thread not canceled");
123       exit (1);
124     }
125
126   err = pthread_join (pthread_self (), NULL);
127   if (err == 0)
128     {
129       puts ("2nd circular join succeeded");
130       exit (1);
131     }
132   if (err != EDEADLK)
133     {
134       printf ("2nd circular join %d, not EDEADLK\n", err);
135       exit (1);
136     }
137
138   exit (0);
139 }
140
141 #define TEST_FUNCTION do_test ()
142 #include "../test-skeleton.c"