Initial revision
[kopensolaris-gnu/glibc.git] / nptl / tst-cond3.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 <stdio.h>
22 #include <stdlib.h>
23 #include <string.h>
24 #include <unistd.h>
25
26
27 /* Note that this test requires more than the standard.  It is
28    required that there are no spurious wakeups if only more readers
29    are added.  This is a reasonable demand.  */
30
31
32 static pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
33 static pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER;
34
35
36 #define N 10
37
38
39 static void *
40 tf (void *arg)
41 {
42   int i = (long int) arg;
43   int err;
44
45   /* Get the mutex.  */
46   err = pthread_mutex_lock (&mut);
47   if (err != 0)
48     {
49       printf ("child %d mutex_lock failed: %s\n", i, strerror (err));
50       exit (1);
51     }
52
53   /* This call should never return.  */
54   pthread_cond_wait (&cond, &mut);
55
56   /* We should never get here.  */
57   exit (1);
58
59   return NULL;
60 }
61
62
63 static int
64 do_test (void)
65 {
66   int err;
67   int i;
68
69   for (i = 0; i < N; ++i)
70     {
71       pthread_t th;
72
73       if (i != 0)
74         {
75           /* Release the mutex.  */
76           err = pthread_mutex_unlock (&mut);
77           if (err != 0)
78             {
79               printf ("mutex_unlock %d failed: %s\n", i, strerror (err));
80               return 1;
81             }
82         }
83
84       err = pthread_create (&th, NULL, tf, (void *) (long int) i);
85       if (err != 0)
86         {
87           printf ("create %d failed: %s\n", i, strerror (err));
88           return 1;
89         }
90
91       /* Get the mutex.  */
92       err = pthread_mutex_lock (&mut);
93       if (err != 0)
94         {
95           printf ("mutex_lock %d failed: %s\n", i, strerror (err));
96           return 1;
97         }
98     }
99
100   /* Set an alarm for 1 second.  The wrapper will expect this.  */
101   alarm (1);
102
103   /* This call should never return.  */
104   pthread_cond_wait (&cond, &mut);
105
106   puts ("cond_wait returned");
107   return 1;
108 }
109
110
111 #define EXPECTED_SIGNAL SIGALRM
112 #define TEST_FUNCTION do_test ()
113 #include "../test-skeleton.c"