]> rtime.felk.cvut.cz Git - l4.git/blob - l4/pkg/l4re-core/uclibc/lib/contrib/uclibc/test/nptl/tst-kill3.c
Update
[l4.git] / l4 / pkg / l4re-core / uclibc / lib / contrib / uclibc / test / nptl / tst-kill3.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 <signal.h>
22 #include <stdio.h>
23 #include <stdlib.h>
24 #include <unistd.h>
25 #include <sys/time.h>
26
27
28 static pthread_cond_t c = PTHREAD_COND_INITIALIZER;
29 static pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER;
30 static pthread_barrier_t b;
31
32
33 static void
34 handler (int sig)
35 {
36   write (1, "handler called\n", 15);
37   _exit (1);
38 }
39
40
41 static void *
42 tf (void *a)
43 {
44   /* Block SIGUSR1.  */
45   sigset_t ss;
46
47   sigemptyset (&ss);
48   sigaddset (&ss, SIGUSR1);
49   if (pthread_sigmask (SIG_BLOCK, &ss, NULL) != 0)
50     {
51       puts ("child: sigmask failed");
52       exit (1);
53     }
54
55   if (pthread_mutex_lock (&m) != 0)
56     {
57       puts ("child: mutex_lock failed");
58       exit (1);
59     }
60
61   int e = pthread_barrier_wait (&b);
62   if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD)
63     {
64       puts ("child: barrier_wait failed");
65       exit (1);
66     }
67
68   /* Compute timeout.  */
69   struct timeval tv;
70   (void) gettimeofday (&tv, NULL);
71   struct timespec ts;
72   TIMEVAL_TO_TIMESPEC (&tv, &ts);
73   /* Timeout: 1sec.  */
74   ts.tv_sec += 1;
75
76   /* This call should never return.  */
77   if (pthread_cond_timedwait (&c, &m, &ts) != ETIMEDOUT)
78     {
79       puts ("cond_timedwait didn't time out");
80       exit (1);
81     }
82
83   return NULL;
84 }
85
86
87 int
88 do_test (void)
89 {
90   pthread_t th;
91
92   struct sigaction sa;
93   sigemptyset (&sa.sa_mask);
94   sa.sa_flags = 0;
95   sa.sa_handler = handler;
96   if (sigaction (SIGUSR1, &sa, NULL) != 0)
97     {
98       puts ("sigaction failed");
99       exit (1);
100     }
101
102   if (pthread_barrier_init (&b, NULL, 2) != 0)
103     {
104       puts ("barrier_init failed");
105       exit (1);
106     }
107
108   if (pthread_create (&th, NULL, tf, NULL) != 0)
109     {
110       puts ("create failed");
111       exit (1);
112     }
113
114   int e = pthread_barrier_wait (&b);
115   if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD)
116     {
117       puts ("barrier_wait failed");
118       exit (1);
119     }
120
121   if (pthread_mutex_lock (&m) != 0)
122     {
123       puts ("mutex_lock failed");
124       exit (1);
125     }
126
127   /* Send the thread a signal which it has blocked.  */
128   if (pthread_kill (th, SIGUSR1) != 0)
129     {
130       puts ("kill failed");
131       exit (1);
132     }
133
134   if (pthread_mutex_unlock (&m) != 0)
135     {
136       puts ("mutex_unlock failed");
137       exit (1);
138     }
139
140   void *r;
141   if (pthread_join (th, &r) != 0)
142     {
143       puts ("join failed");
144       exit (1);
145     }
146   if (r != NULL)
147     {
148       puts ("return value wrong");
149       exit (1);
150     }
151
152   return 0;
153 }
154
155
156 #define TIMEOUT 5
157 #define TEST_FUNCTION do_test ()
158 #include "../test-skeleton.c"