[PATCH 1/4] support: Add xclone

Florian Weimer fweimer@redhat.com
Wed Dec 23 11:35:54 GMT 2020


* Adhemerval Zanella:

> diff --git a/support/xclone.c b/support/xclone.c
> new file mode 100644
> index 0000000000..e7efffb82b
> --- /dev/null
> +++ b/support/xclone.c
> @@ -0,0 +1,46 @@
> +/* Auxiliary wrapper to issue the clone symbol.

Same wording issue as before.

> +   Copyright (C) 2020 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/>.  */
> +
> +#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 __linux__
> +# 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
> +#endif
> +
> +  return r;
> +}

Maybe #ifdef CLONE_VM instead of #ifdef __linux__?  And around the whole
function definition?

Then you can check for an error return from the system call, too, to
match the x* function pattern.

Thanks,
Florian
-- 
Red Hat GmbH, https://de.redhat.com/ , Registered seat: Grasbrunn,
Commercial register: Amtsgericht Muenchen, HRB 153243,
Managing Directors: Charles Cachera, Brian Klemm, Laurie Krebs, Michael O'Neill



More information about the Libc-alpha mailing list