]> git.ipfire.org Git - thirdparty/glibc.git/blobdiff - nptl/pthread_attr_setstack.c
Update copyright dates with scripts/update-copyrights.
[thirdparty/glibc.git] / nptl / pthread_attr_setstack.c
index 622e4a2250ffbcf13b0adaac2e0a0546e73028cc..14b6ec59e1a9c35bc957a48233b8f7639ba5623b 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2002, 2003 Free Software Foundation, Inc.
+/* Copyright (C) 2002-2016 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
 
@@ -13,9 +13,8 @@
    Lesser General Public License for more details.
 
    You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-   02111-1307 USA.  */
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
 
 #include <assert.h>
 #include <errno.h>
 #include "pthreadP.h"
 
 
+#ifndef NEW_VERNUM
+# define NEW_VERNUM GLIBC_2_3_3
+#endif
+
+
 int
-__pthread_attr_setstack (attr, stackaddr, stacksize)
-     pthread_attr_t *attr;
-     void *stackaddr;
-     size_t stacksize;
+__pthread_attr_setstack (pthread_attr_t *attr, void *stackaddr,
+                        size_t stacksize)
 {
   struct pthread_attr *iattr;
 
@@ -35,15 +37,20 @@ __pthread_attr_setstack (attr, stackaddr, stacksize)
   iattr = (struct pthread_attr *) attr;
 
   /* Catch invalid sizes.  */
-  if (stacksize < PTHREAD_STACK_MIN)
-    return EINVAL;
+  int ret = check_stacksize_attr (stacksize);
+  if (ret)
+    return ret;
 
 #ifdef EXTRA_PARAM_CHECKS
   EXTRA_PARAM_CHECKS;
 #endif
 
   iattr->stacksize = stacksize;
+#if _STACK_GROWS_DOWN
   iattr->stackaddr = (char *) stackaddr + stacksize;
+#else
+  iattr->stackaddr = (char *) stackaddr;
+#endif
   iattr->flags |= ATTR_FLAG_STACKADDR;
 
   return 0;
@@ -54,9 +61,9 @@ strong_alias (__pthread_attr_setstack, pthread_attr_setstack)
 #else
 # include <shlib-compat.h>
 versioned_symbol (libpthread, __pthread_attr_setstack, pthread_attr_setstack,
-                 GLIBC_2_3_3);
+                 NEW_VERNUM);
 
-# if SHLIB_COMPAT(libpthread, GLIBC_2_2, GLIBC_2_3_3)
+# if SHLIB_COMPAT(libpthread, GLIBC_2_2, NEW_VERNUM)
 
 int
 __old_pthread_attr_setstack (pthread_attr_t *attr, void *stackaddr,
@@ -71,12 +78,16 @@ __old_pthread_attr_setstack (pthread_attr_t *attr, void *stackaddr,
   if (stacksize < 16384)
     return EINVAL;
 
-# ifdef EXTRA_PARAM_CHECKS
+#  ifdef EXTRA_PARAM_CHECKS
   EXTRA_PARAM_CHECKS;
-# endif
+#  endif
 
   iattr->stacksize = stacksize;
+#if _STACK_GROWS_DOWN
   iattr->stackaddr = (char *) stackaddr + stacksize;
+#else
+  iattr->stackaddr = (char *) stackaddr;
+#endif
   iattr->flags |= ATTR_FLAG_STACKADDR;
 
   return 0;