X-Git-Url: http://git.liburcu.org/?a=blobdiff_plain;f=libustfork%2Fustfork.c;fp=libustfork%2Fustfork.c;h=0000000000000000000000000000000000000000;hb=69400ac4a4e6575f749c6326df7c2a2c8ac3bdc5;hp=5e6acba16e87fb9893ee7c9fe3b756afae12dd38;hpb=f3049ad9e7b72287888452b9ed542c0f36e6eefe;p=ust.git diff --git a/libustfork/ustfork.c b/libustfork/ustfork.c deleted file mode 100644 index 5e6acba..0000000 --- a/libustfork/ustfork.c +++ /dev/null @@ -1,119 +0,0 @@ -/* - * Copyright (C) 2009 Pierre-Marc Fournier - * Copyright (C) 2011 Mathieu Desnoyers - * - * This 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; version 2.1 of - * the License. - * - * This 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 this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#define _GNU_SOURCE -#include -#include -#include -#include -#include -#include -#include "usterr.h" - -#include - -struct user_desc; - -pid_t fork(void) -{ - static pid_t (*plibc_func)(void) = NULL; - ust_fork_info_t fork_info; - pid_t retval; - - if (plibc_func == NULL) { - plibc_func = dlsym(RTLD_NEXT, "fork"); - if (plibc_func == NULL) { - fprintf(stderr, "libustfork: unable to find \"fork\" symbol\n"); - return -1; - } - } - - ust_before_fork(&fork_info); - /* Do the real fork */ - retval = plibc_func(); - if (retval == 0) { - /* child */ - ust_after_fork_child(&fork_info); - } else { - ust_after_fork_parent(&fork_info); - } - return retval; -} - -struct ustfork_clone_info { - int (*fn)(void *); - void *arg; - ust_fork_info_t fork_info; -}; - -static int clone_fn(void *arg) -{ - struct ustfork_clone_info *info = (struct ustfork_clone_info *) arg; - - /* clone is now done and we are in child */ - ust_after_fork_child(&info->fork_info); - return info->fn(info->arg); -} - -int clone(int (*fn)(void *), void *child_stack, int flags, void *arg, ...) -{ - static int (*plibc_func)(int (*fn)(void *), void *child_stack, - int flags, void *arg, pid_t *ptid, - struct user_desc *tls, pid_t *ctid) = NULL; - /* var args */ - pid_t *ptid; - struct user_desc *tls; - pid_t *ctid; - /* end of var args */ - va_list ap; - int retval; - - va_start(ap, arg); - ptid = va_arg(ap, pid_t *); - tls = va_arg(ap, struct user_desc *); - ctid = va_arg(ap, pid_t *); - va_end(ap); - - if (plibc_func == NULL) { - plibc_func = dlsym(RTLD_NEXT, "clone"); - if (plibc_func == NULL) { - fprintf(stderr, "libustfork: unable to find \"clone\" symbol.\n"); - return -1; - } - } - - if (flags & CLONE_VM) { - /* - * Creating a thread, no need to intervene, just pass on - * the arguments. - */ - retval = plibc_func(fn, child_stack, flags, arg, ptid, - tls, ctid); - } else { - /* Creating a real process, we need to intervene. */ - struct ustfork_clone_info info = { fn: fn, arg: arg }; - - ust_before_fork(&info.fork_info); - retval = plibc_func(clone_fn, child_stack, flags, &info, - ptid, tls, ctid); - /* The child doesn't get here. */ - ust_after_fork_parent(&info.fork_info); - } - return retval; -}