(root)/
glibc-2.38/
nptl/
test-condattr-printers.c
       1  /* Helper program for testing the pthread_cond_t and pthread_condattr_t
       2     pretty printers.
       3  
       4     Copyright (C) 2016-2023 Free Software Foundation, Inc.
       5     This file is part of the GNU C Library.
       6  
       7     The GNU C Library is free software; you can redistribute it and/or
       8     modify it under the terms of the GNU Lesser General Public
       9     License as published by the Free Software Foundation; either
      10     version 2.1 of the License, or (at your option) any later version.
      11  
      12     The GNU C Library is distributed in the hope that it will be useful,
      13     but WITHOUT ANY WARRANTY; without even the implied warranty of
      14     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      15     Lesser General Public License for more details.
      16  
      17     You should have received a copy of the GNU Lesser General Public
      18     License along with the GNU C Library; if not, see
      19     <https://www.gnu.org/licenses/>.  */
      20  
      21  /* Keep the calls to the pthread_* functions on separate lines to make it easy
      22     to advance through the program using the gdb 'next' command.  */
      23  
      24  #include <time.h>
      25  #include <pthread.h>
      26  
      27  #define PASS 0
      28  #define FAIL 1
      29  
      30  static int condvar_reinit (pthread_cond_t *condvar,
      31  			   const pthread_condattr_t *attr);
      32  static int test_setclock (pthread_cond_t *condvar, pthread_condattr_t *attr);
      33  static int test_setpshared (pthread_cond_t *condvar, pthread_condattr_t *attr);
      34  
      35  /* Need these so we don't have lines longer than 79 chars.  */
      36  #define SET_SHARED(attr, shared) pthread_condattr_setpshared (attr, shared)
      37  
      38  int
      39  main (void)
      40  {
      41    pthread_cond_t condvar;
      42    pthread_condattr_t attr;
      43    int result = FAIL;
      44  
      45    if (pthread_condattr_init (&attr) == 0
      46        && pthread_cond_init (&condvar, NULL) == 0
      47        && test_setclock (&condvar, &attr) == PASS
      48        && test_setpshared (&condvar, &attr) == PASS)
      49      result = PASS;
      50    /* Else, one of the pthread_cond* functions failed.  */
      51  
      52    return result;
      53  }
      54  
      55  /* Destroys CONDVAR and re-initializes it using ATTR.  */
      56  static int
      57  condvar_reinit (pthread_cond_t *condvar, const pthread_condattr_t *attr)
      58  {
      59    int result = FAIL;
      60  
      61    if (pthread_cond_destroy (condvar) == 0
      62        && pthread_cond_init (condvar, attr) == 0)
      63      result = PASS;
      64  
      65    return result;
      66  }
      67  
      68  /* Tests setting the clock ID attribute.  */
      69  __attribute__ ((noinline))
      70  static int
      71  test_setclock (pthread_cond_t *condvar, pthread_condattr_t *attr)
      72  {
      73    int result = FAIL;
      74  
      75    if (pthread_condattr_setclock (attr, CLOCK_REALTIME) == 0 /* Set clock.  */
      76        && condvar_reinit (condvar, attr) == PASS)
      77      result = PASS;
      78  
      79    return result;
      80  }
      81  
      82  /* Tests setting whether the condvar can be shared between processes.  */
      83  static int
      84  test_setpshared (pthread_cond_t *condvar, pthread_condattr_t *attr)
      85  {
      86    int result = FAIL;
      87  
      88    if (SET_SHARED (attr, PTHREAD_PROCESS_SHARED) == 0 /* Set shared.  */
      89        && condvar_reinit (condvar, attr) == PASS
      90        && SET_SHARED (attr, PTHREAD_PROCESS_PRIVATE) == 0
      91        && condvar_reinit (condvar, attr) == PASS)
      92      result = PASS;
      93  
      94    return result;
      95  }