(root)/
glibc-2.38/
nptl/
tst-stack3.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  /* Test whether pthread_create/pthread_join with user defined stacks
      19     doesn't leak memory.
      20     NOTE: this tests functionality beyond POSIX.  In POSIX user defined
      21     stacks cannot be ever freed once used by pthread_create nor they can
      22     be reused for other thread.  */
      23  
      24  #include <limits.h>
      25  #include <mcheck.h>
      26  #include <pthread.h>
      27  #include <stdlib.h>
      28  #include <stdio.h>
      29  #include <string.h>
      30  #include <unistd.h>
      31  
      32  static int seen;
      33  
      34  static void *
      35  tf (void *p)
      36  {
      37    ++seen;
      38    return NULL;
      39  }
      40  
      41  static int
      42  do_test (void)
      43  {
      44    mtrace ();
      45  
      46    void *stack;
      47    int res = posix_memalign (&stack, getpagesize (), 4 * PTHREAD_STACK_MIN);
      48    if (res)
      49      {
      50        printf ("malloc failed %s\n", strerror (res));
      51        return 1;
      52      }
      53  
      54    pthread_attr_t attr;
      55    pthread_attr_init (&attr);
      56  
      57    int result = 0;
      58    res = pthread_attr_setstack (&attr, stack, 4 * PTHREAD_STACK_MIN);
      59    if (res)
      60      {
      61        printf ("pthread_attr_setstack failed %d\n", res);
      62        result = 1;
      63      }
      64  
      65    for (int i = 0; i < 16; ++i)
      66      {
      67        /* Create the thread.  */
      68        pthread_t th;
      69        res = pthread_create (&th, &attr, tf, NULL);
      70        if (res)
      71  	{
      72  	  printf ("pthread_create failed %d\n", res);
      73  	  result = 1;
      74  	}
      75        else
      76  	{
      77  	  res = pthread_join (th, NULL);
      78  	  if (res)
      79  	    {
      80  	      printf ("pthread_join failed %d\n", res);
      81  	      result = 1;
      82  	    }
      83  	}
      84      }
      85  
      86    pthread_attr_destroy (&attr);
      87  
      88    if (seen != 16)
      89      {
      90        printf ("seen %d != 16\n", seen);
      91        result = 1;
      92      }
      93  
      94    free (stack);
      95    return result;
      96  }
      97  
      98  #define TEST_FUNCTION do_test ()
      99  #include "../test-skeleton.c"