Initial revision
[kopensolaris-gnu/glibc.git] / nptl / tst-join3.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 <errno.h>
21 #include <pthread.h>
22 #include <stdio.h>
23 #include <stdlib.h>
24 #include <string.h>
25 #include <sys/time.h>
26
27
28 static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
29
30
31 static void *
32 tf (void *arg)
33 {
34   if (pthread_mutex_lock (&lock) != 0)
35     {
36       puts ("child: mutex_lock failed");
37       return NULL;
38     }
39
40   return (void *) 42l;
41 }
42
43
44 static int
45 do_test (void)
46 {
47   pthread_t th;
48
49   if (pthread_mutex_lock (&lock) != 0)
50     {
51       puts ("mutex_lock failed");
52       exit (1);
53     }
54
55   if (pthread_create (&th, NULL, tf, NULL) != 0)
56     {
57       puts ("mutex_create failed");
58       exit (1);
59     }
60
61   void *status;
62   struct timespec ts;
63   struct timeval tv;
64   (void) gettimeofday (&tv, NULL);
65   TIMEVAL_TO_TIMESPEC (&tv, &ts);
66   ts.tv_nsec += 200000000;
67   if (ts.tv_nsec >= 1000000000)
68     {
69       ts.tv_nsec -= 1000000000;
70       ++ts.tv_sec;
71     }
72   int val = pthread_timedjoin_np (th, &status, &ts);
73   if (val == 0)
74     {
75       puts ("1st timedjoin succeeded");
76       exit (1);
77     }
78   else if (val != ETIMEDOUT)
79     {
80       puts ("1st timedjoin didn't return ETIMEDOUT");
81       exit (1);
82     }
83
84   if (pthread_mutex_unlock (&lock) != 0)
85     {
86       puts ("mutex_unlock failed");
87       exit (1);
88     }
89
90   while (1)
91     {
92       (void) gettimeofday (&tv, NULL);
93       TIMEVAL_TO_TIMESPEC (&tv, &ts);
94       ts.tv_nsec += 200000000;
95       if (ts.tv_nsec >= 1000000000)
96         {
97           ts.tv_nsec -= 1000000000;
98           ++ts.tv_sec;
99         }
100
101       val = pthread_timedjoin_np (th, &status, &ts);
102       if (val == 0)
103         break;
104
105       if (val != ETIMEDOUT)
106         {
107           printf ("timedjoin returned %s (%d), expected only 0 or ETIMEDOUT\n",
108                   strerror (val), val);
109           exit (1);
110         }
111     }
112
113   if (status != (void *) 42l)
114     {
115       printf ("return value %p, expected %p\n", status, (void *) 42l);
116       exit (1);
117     }
118
119   return 0;
120 }
121
122 #define TEST_FUNCTION do_test ()
123 #include "../test-skeleton.c"