From: Mathieu Desnoyers Date: Thu, 16 Jun 2011 19:09:17 +0000 (-0400) Subject: Move away headers that will be deprecated X-Git-Url: http://git.efficios.com/?a=commitdiff_plain;h=e26c8207a69086160542d1cdfedf9578d6385748;p=lttng-ust.git Move away headers that will be deprecated Signed-off-by: Mathieu Desnoyers --- diff --git a/Makefile.am b/Makefile.am index bff61983..0a9cde64 100644 --- a/Makefile.am +++ b/Makefile.am @@ -5,10 +5,9 @@ ACLOCAL_AMFLAGS = -I config # 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 libustctl libust . tests libustinstr-malloc libustconsumer ust-consumerd ustctl libustfork include doc +SUBDIRS = snprintf libust . tests libustinstr-malloc libustfork include doc EXTRA_DIST = libust.ldscript.in libust-initializer.c libust-initializer.h -dist_bin_SCRIPTS = usttrace ldscriptsdir = $(libdir) ldscripts_DATA = libust.so libust-initializer.o @@ -24,4 +23,4 @@ libust-initializer.o: libust-initializer.c $(CC) $(CFLAGS) -fno-strict-aliasing -fPIC -c -I$(top_srcdir)/include -I$(top_srcdir) -o $@ $< pkgconfigdir = $(libdir)/pkgconfig -pkgconfig_DATA = ust.pc \ No newline at end of file +pkgconfig_DATA = ust.pc diff --git a/configure.ac b/configure.ac index a24525fd..8594a470 100644 --- a/configure.ac +++ b/configure.ac @@ -1,7 +1,7 @@ # -*- Autoconf -*- # Process this file with autoconf to produce a configure script. -AC_INIT([ust], [0.14], [mathieu dot desnoyers at efficios dot com]) +AC_INIT([ust], [1.9.0], [mathieu dot desnoyers at efficios dot com]) AC_CONFIG_AUX_DIR([config]) AC_CANONICAL_TARGET AC_CANONICAL_HOST @@ -26,18 +26,8 @@ AC_PROG_MAKE_SET AC_PROG_LIBTOOL ## Checks for libraries. -## FIXME: Replace `main' with a function in `-ldl': -#AC_CHECK_LIB([dl], [main]) -## FIXME: Replace `main' with a function in `-lmarkers': -#AC_CHECK_LIB([markers], [main]) -## FIXME: Replace `main' with a function in `-lpthread': -#AC_CHECK_LIB([pthread], [main]) -## FIXME: Replace `main' with a function in `-ltracectl': -#AC_CHECK_LIB([tracectl], [main]) -## FIXME: Replace `main' with a function in `-ltracing': -#AC_CHECK_LIB([tracing], [main]) -## FIXME: Replace `main' with a function in `-lurcu': -#AC_CHECK_LIB([urcu], [main]) +AC_CHECK_LIB([dl], [dlopen]) +AC_CHECK_LIB([pthread], [pthread_create]) # Checks for header files. #AC_CHECK_HEADERS([fcntl.h stdint.h stdlib.h string.h sys/socket.h sys/time.h unistd.h]) @@ -172,11 +162,6 @@ AC_CONFIG_FILES([ tests/exit-fast/Makefile libustinstr-malloc/Makefile libustfork/Makefile - libustconsumer/Makefile - ust-consumerd/Makefile - ustctl/Makefile - libustcomm/Makefile - libustctl/Makefile snprintf/Makefile ust.pc include/ust/version.h diff --git a/deprecated/ustconsumer.h b/deprecated/ustconsumer.h new file mode 100644 index 00000000..8c534888 --- /dev/null +++ b/deprecated/ustconsumer.h @@ -0,0 +1,292 @@ +/* + * libustconsumer header file + * + * Copyright 2005-2010 - + * Mathieu Desnoyers + * Copyright 2010- + * Oumarou Dicko + * Michael Sills-Lavoie + * Alexis Halle + * + * 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 + */ + +#ifndef _USTCONSUMER_H +#define _USTCONSUMER_H + +#include +#include +#include +#include + +#define USTCONSUMER_DEFAULT_TRACE_PATH "/tmp/usttrace" + +struct ustcomm_sock; + +struct buffer_info { + char *name; + char *trace; + char *channel; + int channel_cpu; + + pid_t pid; + int app_sock; + /* The pipe file descriptor */ + int pipe_fd; + + int shmid; + int bufstruct_shmid; + + /* the buffer memory */ + void *mem; + /* buffer size */ + int memlen; + /* number of subbuffers in buffer */ + int n_subbufs; + /* size of each subbuffer */ + int subbuf_size; + /* subbuf size count order */ + int subbuf_size_order; + /* alloc size of all subbuf */ + int alloc_size; + + /* the buffer information struct */ + void *bufstruct_mem; + + long consumed_old; + + int64_t pidunique; + + void *user_data; +}; + +struct ustconsumer_callbacks; + +/** + * struct ustconsumer_instance - Contains the data associated with a trace instance. + * The lib user can read but MUST NOT change any attributes but callbacks. + * @callbacks: Contains the necessary callbacks for a tracing session. + */ +struct ustconsumer_instance { + struct ustconsumer_callbacks *callbacks; + int quit_program; + int is_init; + struct cds_list_head connections; + int epoll_fd; + struct ustcomm_sock *listen_sock; + char *sock_path; + pthread_mutex_t mutex; + int active_buffers; + int active_threads; +}; + +/** +* struct ustconsumer_callbacks - Contains the necessary callbacks for a tracing +* session. The user can set the unnecessary functions to NULL if he does not +* need them. +*/ +struct ustconsumer_callbacks { + /** + * on_open_buffer - Is called after a buffer is attached to process memory + * + * @data: pointer to the callbacks structure that has been passed to the + * library. + * @buf: structure that contains the data associated with the buffer + * + * Returns 0 if the callback succeeds else not 0. + * + * It has to be thread safe, because it is called by many threads. + */ + int (*on_open_buffer)(struct ustconsumer_callbacks *data, + struct buffer_info *buf); + + /** + * on_close_buffer - Is called after a buffer is detached from process memory + * + * @data: pointer to the callbacks structure that has been passed to the + * library. + * @buf: structure that contains the data associated with the buffer + * + * Returns 0 if the callback succeeds else not 0. + * + * It has to be thread safe, because it is called by many threads. + */ + int (*on_close_buffer)(struct ustconsumer_callbacks *data, + struct buffer_info *buf); + + /** + * on_read_subbuffer - Is called after a subbuffer is a reserved. + * + * @data: pointer to the callbacks structure that has been passed to the + * library. + * @buf: structure that contains the data associated with the buffer + * + * Returns 0 if the callback succeeds else not 0. + * + * It has to be thread safe, because it is called by many threads. + */ + int (*on_read_subbuffer)(struct ustconsumer_callbacks *data, + struct buffer_info *buf); + + /** + * on_read_partial_subbuffer - Is called when an incomplete subbuffer + * is being salvaged from an app crash + * + * @data: pointer to the callbacks structure that has been passed to the + * library. + * @buf: structure that contains the data associated with the buffer + * @subbuf_index: index of the subbuffer to read in the buffer + * @valid_length: number of bytes considered safe to read + * + * Returns 0 if the callback succeeds else not 0. + * + * It has to be thread safe, because it is called by many threads. + */ + int (*on_read_partial_subbuffer)(struct ustconsumer_callbacks *data, + struct buffer_info *buf, + long subbuf_index, + unsigned long valid_length); + + /** + * on_put_error - Is called when a put error has occured and the last + * subbuffer read is no longer safe to keep + * + * @data: pointer to the callbacks structure that has been passed to the + * library. + * @buf: structure that contains the data associated with the buffer + * + * Returns 0 if the callback succeeds else not 0. + * + * It has to be thread safe, because it is called by many threads. + */ + int (*on_put_error)(struct ustconsumer_callbacks *data, + struct buffer_info *buf); + + /** + * on_new_thread - Is called when a new thread is created + * + * @data: pointer to the callbacks structure that has been passed to the + * library. + * + * Returns 0 if the callback succeeds else not 0. + * + * It has to be thread safe, because it is called by many threads. + */ + int (*on_new_thread)(struct ustconsumer_callbacks *data); + + /** + * on_close_thread - Is called just before a thread is destroyed + * + * @data: pointer to the callbacks structure that has been passed to the + * library. + * + * Returns 0 if the callback succeeds else not 0. + * + * It has to be thread safe, because it is called by many threads. + */ + int (*on_close_thread)(struct ustconsumer_callbacks *data); + + /** + * on_trace_end - Is called at the very end of the tracing session. At + * this time, everything has been closed and the threads have + * been destroyed. + * + * @instance: pointer to the instance structure that has been passed to + * the library. + * + * Returns 0 if the callback succeeds else not 0. + * + * After this callback is called, no other callback will be called + * again and the tracing instance will be deleted automatically by + * libustconsumer. After this call, the user must not use the libustconsumer instance. + */ + int (*on_trace_end)(struct ustconsumer_instance *instance); + + /** + * The library's data. + */ + void *user_data; +}; + +/** + * ustconsumer_new_instance - Is called to create a new tracing session. + * + * @callbacks: Pointer to a callbacks structure that contain the user + * callbacks and data. + * @sock_path: Path to the socket used for communication with the traced app + * + * Returns the instance if the function succeeds else NULL. + */ +struct ustconsumer_instance * +ustconsumer_new_instance( + struct ustconsumer_callbacks *callbacks, char *sock_path); + +/** + * ustconsumer_delete_instance - Is called to free a ustconsumer_instance struct + * + * @instance: The tracing session instance that needs to be freed. + * + * This function should only be called if the instance has not been started, + * as it will automatically be called at the end of ustconsumer_start_instance. + */ +void ustconsumer_delete_instance(struct ustconsumer_instance *instance); + +/** + * ustconsumer_init_instance - Is called to initiliaze a new tracing session + * + * @instance: The tracing session instance that needs to be started. + * + * Returns 0 if the function succeeds. + * + * This function must be called between ustconsumer_new_instance and + * ustconsumer_start_instance. It sets up the communication between the library + * and the tracing application. + */ +int ustconsumer_init_instance(struct ustconsumer_instance *instance); + +/** + * ustconsumer_start_instance - Is called to start a new tracing session. + * + * @instance: The tracing session instance that needs to be started. + * + * Returns 0 if the function succeeds. + * + * This is a blocking function. The caller will be blocked on it until the + * tracing session is stopped by the user using ustconsumer_stop_instance or until + * the traced application terminates + */ +int ustconsumer_start_instance(struct ustconsumer_instance *instance); + +/** + * ustconsumer_stop_instance - Is called to stop a tracing session. + * + * @instance: The tracing session instance that needs to be stoped. + * @send_msg: If true, a message will be sent to the listening thread through + * the daemon socket to force it to return from the poll syscall + * and realize that it must close. This is not necessary if the + * instance is being stopped as part of an interrupt handler, as + * the interrupt itself will cause poll to return. + * + * Returns 0 if the function succeeds. + * + * This function returns immediately, it only tells libustconsumer to stop the + * instance. The on_trace_end callback will be called when the tracing session + * will really be stopped. The instance is deleted automatically by libustconsumer + * after on_trace_end is called. + */ +int ustconsumer_stop_instance(struct ustconsumer_instance *instance, int send_msg); + +#endif /* _USTCONSUMER_H */ + diff --git a/deprecated/ustctl.h b/deprecated/ustctl.h new file mode 100644 index 00000000..33d7ade0 --- /dev/null +++ b/deprecated/ustctl.h @@ -0,0 +1,98 @@ +/* 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 + */ + +#ifndef _USTCTL_H +#define _USTCTL_H + +#include +#include +#include +#include +#include + +#define USTCTL_ERR_CONN 1 /* Process connection error */ +#define USTCTL_ERR_ARG 2 /* Invalid function argument */ +#define USTCTL_ERR_GEN 3 /* General ustctl error */ + +#define USTCTL_MS_CHR_OFF '0' /* Marker state 'on' character */ +#define USTCTL_MS_CHR_ON '1' /* Marker state 'on' character */ +#define USTCTL_MS_OFF 0 /* Marker state 'on' value */ +#define USTCTL_MS_ON 1 /* Marker state 'on' value */ + +#define USTCTL_SOCK_PATH "/tmp/socks/" + +/* Channel/marker/state/format string (cmsf) info. structure */ +struct ust_marker_status { + char *channel; /* Channel name (end of ust_marker_status array if NULL) */ + char *ust_marker; /* Marker name (end of ust_marker_status array if NULL) */ + int state; /* State (0 := marker disabled, 1 := marker enabled) */ + char *fs; /* Format string (end of ust_marker_status array if NULL) */ +}; + +struct trace_event_status { + char *name; +}; + +extern pid_t *ustctl_get_online_pids(void); + +extern int ustctl_connect_pid(pid_t pid); + +extern int ustctl_set_ust_marker_state(int sock, const char *trace, + const char *channel, const char *ust_marker, + int state); + +extern int ustctl_set_subbuf_size(int sock, const char *trace, + const char *channel, + unsigned int subbuf_size); + +extern int ustctl_set_subbuf_num(int sock, const char *trace, + const char *channel, + unsigned int num); + +extern int ustctl_get_subbuf_size(int sock, const char *trace, + const char *channel); + +extern int ustctl_get_subbuf_num(pid_t pid, const char *trace, + const char *channel); + +extern int ustctl_destroy_trace(int sock, const char *trace); + +extern int ustctl_setup_and_start(int sock, const char *trace); + +extern int ustctl_stop_trace(int sock, const char *trace); + +extern int ustctl_create_trace(int sock, const char *trace); + +extern int ustctl_start_trace(int sock, const char *trace); + +extern int ustctl_alloc_trace(int sock, const char *trace); + +extern int ustctl_free_cmsf(struct ust_marker_status *); +extern int ustctl_free_tes(struct trace_event_status *); +extern unsigned int ustctl_count_nl(const char *); + +extern int ustctl_get_cmsf(int sock, struct ust_marker_status **); + +extern int ustctl_get_tes(int sock, struct trace_event_status **); + +extern int ustctl_set_sock_path(int sock, const char *sock_path); + +extern int ustctl_get_sock_path(int sock, char **sock_path); + +extern int ustctl_force_switch(int sock, const char *trace); + +#endif /* _USTCTL_H */ diff --git a/include/Makefile.am b/include/Makefile.am index 6b128fad..3b1503ff 100644 --- a/include/Makefile.am +++ b/include/Makefile.am @@ -23,6 +23,4 @@ noinst_HEADERS = \ ust/kcompat/compiler.h \ ust/kcompat/types.h \ ust/tracectl.h \ - ust/ustctl.h \ - ust/ustconsumer.h \ ust/stringify.h diff --git a/include/ust/ustconsumer.h b/include/ust/ustconsumer.h deleted file mode 100644 index 8c534888..00000000 --- a/include/ust/ustconsumer.h +++ /dev/null @@ -1,292 +0,0 @@ -/* - * libustconsumer header file - * - * Copyright 2005-2010 - - * Mathieu Desnoyers - * Copyright 2010- - * Oumarou Dicko - * Michael Sills-Lavoie - * Alexis Halle - * - * 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 - */ - -#ifndef _USTCONSUMER_H -#define _USTCONSUMER_H - -#include -#include -#include -#include - -#define USTCONSUMER_DEFAULT_TRACE_PATH "/tmp/usttrace" - -struct ustcomm_sock; - -struct buffer_info { - char *name; - char *trace; - char *channel; - int channel_cpu; - - pid_t pid; - int app_sock; - /* The pipe file descriptor */ - int pipe_fd; - - int shmid; - int bufstruct_shmid; - - /* the buffer memory */ - void *mem; - /* buffer size */ - int memlen; - /* number of subbuffers in buffer */ - int n_subbufs; - /* size of each subbuffer */ - int subbuf_size; - /* subbuf size count order */ - int subbuf_size_order; - /* alloc size of all subbuf */ - int alloc_size; - - /* the buffer information struct */ - void *bufstruct_mem; - - long consumed_old; - - int64_t pidunique; - - void *user_data; -}; - -struct ustconsumer_callbacks; - -/** - * struct ustconsumer_instance - Contains the data associated with a trace instance. - * The lib user can read but MUST NOT change any attributes but callbacks. - * @callbacks: Contains the necessary callbacks for a tracing session. - */ -struct ustconsumer_instance { - struct ustconsumer_callbacks *callbacks; - int quit_program; - int is_init; - struct cds_list_head connections; - int epoll_fd; - struct ustcomm_sock *listen_sock; - char *sock_path; - pthread_mutex_t mutex; - int active_buffers; - int active_threads; -}; - -/** -* struct ustconsumer_callbacks - Contains the necessary callbacks for a tracing -* session. The user can set the unnecessary functions to NULL if he does not -* need them. -*/ -struct ustconsumer_callbacks { - /** - * on_open_buffer - Is called after a buffer is attached to process memory - * - * @data: pointer to the callbacks structure that has been passed to the - * library. - * @buf: structure that contains the data associated with the buffer - * - * Returns 0 if the callback succeeds else not 0. - * - * It has to be thread safe, because it is called by many threads. - */ - int (*on_open_buffer)(struct ustconsumer_callbacks *data, - struct buffer_info *buf); - - /** - * on_close_buffer - Is called after a buffer is detached from process memory - * - * @data: pointer to the callbacks structure that has been passed to the - * library. - * @buf: structure that contains the data associated with the buffer - * - * Returns 0 if the callback succeeds else not 0. - * - * It has to be thread safe, because it is called by many threads. - */ - int (*on_close_buffer)(struct ustconsumer_callbacks *data, - struct buffer_info *buf); - - /** - * on_read_subbuffer - Is called after a subbuffer is a reserved. - * - * @data: pointer to the callbacks structure that has been passed to the - * library. - * @buf: structure that contains the data associated with the buffer - * - * Returns 0 if the callback succeeds else not 0. - * - * It has to be thread safe, because it is called by many threads. - */ - int (*on_read_subbuffer)(struct ustconsumer_callbacks *data, - struct buffer_info *buf); - - /** - * on_read_partial_subbuffer - Is called when an incomplete subbuffer - * is being salvaged from an app crash - * - * @data: pointer to the callbacks structure that has been passed to the - * library. - * @buf: structure that contains the data associated with the buffer - * @subbuf_index: index of the subbuffer to read in the buffer - * @valid_length: number of bytes considered safe to read - * - * Returns 0 if the callback succeeds else not 0. - * - * It has to be thread safe, because it is called by many threads. - */ - int (*on_read_partial_subbuffer)(struct ustconsumer_callbacks *data, - struct buffer_info *buf, - long subbuf_index, - unsigned long valid_length); - - /** - * on_put_error - Is called when a put error has occured and the last - * subbuffer read is no longer safe to keep - * - * @data: pointer to the callbacks structure that has been passed to the - * library. - * @buf: structure that contains the data associated with the buffer - * - * Returns 0 if the callback succeeds else not 0. - * - * It has to be thread safe, because it is called by many threads. - */ - int (*on_put_error)(struct ustconsumer_callbacks *data, - struct buffer_info *buf); - - /** - * on_new_thread - Is called when a new thread is created - * - * @data: pointer to the callbacks structure that has been passed to the - * library. - * - * Returns 0 if the callback succeeds else not 0. - * - * It has to be thread safe, because it is called by many threads. - */ - int (*on_new_thread)(struct ustconsumer_callbacks *data); - - /** - * on_close_thread - Is called just before a thread is destroyed - * - * @data: pointer to the callbacks structure that has been passed to the - * library. - * - * Returns 0 if the callback succeeds else not 0. - * - * It has to be thread safe, because it is called by many threads. - */ - int (*on_close_thread)(struct ustconsumer_callbacks *data); - - /** - * on_trace_end - Is called at the very end of the tracing session. At - * this time, everything has been closed and the threads have - * been destroyed. - * - * @instance: pointer to the instance structure that has been passed to - * the library. - * - * Returns 0 if the callback succeeds else not 0. - * - * After this callback is called, no other callback will be called - * again and the tracing instance will be deleted automatically by - * libustconsumer. After this call, the user must not use the libustconsumer instance. - */ - int (*on_trace_end)(struct ustconsumer_instance *instance); - - /** - * The library's data. - */ - void *user_data; -}; - -/** - * ustconsumer_new_instance - Is called to create a new tracing session. - * - * @callbacks: Pointer to a callbacks structure that contain the user - * callbacks and data. - * @sock_path: Path to the socket used for communication with the traced app - * - * Returns the instance if the function succeeds else NULL. - */ -struct ustconsumer_instance * -ustconsumer_new_instance( - struct ustconsumer_callbacks *callbacks, char *sock_path); - -/** - * ustconsumer_delete_instance - Is called to free a ustconsumer_instance struct - * - * @instance: The tracing session instance that needs to be freed. - * - * This function should only be called if the instance has not been started, - * as it will automatically be called at the end of ustconsumer_start_instance. - */ -void ustconsumer_delete_instance(struct ustconsumer_instance *instance); - -/** - * ustconsumer_init_instance - Is called to initiliaze a new tracing session - * - * @instance: The tracing session instance that needs to be started. - * - * Returns 0 if the function succeeds. - * - * This function must be called between ustconsumer_new_instance and - * ustconsumer_start_instance. It sets up the communication between the library - * and the tracing application. - */ -int ustconsumer_init_instance(struct ustconsumer_instance *instance); - -/** - * ustconsumer_start_instance - Is called to start a new tracing session. - * - * @instance: The tracing session instance that needs to be started. - * - * Returns 0 if the function succeeds. - * - * This is a blocking function. The caller will be blocked on it until the - * tracing session is stopped by the user using ustconsumer_stop_instance or until - * the traced application terminates - */ -int ustconsumer_start_instance(struct ustconsumer_instance *instance); - -/** - * ustconsumer_stop_instance - Is called to stop a tracing session. - * - * @instance: The tracing session instance that needs to be stoped. - * @send_msg: If true, a message will be sent to the listening thread through - * the daemon socket to force it to return from the poll syscall - * and realize that it must close. This is not necessary if the - * instance is being stopped as part of an interrupt handler, as - * the interrupt itself will cause poll to return. - * - * Returns 0 if the function succeeds. - * - * This function returns immediately, it only tells libustconsumer to stop the - * instance. The on_trace_end callback will be called when the tracing session - * will really be stopped. The instance is deleted automatically by libustconsumer - * after on_trace_end is called. - */ -int ustconsumer_stop_instance(struct ustconsumer_instance *instance, int send_msg); - -#endif /* _USTCONSUMER_H */ - diff --git a/include/ust/ustctl.h b/include/ust/ustctl.h deleted file mode 100644 index 33d7ade0..00000000 --- a/include/ust/ustctl.h +++ /dev/null @@ -1,98 +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 - */ - -#ifndef _USTCTL_H -#define _USTCTL_H - -#include -#include -#include -#include -#include - -#define USTCTL_ERR_CONN 1 /* Process connection error */ -#define USTCTL_ERR_ARG 2 /* Invalid function argument */ -#define USTCTL_ERR_GEN 3 /* General ustctl error */ - -#define USTCTL_MS_CHR_OFF '0' /* Marker state 'on' character */ -#define USTCTL_MS_CHR_ON '1' /* Marker state 'on' character */ -#define USTCTL_MS_OFF 0 /* Marker state 'on' value */ -#define USTCTL_MS_ON 1 /* Marker state 'on' value */ - -#define USTCTL_SOCK_PATH "/tmp/socks/" - -/* Channel/marker/state/format string (cmsf) info. structure */ -struct ust_marker_status { - char *channel; /* Channel name (end of ust_marker_status array if NULL) */ - char *ust_marker; /* Marker name (end of ust_marker_status array if NULL) */ - int state; /* State (0 := marker disabled, 1 := marker enabled) */ - char *fs; /* Format string (end of ust_marker_status array if NULL) */ -}; - -struct trace_event_status { - char *name; -}; - -extern pid_t *ustctl_get_online_pids(void); - -extern int ustctl_connect_pid(pid_t pid); - -extern int ustctl_set_ust_marker_state(int sock, const char *trace, - const char *channel, const char *ust_marker, - int state); - -extern int ustctl_set_subbuf_size(int sock, const char *trace, - const char *channel, - unsigned int subbuf_size); - -extern int ustctl_set_subbuf_num(int sock, const char *trace, - const char *channel, - unsigned int num); - -extern int ustctl_get_subbuf_size(int sock, const char *trace, - const char *channel); - -extern int ustctl_get_subbuf_num(pid_t pid, const char *trace, - const char *channel); - -extern int ustctl_destroy_trace(int sock, const char *trace); - -extern int ustctl_setup_and_start(int sock, const char *trace); - -extern int ustctl_stop_trace(int sock, const char *trace); - -extern int ustctl_create_trace(int sock, const char *trace); - -extern int ustctl_start_trace(int sock, const char *trace); - -extern int ustctl_alloc_trace(int sock, const char *trace); - -extern int ustctl_free_cmsf(struct ust_marker_status *); -extern int ustctl_free_tes(struct trace_event_status *); -extern unsigned int ustctl_count_nl(const char *); - -extern int ustctl_get_cmsf(int sock, struct ust_marker_status **); - -extern int ustctl_get_tes(int sock, struct trace_event_status **); - -extern int ustctl_set_sock_path(int sock, const char *sock_path); - -extern int ustctl_get_sock_path(int sock, char **sock_path); - -extern int ustctl_force_switch(int sock, const char *trace); - -#endif /* _USTCTL_H */ diff --git a/usttrace b/usttrace deleted file mode 100755 index e76dae71..00000000 --- a/usttrace +++ /dev/null @@ -1,217 +0,0 @@ -#!/bin/sh - -# usttrace by Pierre-Marc Fournier 2009 -# Distributed under the GPLv2. - -error() { - echo "$0: error: $1" 1>&2 -} - -sighandler() { - echo "Caught Ctrl-C" - if [ -z "${UST_CONSUMERD_PID}" ]; then - UST_CONSUMERD_PID=`cat $pidfilepath` - fi - # Tell the daemon to die - kill -TERM "${UST_CONSUMERD_PID}" - - echo "Waiting for ust-consumerd to shutdown..." - wait "${UST_CONSUMERD_PID}" - - rm "$pidfilepath" - - exit 0; -} - -USTTRACE_DIR="$(dirname $0)" -if [ -x "${USTTRACE_DIR}/ust-consumerd/ust-consumerd" ] ; then - # Use the not installed libraries instead - UST_CONSUMERD="${USTTRACE_DIR}/ust-consumerd/ust-consumerd" - LIBINTERFORK_PATH="${USTTRACE_DIR}/libustfork/.libs/libustfork.so" - LIBMALLOCWRAP_PATH="${USTTRACE_DIR}/libustinstr-malloc/.libs/libustinstr-malloc.so" - LIBUST_PATH="${USTTRACE_DIR}/libust/.libs/libust.so" -else - # Use the libraries that the dynamic link finds - UST_CONSUMERD="ust-consumerd" - if [ ! -x "$(which ust-consumerd 2>/dev/null)" ]; then - error "cannot find an executable ust-consumerd; make sure its location is in the PATH" - exit 1 - fi - LIBINTERFORK_PATH="libustfork.so" - LIBMALLOCWRAP_PATH="libustinstr-malloc.so" - LIBUST_PATH="libust.so.0" -fi - -BASE_TRACE_DIR="${HOME}/.usttraces" - -usage() { - echo "usage: $0 OPTIONS COMMAND" 1>&2 - echo "" 1>&2 - echo "Options:" 1>&2 - echo " -l Runtime link with UST library." 1>&2 - echo " (Needed only if program was not linked at compile time with libust.)" 1>&2 - echo " -L Add path to ust libraries to LD_LIBRARY_PATH." 1>&2 - echo " -m Instrument malloc calls." 1>&2 - echo " -f Also trace forked processes." 1>&2 - echo " -s Use system-wide daemon instead of creating one for this session." 1>&2 - echo " -S Specify the subbuffer size." 1>&2 - echo " -N Specify the number of subbuffers." 1>&2 - echo " -o Output directory of the trace." 1>&2 -} - -while getopts ":hlLmfsWS:N:o:" options; do - case $options in - l) arg_preload_libust=1;; - L) arg_ld_std_ust=1;; - m) arg_preload_malloc=1;; - f) arg_preload_fork=1;; - s) arg_syswide_daemon=1;; - W) where=1;; - S) export UST_SUBBUF_SIZE=$OPTARG;; - N) export UST_SUBBUF_NUM=$OPTARG;; - o) OUTPUT_DIR=$OPTARG;; - h) usage; - exit 0;; - \?) usage - exit 1;; - *) usage - exit 1;; - esac -done -shift $(($OPTIND - 1)) - -if [ -n "$where" ]; then - echo $BASE_TRACE_DIR/$(ls "$BASE_TRACE_DIR" | tail -n 1) - exit 0 -fi - -# Prepare vars -CMD=$* - -# Validate input -if [ -z "$HOME" ]; -then - error "no home specified" -fi - -if [ -z "$CMD" ]; -then - error "no command specified" - usage; - exit 1 -fi - -# Create directory for trace output -if [ -n "$OUTPUT_DIR" ]; then - OUTDIR=$OUTPUT_DIR -else - DATESTRING="$(hostname)-$(date +%Y%m%d%H%M%S%N)" - OUTDIR="$BASE_TRACE_DIR/$DATESTRING" -fi - -# Check if directory exist -if [ ! -d "$OUTDIR" ]; then - mkdir -p $OUTDIR - if [ $? -eq 1 ]; then - exit 1 - fi -fi - -# Choose ust-consumerd socket path -UST_CONSUMERD_SOCKPATH="/tmp/ust-consumerd-sock-$$" - -if [ "$arg_syswide_daemon" != "1" ]; -then - pidfilepath="/tmp/usttrace-$USER-$(date +%Y%m%d%H%M%S%N)-ust-consumerd-pid" - trap "sighandler $pidfilepath" INT - mkfifo -m 0600 "$pidfilepath" - # Start daemon - ${UST_CONSUMERD} --pidfile "$pidfilepath" -s "${UST_CONSUMERD_SOCKPATH}" -o "$OUTDIR" >"$OUTDIR/ust-consumerd.log" 2>&1 & - # ust-consumerd sets up its server socket - # ust-consumerd opens the pidfile, blocks because no one has opened it - # we open pidfile - # we block reading pidfile - # ust-consumerd writes to pidfile - # ust-consumerd closes pidfile - # we unblock reading pidfile - UST_CONSUMERD_PID=`cat $pidfilepath` - export UST_DAEMON_SOCKET="${UST_CONSUMERD_SOCKPATH}" -fi - -# Establish the environment for the command -( - export UST_TRACE=1 - export UST_AUTOPROBE=1 - - if [ "$arg_preload_libust" = "1" ]; - then - if [ -n "${LIBUST_PATH%libust.so}" ]; - then - if [ -n "$LD_LIBRARY_PATH" ]; - then - export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${LIBUST_PATH%libust.so}" - else - export LD_LIBRARY_PATH="${LIBUST_PATH%libust.so}" - fi - fi - if [ -n "$LIBUST_PATH" ]; - then - if [ -n "$LD_PRELOAD" ]; - then - export LD_PRELOAD="$LD_PRELOAD:$LIBUST_PATH" - else - export LD_PRELOAD="$LIBUST_PATH" - fi - fi - fi - - if [ "$arg_ld_std_ust" = "1" ] && [ -n "${LIBUST_PATH%libust.so}" ]; - then - if [ -n "$LD_LIBRARY_PATH" ]; - then - export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${LIBUST_PATH%libust.so}" - else - export LD_LIBRARY_PATH="${LIBUST_PATH%libust.so}" - fi - fi - - if [ "$arg_preload_malloc" = "1" ] && [ -n "$LIBMALLOCWRAP_PATH" ]; - then - if [ -n "$LD_PRELOAD" ]; - then - export LD_PRELOAD="$LD_PRELOAD:$LIBMALLOCWRAP_PATH" - else - export LD_PRELOAD="$LIBMALLOCWRAP_PATH" - fi - fi - - if [ "$arg_preload_fork" = "1" ] && [ -n "$LIBINTERFORK_PATH" ]; - then - if [ -n "$LD_PRELOAD" ]; - then - export LD_PRELOAD="$LD_PRELOAD:$LIBINTERFORK_PATH" - else - export LD_PRELOAD="$LIBINTERFORK_PATH" - fi - fi - -# Execute the command - $CMD 2>&1 -) | tee "$OUTDIR/app.log" - -## Because of the keepalive mechanism, we're sure that by the time -## we get here, the daemon is connected to all the buffers that still exist. -## Therefore we can politely ask it to die when it's done. - -if [ "$arg_syswide_daemon" != "1" ]; -then - # Tell the daemon to die - kill -TERM "${UST_CONSUMERD_PID}" - - echo "Waiting for ust-consumerd to shutdown..." - wait "${UST_CONSUMERD_PID}" - - rm "$pidfilepath" -fi - -echo "Trace was output in: " $OUTDIR