(root)/
glibc-2.38/
nptl/
tst-rwlock3.c
       1  /* Copyright (C) 2002-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  /* This test case checks more than standard compliance.  An
      19     implementation may provide this service but it is not required to
      20     do so.  */
      21  
      22  #include <errno.h>
      23  #include <pthread.h>
      24  #include <stdio.h>
      25  
      26  
      27  static int
      28  do_test (void)
      29  {
      30    pthread_rwlock_t r;
      31    int e;
      32  
      33    if (pthread_rwlock_init (&r, NULL) != 0)
      34      {
      35        puts ("rwlock_init failed");
      36        return 1;
      37      }
      38    puts ("rwlock_init succeeded");
      39  
      40    if (pthread_rwlock_trywrlock (&r) != 0)
      41      {
      42        puts ("rwlock_trywrlock on unlocked rwlock failed");
      43        return 1;
      44      }
      45    puts ("rwlock_trywrlock on unlocked rwlock succeeded");
      46  
      47    e = pthread_rwlock_rdlock (&r);
      48    if (e == 0)
      49      {
      50        puts ("rwlock_rdlock on rwlock with writer succeeded");
      51        return 1;
      52      }
      53    if (e != EDEADLK)
      54      {
      55        puts ("rwlock_rdlock on rwlock with writer failed != EDEADLK");
      56        return 1;
      57      }
      58    puts ("rwlock_rdlock on rwlock with writer failed with EDEADLK");
      59  
      60    e = pthread_rwlock_wrlock (&r);
      61    if (e == 0)
      62      {
      63        puts ("rwlock_wrlock on rwlock with writer succeeded");
      64        return 1;
      65      }
      66    if (e != EDEADLK)
      67      {
      68        puts ("rwlock_wrlock on rwlock with writer failed != EDEADLK");
      69        return 1;
      70      }
      71    puts ("rwlock_wrlock on rwlock with writer failed with EDEADLK");
      72  
      73    if (pthread_rwlock_unlock (&r) != 0)
      74      {
      75        puts ("rwlock_unlock failed");
      76        return 1;
      77      }
      78    puts ("rwlock_unlock succeeded");
      79  
      80    if (pthread_rwlock_destroy (&r) != 0)
      81      {
      82        puts ("rwlock_destroy failed");
      83        return 1;
      84      }
      85    puts ("rwlock_destroy succeeded");
      86  
      87    return 0;
      88  }
      89  
      90  #define TEST_FUNCTION do_test ()
      91  #include "../test-skeleton.c"