(root)/
glibc-2.38/
sysdeps/
pthread/
tst-basic2.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  #include <pthread.h>
      19  #include <stdio.h>
      20  #include <stdint.h>
      21  #include <stdlib.h>
      22  #include <unistd.h>
      23  
      24  
      25  #define N 20
      26  
      27  static pthread_t th[N];
      28  static pthread_mutex_t lock[N];
      29  
      30  
      31  static void *tf (void *a)
      32  {
      33    uintptr_t idx = (uintptr_t) a;
      34  
      35    pthread_mutex_lock (&lock[idx]);
      36  
      37    return pthread_equal (pthread_self (), th[idx]) ? NULL : (void *) 1l;
      38  }
      39  
      40  
      41  int
      42  do_test (void)
      43  {
      44    if (pthread_equal (pthread_self (), pthread_self ()) == 0)
      45      {
      46        puts ("pthread_equal (pthread_self (), pthread_self ()) failed");
      47        exit (1);
      48      }
      49  
      50    pthread_attr_t at;
      51  
      52    if (pthread_attr_init (&at) != 0)
      53      {
      54        puts ("attr_init failed");
      55        return 1;
      56      }
      57  
      58    if (pthread_attr_setstacksize (&at, 1 * 1024 * 1024) != 0)
      59      {
      60        puts ("attr_setstacksize failed");
      61        return 1;
      62      }
      63  
      64    int i;
      65    for (i = 0; i < N; ++i)
      66      {
      67        if (pthread_mutex_init (&lock[i], NULL) != 0)
      68  	{
      69  	  puts ("mutex_init failed");
      70  	  exit (1);
      71  	}
      72  
      73        if (pthread_mutex_lock (&lock[i]) != 0)
      74  	{
      75  	  puts ("mutex_lock failed");
      76  	  exit (1);
      77  	}
      78  
      79        if (pthread_create (&th[i], &at, tf, (void *) (long int) i) != 0)
      80  	{
      81  	  puts ("create failed");
      82  	  exit (1);
      83  	}
      84  
      85        if (pthread_mutex_unlock (&lock[i]) != 0)
      86  	{
      87  	  puts ("mutex_unlock failed");
      88  	  exit (1);
      89  	}
      90  
      91        printf ("created thread %d\n", i);
      92      }
      93  
      94    if (pthread_attr_destroy (&at) != 0)
      95      {
      96        puts ("attr_destroy failed");
      97        return 1;
      98      }
      99  
     100    int result = 0;
     101    for (i = 0; i < N; ++i)
     102      {
     103        void *r;
     104        int e;
     105        if ((e = pthread_join (th[i], &r)) != 0)
     106  	{
     107  	  printf ("join failed: %d\n", e);
     108  	  _exit (1);
     109  	}
     110        else if (r != NULL)
     111  	result = 1;
     112      }
     113  
     114    return result;
     115  }
     116  
     117  
     118  #define TEST_FUNCTION do_test ()
     119  #include "../test-skeleton.c"