support: Add xclone

It is a wrapper for Linux clone syscall, to simplify the call to the
use only the most common arguments and remove architecture specific
handling (such as ia64 different name and signature).
This commit is contained in:
Adhemerval Zanella 2021-03-10 12:26:30 -03:00
parent e3e3eb0a2e
commit de8995a2a0
3 changed files with 85 additions and 0 deletions

View file

@ -103,6 +103,7 @@ libsupport-routines = \
xclock_gettime_time64 \
xclock_settime \
xclock_settime_time64 \
xclone \
xclose \
xchmod \
xconnect \

50
support/xclone.c Normal file
View file

@ -0,0 +1,50 @@
/* Auxiliary functions to issue the clone syscall.
Copyright (C) 2021 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
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, see
<https://www.gnu.org/licenses/>. */
#ifdef __linux__
# include <support/check.h>
# include <stackinfo.h> /* For _STACK_GROWS_{UP,DOWN}. */
# include <xsched.h>
pid_t
xclone (int (*fn) (void *arg), void *arg, void *stack, size_t stack_size,
int flags)
{
pid_t r = -1;
# ifdef __ia64__
extern int __clone2 (int (*fn) (void *arg), void *stack, size_t stack_size,
int flags, void *arg, ...);
r = __clone2 (f, stack, stack_size, flags, arg, /* ptid */ NULL,
/* tls */ NULL, /* ctid */ ctid);
# else
# if _STACK_GROWS_DOWN
r = clone (fn, stack + stack_size, flags, arg, /* ptid */ NULL,
/* tls */ NULL, /* ctid */ NULL);
# elif _STACK_GROWS_UP
r = clone (fn, stack, flags, arg, /* ptid */ NULL, /* tls */ NULL,
&ctid);
# endif
# endif
if (r < 0)
FAIL_EXIT1 ("clone: %m");
return r;
}
#endif

34
support/xsched.h Normal file
View file

@ -0,0 +1,34 @@
/* Wrapper for sched.h functions.
Copyright (C) 2021 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
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, see
<https://www.gnu.org/licenses/>. */
#ifndef SUPPORT_XSCHED_H
#define SUPPORT_XSCHED_H
__BEGIN_DECLS
#include <sched.h>
#include <sys/types.h>
#ifdef __linux__
pid_t xclone (int (*fn) (void *arg), void *arg, void *stack,
size_t stack_size, int flags);
#endif
__END_DECLS
#endif