Prefer https to http for gnu.org and fsf.org URLs
[platform/upstream/glibc.git] / sysdeps / mach / htl / pt-stack-alloc.c
1 /* Allocate a new stack.  Mach version.
2    Copyright (C) 2000-2019 Free Software Foundation, Inc.
3    This file is part of the GNU C Library.
4
5    The GNU C Library is free software; you can redistribute it and/or
6    modify it under the terms of the GNU Lesser General Public
7    License as published by the Free Software Foundation; either
8    version 2.1 of the License, or (at your option) any later version.
9
10    The GNU C Library is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13    Lesser General Public License for more details.
14
15    You should have received a copy of the GNU Lesser General Public
16    License along with the GNU C Library;  if not, see
17    <https://www.gnu.org/licenses/>.  */
18
19 #include <errno.h>
20
21 #include <mach.h>
22 #include <mach/machine/vm_param.h>
23
24 #include <pt-internal.h>
25
26 /* The next address to use for stack allocation.  */
27 static vm_address_t next_stack_base = VM_MIN_ADDRESS;
28
29
30 /* Allocate a new stack of size STACKSIZE.  If successful, store the
31    address of the newly allocated stack in *STACKADDR and return 0.
32    Otherwise return an error code (EINVAL for an invalid stack size,
33    EAGAIN if the system lacked the necessary resources to allocate a
34    new stack).  */
35 int
36 __pthread_stack_alloc (void **stackaddr, size_t stacksize)
37 {
38   vm_offset_t base;
39   int i = 0;
40
41 get_stack:
42   i++;
43   for (base = next_stack_base;
44        base < VM_MAX_ADDRESS
45        && __vm_allocate (__mach_task_self (), &base,
46                          stacksize, FALSE) != KERN_SUCCESS; base += stacksize)
47     ;
48
49   if (base >= VM_MAX_ADDRESS)
50     {
51       if (i == 1)
52         {
53           next_stack_base = VM_MIN_ADDRESS;
54           goto get_stack;
55         }
56       else
57         return EAGAIN;
58     }
59
60   if (base >= VM_MAX_ADDRESS)
61     return EAGAIN;
62
63   next_stack_base = base + stacksize;
64
65   (*stackaddr) = (void *) base;
66   return 0;
67 }