microblaze: Update libm-test-ulps
[jlayton/glibc.git] / nptl / tst-cond1.c
1 /* Copyright (C) 2002-2014 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, see
17    <http://www.gnu.org/licenses/>.  */
18
19 #include <error.h>
20 #include <pthread.h>
21 #include <stdio.h>
22 #include <stdlib.h>
23
24
25 static pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
26 static pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER;
27
28
29 static void *
30 tf (void *p)
31 {
32   int err;
33
34   err = pthread_mutex_lock (&mut);
35   if (err != 0)
36     error (EXIT_FAILURE, err, "child: cannot get mutex");
37
38   puts ("child: got mutex; signalling");
39
40   pthread_cond_signal (&cond);
41
42   puts ("child: unlock");
43
44   err = pthread_mutex_unlock (&mut);
45   if (err != 0)
46     error (EXIT_FAILURE, err, "child: cannot unlock");
47
48   puts ("child: done");
49
50   return NULL;
51 }
52
53
54 static int
55 do_test (void)
56 {
57   pthread_t th;
58   int err;
59
60   printf ("&cond = %p\n&mut = %p\n", &cond, &mut);
61
62   puts ("parent: get mutex");
63
64   err = pthread_mutex_lock (&mut);
65   if (err != 0)
66     error (EXIT_FAILURE, err, "parent: cannot get mutex");
67
68   puts ("parent: create child");
69
70   err = pthread_create (&th, NULL, tf, NULL);
71   if (err != 0)
72     error (EXIT_FAILURE, err, "parent: cannot create thread");
73
74   puts ("parent: wait for condition");
75
76   err = pthread_cond_wait (&cond, &mut);
77   if (err != 0)
78     error (EXIT_FAILURE, err, "parent: cannot wait fir signal");
79
80   puts ("parent: got signal");
81
82   err = pthread_join (th, NULL);
83   if (err != 0)
84     error (EXIT_FAILURE, err, "parent: failed to join");
85
86   puts ("done");
87
88   return 0;
89 }
90
91
92 #define TEST_FUNCTION do_test ()
93 #include "../test-skeleton.c"