From: Pierre-Marc Fournier Date: Wed, 17 Mar 2010 16:23:17 +0000 (-0400) Subject: rename libinterfork -> libustfork X-Git-Tag: v0.4~3 X-Git-Url: https://git.lttng.org./?a=commitdiff_plain;h=e8300fb7111bd3686d8b863db0c661ae491ee6ae;p=ust.git rename libinterfork -> libustfork --- diff --git a/Makefile.am b/Makefile.am index e3a4bbd..e2d131a 100644 --- a/Makefile.am +++ b/Makefile.am @@ -5,7 +5,7 @@ ACLOCAL_AMFLAGS = -I m4 # libust and '.' (that contains the linker script). However, '.' # must be installed after libust so it can overwrite libust.so with # the linker script. -SUBDIRS = snprintf libustcomm libust . tests libmallocwrap ustd ustctl libinterfork include +SUBDIRS = snprintf libustcomm libust . tests libmallocwrap ustd ustctl libustfork include EXTRA_DIST = doc libust.ldscript.in libust-initializer.c dist_bin_SCRIPTS = usttrace diff --git a/configure.ac b/configure.ac index e8cedce..908f547 100644 --- a/configure.ac +++ b/configure.ac @@ -118,7 +118,7 @@ AC_CONFIG_FILES([ tests/test-nevents/Makefile tests/test-libmallocwrap/Makefile libmallocwrap/Makefile - libinterfork/Makefile + libustfork/Makefile ustd/Makefile ustctl/Makefile libustcomm/Makefile diff --git a/libinterfork/Makefile.am b/libinterfork/Makefile.am deleted file mode 100644 index 7a302bd..0000000 --- a/libinterfork/Makefile.am +++ /dev/null @@ -1,6 +0,0 @@ -AM_CPPFLAGS = -I$(top_srcdir)/include - -lib_LTLIBRARIES = libinterfork.la -libinterfork_la_SOURCES = interfork.c -libinterfork_la_LIBADD = -ldl -libinterfork_CFLAGS = -DUST_COMPONENT=libinterfork diff --git a/libinterfork/interfork.c b/libinterfork/interfork.c deleted file mode 100644 index ecc39e3..0000000 --- a/libinterfork/interfork.c +++ /dev/null @@ -1,143 +0,0 @@ -/* Copyright (C) 2009 Pierre-Marc Fournier - * - * 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; either - * version 2.1 of the License, or (at your option) any later version. - * - * 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 -#include -#include "usterr.h" - -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, "libcwrap: unable to find fork\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; -} - -int execve(const char *filename, char *const argv[], char *const envp[]) -{ - static int (*plibc_func)(const char *filename, char *const argv[], char *const envp[]) = NULL; - - pid_t retval; - - if(plibc_func == NULL) { - plibc_func = dlsym(RTLD_NEXT, "execve"); - if(plibc_func == NULL) { - fprintf(stderr, "libinterfork: unable to find execve\n"); - return -1; - } - } - - ust_potential_exec(); - - retval = plibc_func(filename, argv, envp); - - return retval; -} - -struct interfork_clone_info { - int (*fn)(void *); - void *arg; - ust_fork_info_t fork_info; -}; - -static int clone_fn(void *arg) -{ - struct interfork_clone_info *info = (struct interfork_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; - - /* varargs */ - pid_t *ptid; - struct user_desc *tls; - pid_t *ctid; - - int retval; - - va_list ap; - - 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, "libinterfork: unable to find clone\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 interfork_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; -} diff --git a/libustfork/Makefile.am b/libustfork/Makefile.am new file mode 100644 index 0000000..837f8dc --- /dev/null +++ b/libustfork/Makefile.am @@ -0,0 +1,6 @@ +AM_CPPFLAGS = -I$(top_srcdir)/include + +lib_LTLIBRARIES = libustfork.la +libustfork_la_SOURCES = ustfork.c +libustfork_la_LIBADD = -ldl +libustfork_CFLAGS = -DUST_COMPONENT=libustfork diff --git a/libustfork/ustfork.c b/libustfork/ustfork.c new file mode 100644 index 0000000..ecc39e3 --- /dev/null +++ b/libustfork/ustfork.c @@ -0,0 +1,143 @@ +/* Copyright (C) 2009 Pierre-Marc Fournier + * + * 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; either + * version 2.1 of the License, or (at your option) any later version. + * + * 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 +#include +#include "usterr.h" + +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, "libcwrap: unable to find fork\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; +} + +int execve(const char *filename, char *const argv[], char *const envp[]) +{ + static int (*plibc_func)(const char *filename, char *const argv[], char *const envp[]) = NULL; + + pid_t retval; + + if(plibc_func == NULL) { + plibc_func = dlsym(RTLD_NEXT, "execve"); + if(plibc_func == NULL) { + fprintf(stderr, "libinterfork: unable to find execve\n"); + return -1; + } + } + + ust_potential_exec(); + + retval = plibc_func(filename, argv, envp); + + return retval; +} + +struct interfork_clone_info { + int (*fn)(void *); + void *arg; + ust_fork_info_t fork_info; +}; + +static int clone_fn(void *arg) +{ + struct interfork_clone_info *info = (struct interfork_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; + + /* varargs */ + pid_t *ptid; + struct user_desc *tls; + pid_t *ctid; + + int retval; + + va_list ap; + + 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, "libinterfork: unable to find clone\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 interfork_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; +} diff --git a/usttrace b/usttrace index b28a8d0..0d2a68a 100755 --- a/usttrace +++ b/usttrace @@ -27,7 +27,7 @@ USTTRACE_DIR="$(dirname $0)" if [ -x "${USTTRACE_DIR}/ustd/ustd" ] ; then # Use the not installed libraries instead USTD="${USTTRACE_DIR}/ustd/ustd" - LIBINTERFORK_PATH="${USTTRACE_DIR}/libinterfork/.libs/libinterfork.so" + LIBINTERFORK_PATH="${USTTRACE_DIR}/libustfork/.libs/libustfork.so" LIBMALLOCWRAP_PATH="${USTTRACE_DIR}/libmallocwrap/.libs/libmallocwrap.so" LIBUST_PATH="${USTTRACE_DIR}/libust/.libs/libust.so" else @@ -37,7 +37,7 @@ else error "cannot find an executable ustd; make sure its location is in the PATH" exit 1 fi - LIBINTERFORK_PATH="libinterfork.so" + LIBINTERFORK_PATH="libustfork.so" LIBMALLOCWRAP_PATH="libmallocwrap.so" LIBUST_PATH="libust.so.0" fi