packaging: add --disable-experimental-malloc
[platform/upstream/glibc.git] / support / xclone.c
1 /* Auxiliary functions to issue the clone syscall.
2    Copyright (C) 2021-2023 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 #ifdef __linux__
20 # include <support/check.h>
21 # include <stackinfo.h>  /* For _STACK_GROWS_{UP,DOWN}.  */
22 # include <xsched.h>
23
24 pid_t
25 xclone (int (*fn) (void *arg), void *arg, void *stack, size_t stack_size,
26         int flags)
27 {
28   pid_t r = -1;
29
30 # ifdef __ia64__
31   extern int __clone2 (int (*fn) (void *arg), void *stack, size_t stack_size,
32                        int flags, void *arg, ...);
33   r = __clone2 (fn, stack, stack_size, flags, arg, /* ptid */ NULL,
34                 /* tls */ NULL, /* ctid  */ NULL);
35 # else
36 #  if _STACK_GROWS_DOWN
37   r = clone (fn, stack + stack_size, flags, arg, /* ptid */ NULL,
38              /* tls */ NULL, /* ctid */  NULL);
39 #  elif _STACK_GROWS_UP
40   r = clone (fn, stack, flags, arg, /* ptid */ NULL, /* tls */ NULL, NULL);
41 #  endif
42 # endif
43
44   if (r < 0)
45     FAIL_EXIT1 ("clone: %m");
46
47   return r;
48 }
49 #endif