(root)/
glibc-2.38/
sysdeps/
pthread/
tst-join1.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 <stdlib.h>
      21  
      22  
      23  static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
      24  
      25  
      26  static void *
      27  tf (void *arg)
      28  {
      29    pthread_t mh = (pthread_t) arg;
      30    void *result;
      31  
      32    if (pthread_mutex_unlock (&lock) != 0)
      33      {
      34        puts ("unlock failed");
      35        exit (1);
      36      }
      37  
      38    if (pthread_join (mh, &result) != 0)
      39      {
      40        puts ("join failed");
      41        exit (1);
      42      }
      43  
      44    if (result != (void *) 42l)
      45      {
      46        printf ("result wrong: expected %p, got %p\n", (void *) 42, result);
      47        exit (1);
      48      }
      49  
      50    exit (0);
      51  }
      52  
      53  
      54  static int
      55  do_test (void)
      56  {
      57    pthread_t th;
      58  
      59    if (pthread_mutex_lock (&lock) != 0)
      60      {
      61        puts ("1st lock failed");
      62        exit (1);
      63      }
      64  
      65    if (pthread_create (&th, NULL, tf, (void *) pthread_self ()) != 0)
      66      {
      67        puts ("create failed");
      68        exit (1);
      69      }
      70  
      71    if (pthread_mutex_lock (&lock) != 0)
      72      {
      73        puts ("2nd lock failed");
      74        exit (1);
      75      }
      76  
      77    pthread_exit ((void *) 42);
      78  }
      79  
      80  #define TEST_FUNCTION do_test ()
      81  #include "../test-skeleton.c"