diff --git a/nptl/ChangeLog b/nptl/ChangeLog index 60c6bc2e83..a21ecfb0a3 100644 --- a/nptl/ChangeLog +++ b/nptl/ChangeLog @@ -1,3 +1,10 @@ +2003-02-08 Ulrich Drepper + + * tst-cond2.c: Rearrange code to not rely on behavior undefined + according to POSIX. + + * tst-basic2.c (do_test): Lock mutex before creating the thread. + 2003-02-07 Ulrich Drepper * sysdeps/x86_64/tls.h: Remove unnecessary macros, left over from x86. diff --git a/nptl/tst-basic2.c b/nptl/tst-basic2.c index ffb19289b8..9bc20602d6 100644 --- a/nptl/tst-basic2.c +++ b/nptl/tst-basic2.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2002 Free Software Foundation, Inc. +/* Copyright (C) 2002, 2003 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 2002. @@ -58,6 +58,12 @@ do_test (void) exit (1); } + if (pthread_mutex_lock (&lock[i]) != 0) + { + puts ("mutex_lock failed"); + exit (1); + } + if (pthread_create (&th[i], NULL, tf, (void *) i) != 0) { puts ("create failed"); diff --git a/nptl/tst-cond2.c b/nptl/tst-cond2.c index d1f3d0fd38..2610a6ad8c 100644 --- a/nptl/tst-cond2.c +++ b/nptl/tst-cond2.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2002 Free Software Foundation, Inc. +/* Copyright (C) 2002, 2003 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 2002. @@ -26,6 +26,8 @@ static pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER; static pthread_cond_t cond = PTHREAD_COND_INITIALIZER; +static pthread_mutex_t syncm = PTHREAD_MUTEX_INITIALIZER; + static void * tf (void *a) @@ -33,6 +35,18 @@ tf (void *a) int i = (long int) a; int err; + printf ("child %d: lock\n", i); + + err = pthread_mutex_lock (&mut); + if (err != 0) + error (EXIT_FAILURE, err, "locking in child failed"); + + printf ("child %d: unlock sync\n", i); + + err = pthread_mutex_unlock (&syncm); + if (err != 0) + error (EXIT_FAILURE, err, "child %d: unlock[1] failed", i); + printf ("child %d: wait\n", i); err = pthread_cond_wait (&cond, &mut); @@ -43,7 +57,7 @@ tf (void *a) err = pthread_mutex_unlock (&mut); if (err != 0) - error (EXIT_FAILURE, err, "child %d: unlock failed", i); + error (EXIT_FAILURE, err, "child %d: unlock[2] failed", i); printf ("child %d: done\n", i); @@ -65,7 +79,7 @@ do_test (void) puts ("first lock"); - err = pthread_mutex_lock (&mut); + err = pthread_mutex_lock (&syncm); if (err != 0) error (EXIT_FAILURE, err, "initial locking failed"); @@ -80,16 +94,18 @@ do_test (void) printf ("wait for child %d\n", i); /* Lock and thereby wait for the child to start up and get the - conditional variable. */ - pthread_mutex_lock (&mut); + mutex for the conditional variable. */ + pthread_mutex_lock (&syncm); + /* Unlock right away. Yes, we can use barriers but then we + would test more functionality here. */ + pthread_mutex_unlock (&syncm); } - puts ("final unlock"); + puts ("get lock outselves"); - /* Unlock in preparation of the broadcast. */ - err = pthread_mutex_unlock (&mut); + err = pthread_mutex_lock (&mut); if (err != 0) - error (EXIT_FAILURE, err, "parent: unlock failed"); + error (EXIT_FAILURE, err, "mut locking failed"); puts ("broadcast"); @@ -98,6 +114,10 @@ do_test (void) if (err != 0) error (EXIT_FAILURE, err, "parent: broadcast failed"); + err = pthread_mutex_unlock (&mut); + if (err != 0) + error (EXIT_FAILURE, err, "mut unlocking failed"); + /* Join all threads. */ for (i = 0; i < N; ++i) {