(root)/
glibc-2.38/
sysdeps/
pthread/
tst-cond11.c
       1  /* Copyright (C) 2003-2023 Free Software Foundation, Inc.
       2     This file is part of the GNU C Library.
       3  
       4     The GNU C Library is free software; you can redistribute it and/or
       5     modify it under the terms of the GNU Lesser General Public
       6     License as published by the Free Software Foundation; either
       7     version 2.1 of the License, or (at your option) any later version.
       8  
       9     The GNU C Library is distributed in the hope that it will be useful,
      10     but WITHOUT ANY WARRANTY; without even the implied warranty of
      11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      12     Lesser General Public License for more details.
      13  
      14     You should have received a copy of the GNU Lesser General Public
      15     License along with the GNU C Library; if not, see
      16     <https://www.gnu.org/licenses/>.  */
      17  
      18  #include <errno.h>
      19  #include <pthread.h>
      20  #include <stdio.h>
      21  #include <time.h>
      22  #include <unistd.h>
      23  #include <support/check.h>
      24  #include <support/test-driver.h>
      25  #include <support/timespec.h>
      26  #include <support/xthread.h>
      27  #include <support/xtime.h>
      28  
      29  /* A bogus clock value that tells run_test to use pthread_cond_timedwait
      30     rather than pthread_condclockwait.  */
      31  #define CLOCK_USE_ATTR_CLOCK (-1)
      32  
      33  #if defined _POSIX_CLOCK_SELECTION && _POSIX_CLOCK_SELECTION >= 0
      34  static int
      35  run_test (clockid_t attr_clock, clockid_t wait_clock)
      36  {
      37    pthread_condattr_t condattr;
      38    pthread_cond_t cond;
      39    pthread_mutexattr_t mutattr;
      40    pthread_mutex_t mut;
      41  
      42    verbose_printf ("attr_clock = %d\n", (int) attr_clock);
      43  
      44    TEST_COMPARE (pthread_condattr_init (&condattr), 0);
      45    TEST_COMPARE (pthread_condattr_setclock (&condattr, attr_clock), 0);
      46  
      47    clockid_t attr_clock_read;
      48    TEST_COMPARE (pthread_condattr_getclock (&condattr, &attr_clock_read), 0);
      49    TEST_COMPARE (attr_clock, attr_clock_read);
      50  
      51    TEST_COMPARE (pthread_cond_init (&cond, &condattr), 0);
      52    TEST_COMPARE (pthread_condattr_destroy (&condattr), 0);
      53  
      54    xpthread_mutexattr_init (&mutattr);
      55    xpthread_mutexattr_settype (&mutattr, PTHREAD_MUTEX_ERRORCHECK);
      56    xpthread_mutex_init (&mut, &mutattr);
      57    xpthread_mutexattr_destroy (&mutattr);
      58  
      59    xpthread_mutex_lock (&mut);
      60    TEST_COMPARE (pthread_mutex_lock (&mut), EDEADLK);
      61  
      62    struct timespec ts_timeout;
      63    xclock_gettime (wait_clock == CLOCK_USE_ATTR_CLOCK ? attr_clock : wait_clock,
      64                    &ts_timeout);
      65  
      66    /* Wait one second.  */
      67    ++ts_timeout.tv_sec;
      68  
      69    if (wait_clock == CLOCK_USE_ATTR_CLOCK) {
      70      TEST_COMPARE (pthread_cond_timedwait (&cond, &mut, &ts_timeout), ETIMEDOUT);
      71      TEST_TIMESPEC_BEFORE_NOW (ts_timeout, attr_clock);
      72    } else {
      73      TEST_COMPARE (pthread_cond_clockwait (&cond, &mut, wait_clock, &ts_timeout),
      74                    ETIMEDOUT);
      75      TEST_TIMESPEC_BEFORE_NOW (ts_timeout, wait_clock);
      76    }
      77  
      78    xpthread_mutex_unlock (&mut);
      79    xpthread_mutex_destroy (&mut);
      80    TEST_COMPARE (pthread_cond_destroy (&cond), 0);
      81  
      82    return 0;
      83  }
      84  #endif
      85  
      86  
      87  static int
      88  do_test (void)
      89  {
      90  #if !defined _POSIX_CLOCK_SELECTION || _POSIX_CLOCK_SELECTION == -1
      91  
      92    FAIL_UNSUPPORTED ("_POSIX_CLOCK_SELECTION not supported, test skipped");
      93  
      94  #else
      95  
      96    run_test (CLOCK_REALTIME, CLOCK_USE_ATTR_CLOCK);
      97  
      98  # if defined _POSIX_MONOTONIC_CLOCK && _POSIX_MONOTONIC_CLOCK >= 0
      99  #  if _POSIX_MONOTONIC_CLOCK == 0
     100    int e = sysconf (_SC_MONOTONIC_CLOCK);
     101    if (e < 0)
     102      puts ("CLOCK_MONOTONIC not supported");
     103    else if (e == 0)
     104        FAIL_RET ("sysconf (_SC_MONOTONIC_CLOCK) must not return 0");
     105    else
     106  #  endif
     107      {
     108        run_test (CLOCK_MONOTONIC, CLOCK_USE_ATTR_CLOCK);
     109        run_test (CLOCK_REALTIME, CLOCK_MONOTONIC);
     110        run_test (CLOCK_MONOTONIC, CLOCK_MONOTONIC);
     111        run_test (CLOCK_MONOTONIC, CLOCK_REALTIME);
     112      }
     113  # else
     114    puts ("_POSIX_MONOTONIC_CLOCK not defined");
     115  # endif
     116  
     117    return 0;
     118  #endif
     119  }
     120  
     121  #include <support/test-driver.c>