(root)/
glibc-2.38/
sysdeps/
pthread/
tst-eintr2.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 <signal.h>
      21  #include <stdio.h>
      22  #include <stdlib.h>
      23  #include <string.h>
      24  #include <sys/time.h>
      25  #include <support/check.h>
      26  #include <support/timespec.h>
      27  #include <support/xtime.h>
      28  
      29  #include "eintr.c"
      30  
      31  
      32  static pthread_mutex_t m1 = PTHREAD_MUTEX_INITIALIZER;
      33  static pthread_mutex_t m2 = PTHREAD_MUTEX_INITIALIZER;
      34  
      35  
      36  static void *
      37  tf1 (void *arg)
      38  {
      39    struct timespec ts = timespec_add (xclock_now (CLOCK_REALTIME),
      40                                       make_timespec (10000, 0));
      41  
      42    /* This call must never return.  */
      43    int e = pthread_mutex_timedlock (&m1, &ts);
      44    char buf[100];
      45    printf ("tf1: mutex_timedlock returned: %s\n",
      46  	  strerror_r (e, buf, sizeof (buf)));
      47  
      48    exit (1);
      49  }
      50  
      51  
      52  static void *
      53  tf2 (void *arg)
      54  {
      55    while (1)
      56      {
      57        TEST_COMPARE (pthread_mutex_lock (&m2), 0);
      58        TEST_COMPARE (pthread_mutex_unlock (&m2), 0);
      59  
      60        struct timespec ts = { .tv_sec = 0, .tv_nsec = 10000000 };
      61        nanosleep (&ts, NULL);
      62      }
      63    return NULL;
      64  }
      65  
      66  
      67  static int
      68  do_test (void)
      69  {
      70    TEST_COMPARE (pthread_mutex_lock (&m1), 0);
      71  
      72    setup_eintr (SIGUSR1, NULL);
      73  
      74    char buf[100];
      75    xpthread_create (NULL, tf1, NULL);
      76    xpthread_create (NULL, tf2, NULL);
      77  
      78    delayed_exit (3);
      79    /* This call must never return.  */
      80    int e = pthread_mutex_lock (&m1);
      81    printf ("main: mutex_lock returned: %s\n",
      82  	  strerror_r (e, buf, sizeof (buf)));
      83  
      84    return 1;
      85  }
      86  
      87  #include <support/test-driver.c>