@@ -, +, @@ --- nptl/Makefile | 1 + nptl/tst-condpi1.c | 123 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 124 insertions(+), 0 deletions(-) create mode 100644 nptl/tst-condpi1.c --- a/nptl/Makefile +++ a/nptl/Makefile @@ -209,6 +209,7 @@ tests = tst-typesizes \ tst-cond8 tst-cond9 tst-cond10 tst-cond11 tst-cond12 tst-cond13 \ tst-cond14 tst-cond15 tst-cond16 tst-cond17 tst-cond18 tst-cond19 \ tst-cond20 tst-cond21 tst-cond22 tst-cond23 \ + tst-condpi1 \ tst-robust1 tst-robust2 tst-robust3 tst-robust4 tst-robust5 \ tst-robust6 tst-robust7 tst-robust8 tst-robust9 \ tst-robustpi1 tst-robustpi2 tst-robustpi3 tst-robustpi4 tst-robustpi5 \ --- a/nptl/tst-condpi1.c +++ a/nptl/tst-condpi1.c @@ -0,0 +1,123 @@ +/* Copyright (C) 2002 Free Software Foundation, Inc. + Copyright (C) International Business Machines Corp., 2010 + This file is part of the GNU C Library. + Contributed by Darren Hart , 2010 + Based on test-cond1.c by Ulrich Drepper , 2002. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include +#include +#include +#include + + +static pthread_cond_t cond; +static pthread_mutex_t mut; + + +static void * +tf (void *p) +{ + int err; + + err = pthread_mutex_lock (&mut); + if (err != 0) + error (EXIT_FAILURE, err, "child: cannot get mutex"); + + puts ("child: got mutex; signalling"); + + pthread_cond_signal (&cond); + + puts ("child: unlock"); + + err = pthread_mutex_unlock (&mut); + if (err != 0) + error (EXIT_FAILURE, err, "child: cannot unlock"); + + puts ("child: done"); + + return NULL; +} + + +static int +do_test (void) +{ + pthread_t th; + int err; + + pthread_mutexattr_t ma; + pthread_condattr_t ca; + + printf ("&cond = %p\n&mut = %p\n", &cond, &mut); + + puts ("parent: setup condvar"); + + err = pthread_condattr_init(&ca); + if (err != 0) + error (EXIT_FAILURE, err, "parent: failed to init condattr"); + err = pthread_condattr_setprotocol_np(&ca, PTHREAD_PRIO_INHERIT); + if (err != 0) + error (EXIT_FAILURE, err, "parent: failed to set condattr protocol"); + err = pthread_cond_init(&cond, &ca); + if (err != 0) + error (EXIT_FAILURE, err, "parent: failed to init condvar"); + + puts ("parent: setup mutex"); + + err = pthread_mutexattr_init(&ma); + if (err != 0) + error (EXIT_FAILURE, err, "parent: failed to init mutexattr"); + err = pthread_mutexattr_setprotocol(&ma, PTHREAD_PRIO_INHERIT); + if (err != 0) + error (EXIT_FAILURE, err, "parent: failed to set mutexattr protocol"); + err = pthread_mutex_init(&mut, &ma); + if (err != 0) + error (EXIT_FAILURE, err, "parent: failed to init mutex"); + + puts ("parent: get mutex"); + + err = pthread_mutex_lock (&mut); + if (err != 0) + error (EXIT_FAILURE, err, "parent: cannot get mutex"); + + puts ("parent: create child"); + + err = pthread_create (&th, NULL, tf, NULL); + if (err != 0) + error (EXIT_FAILURE, err, "parent: cannot create thread"); + + puts ("parent: wait for condition"); + + err = pthread_cond_wait (&cond, &mut); + if (err != 0) + error (EXIT_FAILURE, err, "parent: cannot wait fir signal"); + + puts ("parent: got signal"); + + err = pthread_join (th, NULL); + if (err != 0) + error (EXIT_FAILURE, err, "parent: failed to join"); + + puts ("done"); + + return 0; +} + + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" --