(root)/
glibc-2.38/
nptl/
pthread_attr_setstack.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 <errno.h>
      19  #include <limits.h>
      20  #include "pthreadP.h"
      21  #include <shlib-compat.h>
      22  
      23  
      24  #ifndef NEW_VERNUM
      25  # define NEW_VERNUM GLIBC_2_3_3
      26  #endif
      27  
      28  
      29  int
      30  __pthread_attr_setstack (pthread_attr_t *attr, void *stackaddr,
      31  			 size_t stacksize)
      32  {
      33    struct pthread_attr *iattr;
      34  
      35    iattr = (struct pthread_attr *) attr;
      36  
      37    /* Catch invalid sizes.  */
      38    int ret = check_stacksize_attr (stacksize);
      39    if (ret)
      40      return ret;
      41  
      42  #ifdef EXTRA_PARAM_CHECKS
      43    EXTRA_PARAM_CHECKS;
      44  #endif
      45  
      46    iattr->stacksize = stacksize;
      47  #if _STACK_GROWS_DOWN
      48    iattr->stackaddr = (char *) stackaddr + stacksize;
      49  #else
      50    iattr->stackaddr = (char *) stackaddr;
      51  #endif
      52    iattr->flags |= ATTR_FLAG_STACKADDR;
      53  
      54    return 0;
      55  }
      56  versioned_symbol (libc, __pthread_attr_setstack, pthread_attr_setstack,
      57  		  GLIBC_2_34);
      58  
      59  #if PTHREAD_STACK_MIN == 16384
      60  # if OTHER_SHLIB_COMPAT (libpthread, GLIBC_2_2, GLIBC_2_34)
      61  compat_symbol (libpthread, __pthread_attr_setstack, pthread_attr_setstack,
      62  	       GLIBC_2_2);
      63  # endif
      64  #else /* PTHREAD_STACK_MIN != 16384 */
      65  # if OTHER_SHLIB_COMPAT (libpthread, NEW_VERNUM, GLIBC_2_34)
      66  compat_symbol (libpthread, __pthread_attr_setstack, pthread_attr_setstack,
      67  	       NEW_VERNUM);
      68  # endif
      69  
      70  # if OTHER_SHLIB_COMPAT (libpthread, GLIBC_2_2, NEW_VERNUM)
      71  int
      72  __old_pthread_attr_setstack (pthread_attr_t *attr, void *stackaddr,
      73  			     size_t stacksize)
      74  {
      75    struct pthread_attr *iattr;
      76  
      77    iattr = (struct pthread_attr *) attr;
      78  
      79    /* Catch invalid sizes.  */
      80    if (stacksize < 16384)
      81      return EINVAL;
      82  
      83  #  ifdef EXTRA_PARAM_CHECKS
      84    EXTRA_PARAM_CHECKS;
      85  #  endif
      86  
      87    iattr->stacksize = stacksize;
      88  #  if _STACK_GROWS_DOWN
      89    iattr->stackaddr = (char *) stackaddr + stacksize;
      90  #  else
      91    iattr->stackaddr = (char *) stackaddr;
      92  #  endif
      93    iattr->flags |= ATTR_FLAG_STACKADDR;
      94  
      95    return 0;
      96  }
      97  
      98  compat_symbol (libpthread, __old_pthread_attr_setstack, pthread_attr_setstack,
      99  	       GLIBC_2_2);
     100  # endif /* OTHER_SHLIB_COMPAT */
     101  #endif /* PTHREAD_STACK_MIN != 16384 */