1 /* Copyright (C) 2002-2022 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 <string.h>
20 #include <unistd.h>
21 #include "pthreadP.h"
22 
23 #include <shlib-compat.h>
24 
25 
26 struct pthread_attr *__attr_list;
27 int __attr_list_lock = LLL_LOCK_INITIALIZER;
28 
29 
30 int
__pthread_attr_init(pthread_attr_t * attr)31 __pthread_attr_init (pthread_attr_t *attr)
32 {
33   struct pthread_attr *iattr;
34 
35   ASSERT_TYPE_SIZE (pthread_attr_t, __SIZEOF_PTHREAD_ATTR_T);
36   ASSERT_PTHREAD_INTERNAL_SIZE (pthread_attr_t, struct pthread_attr);
37 
38   /* Many elements are initialized to zero so let us do it all at
39      once.  This also takes care of clearing the bytes which are not
40      internally used.  */
41   memset (attr, '\0', __SIZEOF_PTHREAD_ATTR_T);
42 
43   iattr = (struct pthread_attr *) attr;
44 
45   /* Default guard size specified by the standard.  */
46   iattr->guardsize = __getpagesize ();
47 
48   return 0;
49 }
50 libc_hidden_def (__pthread_attr_init)
51 versioned_symbol (libc, __pthread_attr_init, pthread_attr_init, GLIBC_2_1);
52 
53 
54 #if SHLIB_COMPAT(libc, GLIBC_2_0, GLIBC_2_1)
55 int
__pthread_attr_init_2_0(pthread_attr_t * attr)56 __pthread_attr_init_2_0 (pthread_attr_t *attr)
57 {
58   /* This code is specific to the old LinuxThread code which has a too
59      small pthread_attr_t definition.  The struct looked like
60      this:  */
61   struct old_attr
62   {
63     int detachstate;
64     int schedpolicy;
65     struct sched_param schedparam;
66     int inheritsched;
67     int scope;
68   };
69   struct pthread_attr *iattr;
70 
71   /* Many elements are initialized to zero so let us do it all at
72      once.  This also takes care of clearing the bytes which are not
73      internally used.  */
74   memset (attr, '\0', sizeof (struct old_attr));
75 
76   iattr = (struct pthread_attr *) attr;
77   iattr->flags |= ATTR_FLAG_OLDATTR;
78 
79   /* We cannot enqueue the attribute because that member is not in the
80      old attribute structure.  */
81   return 0;
82 }
83 compat_symbol (libc, __pthread_attr_init_2_0, pthread_attr_init, GLIBC_2_0);
84 #endif
85