* CPU hot-plugging is supported using inotify.
*
* Copyright 2009-2010 - Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+ * Copyright 2010 - Michael Sills-Lavoie <michael.sills-lavoie@polymtl.ca>
+ * Copyright 2010 - Oumarou Dicko <oumarou.dicko@polymtl.ca>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
*/
#ifdef HAVE_CONFIG_H
#include <stdio.h>
#include <stdlib.h>
-#include <string.h>
#include <signal.h>
#include <errno.h>
-#include <fcntl.h>
-#include <dirent.h>
-#include <sys/stat.h>
#include <liblttd/liblttd.h>
+#include <liblttd/liblttdutils.h>
-struct lttd_channel_data {
- int trace;
-};
+struct liblttd_instance* instance;
-static char path_trace[PATH_MAX];
-static char *end_path_trace;
-static int path_trace_len = 0;
static char *trace_name = NULL;
static char *channel_name = NULL;
static int daemon_mode = 0;
static int dump_normal_only = 0;
static int verbose_mode = 0;
-static __thread int thread_pipe[2];
-
-#define printf_verbose(fmt, args...) \
- do { \
- if (verbose_mode) \
- printf(fmt, ##args); \
- } while (0)
/* Args :
*
static void handler(int signo)
{
printf("Signal %d received : exiting cleanly\n", signo);
- liblttd_stop();
-}
-
-int lttd_on_open_channel(struct liblttd_callbacks *data, struct fd_pair *pair, char *relative_channel_path)
-{
- int open_ret = 0;
- int ret;
- struct stat stat_buf;
- struct lttd_channel_data *channel_data;
-
- pair->user_data = malloc(sizeof(struct lttd_channel_data));
- channel_data = pair->user_data;
-
- strncpy(end_path_trace, relative_channel_path, PATH_MAX - path_trace_len);
- printf_verbose("Creating trace file %s\n", path_trace);
-
- ret = stat(path_trace, &stat_buf);
- if(ret == 0) {
- if(append_mode) {
- printf_verbose("Appending to file %s as requested\n",
- path_trace);
-
- channel_data->trace = open(path_trace, O_WRONLY, S_IRWXU|S_IRWXG|S_IRWXO);
- if(channel_data->trace == -1) {
- perror(path_trace);
- open_ret = -1;
- goto end;
- }
- ret = lseek(channel_data->trace, 0, SEEK_END);
- if (ret < 0) {
- perror(path_trace);
- open_ret = -1;
- close(channel_data->trace);
- goto end;
- }
- } else {
- printf("File %s exists, cannot open. Try append mode.\n", path_trace);
- open_ret = -1;
- goto end;
- }
- } else {
- if(errno == ENOENT) {
- channel_data->trace = open(path_trace, O_WRONLY|O_CREAT|O_EXCL, S_IRWXU|S_IRWXG|S_IRWXO);
- if(channel_data->trace == -1) {
- perror(path_trace);
- open_ret = -1;
- goto end;
- }
- }
- }
-
-end:
- return open_ret;
-
-}
-
-int lttd_on_close_channel(struct liblttd_callbacks *data, struct fd_pair *pair)
-{
- int ret;
- ret = close(((struct lttd_channel_data *)(pair->user_data))->trace);
- free(pair->user_data);
- return ret;
-}
-
-int lttd_on_new_channels_folder(struct liblttd_callbacks *data, char *relative_folder_path)
-{
- int ret;
- int open_ret = 0;
-
- strncpy(end_path_trace, relative_folder_path, PATH_MAX - path_trace_len);
- printf_verbose("Creating trace subdirectory %s\n", path_trace);
-
- ret = mkdir(path_trace, S_IRWXU|S_IRWXG|S_IRWXO);
- if(ret == -1) {
- if(errno != EEXIST) {
- perror(path_trace);
- open_ret = -1;
- goto end;
- }
- }
-
-end:
- return open_ret;
-}
-
-int lttd_on_read_subbuffer(struct liblttd_callbacks *data, struct fd_pair *pair, unsigned int len)
-{
- long ret;
- off_t offset = 0;
-
- while (len > 0) {
- printf_verbose("splice chan to pipe offset %lu\n",
- (unsigned long)offset);
- ret = splice(pair->channel, &offset, thread_pipe[1], NULL,
- len, SPLICE_F_MOVE | SPLICE_F_MORE);
- printf_verbose("splice chan to pipe ret %ld\n", ret);
- if (ret < 0) {
- perror("Error in relay splice");
- goto write_error;
- }
- ret = splice(thread_pipe[0], NULL,
- ((struct lttd_channel_data *)(pair->user_data))->trace,
- NULL, ret, SPLICE_F_MOVE | SPLICE_F_MORE);
- printf_verbose("splice pipe to file %ld\n", ret);
- if (ret < 0) {
- perror("Error in file splice");
- goto write_error;
- }
- len -= ret;
- }
-
-write_error:
- return ret;
-}
-
-int on_new_thread(struct liblttd_callbacks *data, unsigned long thread_num) {
- int ret;
- ret = pipe(thread_pipe);
- if (ret < 0) {
- perror("Error creating pipe");
- return ret;
- }
- return 0;
-}
-
-int on_close_thread(struct liblttd_callbacks *data, unsigned long thread_num) {
- close(thread_pipe[0]); /* close read end */
- close(thread_pipe[1]); /* close write end */
- return 0;
+ liblttd_stop_instance(instance);
}
int main(int argc, char ** argv)
int ret = 0;
struct sigaction act;
- struct liblttd_callbacks callbacks = {
- lttd_on_open_channel,
- lttd_on_close_channel,
- lttd_on_new_channels_folder,
- lttd_on_read_subbuffer,
- NULL,
- on_new_thread,
- on_close_thread,
- NULL
- };
-
ret = parse_arguments(argc, argv);
if(ret != 0) show_arguments();
}
}
- strncpy(path_trace, trace_name, PATH_MAX-1);
- path_trace_len = strlen(path_trace);
- end_path_trace = path_trace + path_trace_len;
+ struct liblttd_callbacks* callbacks = liblttdutils_local_new_callbacks(
+ trace_name, append_mode, verbose_mode);
+
+ instance = liblttd_new_instance(callbacks, channel_name, num_threads,
+ dump_flight_only, dump_normal_only, verbose_mode);
+
+ if(!instance) {
+ perror("An error occured while creating the liblttd instance");
+ return ret;
+ }
- liblttd_start(channel_name, num_threads, dump_flight_only, dump_normal_only,
- verbose_mode, &callbacks);
+ liblttd_start_instance(instance);
return ret;
}