#define DEFAULT_FILE_ARRAY_SIZE 1
const char *opt_input_path;
+int opt_textdump;
+
+int quit = 0;
struct lttngtop *copy;
pthread_t display_thread;
pthread_t timer_thread;
-pthread_t live_trace_thread;
unsigned long refresh_display = 1 * NSEC_PER_SEC;
unsigned long last_display_update = 0;
-int quit = 0;
-/* LIVE */
-pthread_t thread_live_consume;
/* list of FDs available for being read with snapshots */
struct mmap_stream_list mmap_list;
GPtrArray *lttng_consumer_stream_array;
enum {
OPT_NONE = 0,
OPT_HELP,
- OPT_LIST,
- OPT_VERBOSE,
- OPT_DEBUG,
- OPT_NAMES,
+ OPT_TEXTDUMP,
};
static struct poptOption long_options[] = {
/* longName, shortName, argInfo, argPtr, value, descrip, argDesc */
{ "help", 'h', POPT_ARG_NONE, NULL, OPT_HELP, NULL, NULL },
+ { "textdump", 't', POPT_ARG_NONE, NULL, OPT_TEXTDUMP, NULL, NULL },
{ NULL, 0, 0, NULL, 0, NULL, NULL },
};
void *refresh_thread(void *p)
{
+ struct mmap_stream *mmap_info;
+
while (1) {
- if (quit)
- return NULL;
+ if (quit) {
+ sem_post(&pause_sem);
+ sem_post(&timer);
+ sem_post(&goodtodisplay);
+ pthread_exit(0);
+ }
+ bt_list_for_each_entry(mmap_info, &mmap_list.head, list)
+ helper_kernctl_buffer_flush(mmap_info->fd);
sem_wait(&pause_sem);
sem_post(&pause_sem);
sem_post(&timer);
sem_wait(&goodtodisplay);
sem_wait(&pause_sem);
+ if (quit) {
+ reset_ncurses();
+ pthread_exit(0);
+ }
+
+
copy = g_ptr_array_index(copies, current_display_index);
assert(copy);
display(current_display_index++);
sem_post(&goodtoupdate);
sem_post(&pause_sem);
-
- if (quit) {
- reset_ncurses();
- pthread_exit(0);
- }
}
}
struct tm start;
uint64_t ts_nsec_start;
-
timestamp = bt_ctf_get_timestamp(call_data);
start = format_timestamp(timestamp);
lttngtop.nbthreads = 0;
lttngtop.nbfiles = 0;
+ lttngtop.process_hash_table = g_hash_table_new(g_direct_hash,
+ g_direct_equal);
lttngtop.process_table = g_ptr_array_new();
lttngtop.files_table = g_ptr_array_new();
lttngtop.cpu_table = g_ptr_array_new();
usage(stdout);
ret = 1; /* exit cleanly */
goto end;
+ case OPT_TEXTDUMP:
+ opt_textdump = 1;
+ goto end;
default:
ret = -EINVAL;
goto end;
begin_pos.type = BT_SEEK_BEGIN;
iter = bt_ctf_iter_create(bt_ctx, &begin_pos, NULL);
- bt_ctf_iter_add_callback(iter, 0, NULL, 0,
- print_timestamp,
- NULL, NULL, NULL);
-
-#if 0
- /* at each event check if we need to refresh */
- bt_ctf_iter_add_callback(iter, 0, NULL, 0,
- check_timestamp,
- NULL, NULL, NULL);
- /* at each event, verify the status of the process table */
- bt_ctf_iter_add_callback(iter, 0, NULL, 0,
- fix_process_table,
- NULL, NULL, NULL);
- /* to handle the scheduling events */
- bt_ctf_iter_add_callback(iter,
- g_quark_from_static_string("sched_switch"),
- NULL, 0, handle_sched_switch, NULL, NULL, NULL);
- /* to clean up the process table */
- bt_ctf_iter_add_callback(iter,
- g_quark_from_static_string("sched_process_free"),
- NULL, 0, handle_sched_process_free, NULL, NULL, NULL);
- /* to get all the process from the statedumps */
- bt_ctf_iter_add_callback(iter,
- g_quark_from_static_string(
- "lttng_statedump_process_state"),
- NULL, 0, handle_statedump_process_state,
- NULL, NULL, NULL);
-
- /* for IO top */
- bt_ctf_iter_add_callback(iter,
- g_quark_from_static_string("exit_syscall"),
- NULL, 0, handle_exit_syscall, NULL, NULL, NULL);
- bt_ctf_iter_add_callback(iter,
- g_quark_from_static_string("sys_write"),
- NULL, 0, handle_sys_write, NULL, NULL, NULL);
- bt_ctf_iter_add_callback(iter,
- g_quark_from_static_string("sys_read"),
- NULL, 0, handle_sys_read, NULL, NULL, NULL);
- bt_ctf_iter_add_callback(iter,
- g_quark_from_static_string("sys_open"),
- NULL, 0, handle_sys_open, NULL, NULL, NULL);
- bt_ctf_iter_add_callback(iter,
- g_quark_from_static_string("sys_close"),
- NULL, 0, handle_sys_close, NULL, NULL, NULL);
- bt_ctf_iter_add_callback(iter,
- g_quark_from_static_string(
+ if (opt_textdump) {
+ bt_ctf_iter_add_callback(iter, 0, NULL, 0,
+ print_timestamp,
+ NULL, NULL, NULL);
+ } else {
+ /* at each event check if we need to refresh */
+ bt_ctf_iter_add_callback(iter, 0, NULL, 0,
+ check_timestamp,
+ NULL, NULL, NULL);
+ /* at each event, verify the status of the process table */
+ bt_ctf_iter_add_callback(iter, 0, NULL, 0,
+ fix_process_table,
+ NULL, NULL, NULL);
+ /* to handle the scheduling events */
+ bt_ctf_iter_add_callback(iter,
+ g_quark_from_static_string("sched_switch"),
+ NULL, 0, handle_sched_switch, NULL, NULL, NULL);
+ /* to clean up the process table */
+ bt_ctf_iter_add_callback(iter,
+ g_quark_from_static_string("sched_process_free"),
+ NULL, 0, handle_sched_process_free, NULL, NULL, NULL);
+ /* to get all the process from the statedumps */
+ bt_ctf_iter_add_callback(iter,
+ g_quark_from_static_string(
+ "lttng_statedump_process_state"),
+ NULL, 0, handle_statedump_process_state,
+ NULL, NULL, NULL);
+
+ /* for IO top */
+ bt_ctf_iter_add_callback(iter,
+ g_quark_from_static_string("exit_syscall"),
+ NULL, 0, handle_exit_syscall, NULL, NULL, NULL);
+ bt_ctf_iter_add_callback(iter,
+ g_quark_from_static_string("sys_write"),
+ NULL, 0, handle_sys_write, NULL, NULL, NULL);
+ bt_ctf_iter_add_callback(iter,
+ g_quark_from_static_string("sys_read"),
+ NULL, 0, handle_sys_read, NULL, NULL, NULL);
+ bt_ctf_iter_add_callback(iter,
+ g_quark_from_static_string("sys_open"),
+ NULL, 0, handle_sys_open, NULL, NULL, NULL);
+ bt_ctf_iter_add_callback(iter,
+ g_quark_from_static_string("sys_close"),
+ NULL, 0, handle_sys_close, NULL, NULL, NULL);
+ bt_ctf_iter_add_callback(iter,
+ g_quark_from_static_string(
"lttng_statedump_file_descriptor"),
- NULL, 0, handle_statedump_file_descriptor,
- NULL, NULL, NULL);
-#endif
- while ((event = bt_ctf_iter_read_event(iter)) != NULL) {
+ NULL, 0, handle_statedump_file_descriptor,
+ NULL, NULL, NULL);
+ }
+
+ while (((event = bt_ctf_iter_read_event(iter)) != NULL)) {
+ if (quit)
+ goto end_iter;
ret = bt_iter_next(bt_ctf_get_iter(iter));
if (ret < 0)
goto end_iter;
return ret;
}
-void *live_consume()
+void live_consume(struct bt_context **bt_ctx)
{
- struct bt_context *bt_ctx = NULL;
int ret;
if (!metadata_ready) {
sem_wait(&metadata_available);
if (access("/tmp/livesession/kernel/metadata", F_OK) != 0) {
fprintf(stderr,"no metadata\n");
- return NULL;
+ goto end;
}
metadata_ready = 1;
metadata_fp = fopen("/tmp/livesession/kernel/metadata", "r");
}
if (!trace_opened) {
- bt_ctx = bt_context_create();
- ret = bt_context_add_trace(bt_ctx, NULL, "ctf",
+ *bt_ctx = bt_context_create();
+ ret = bt_context_add_trace(*bt_ctx, NULL, "ctf",
lttngtop_ctf_packet_seek, &mmap_list, metadata_fp);
if (ret < 0) {
printf("Error adding trace\n");
- return NULL;
+ goto end;
}
trace_opened = 1;
}
- iter_trace(bt_ctx);
- return NULL;
+end:
+ return;
}
int setup_consumer(char *command_sock_path, pthread_t *threads,
/* setup the session */
dom.type = LTTNG_DOMAIN_KERNEL;
- ret = system("rm -rf /tmp/livesession");
+ ret = unlink("/tmp/livesession");
lttng_destroy_session("test");
if ((ret = lttng_create_session("test", "/tmp/livesession")) < 0) {
strcpy(chan.name, channel_name);
chan.attr.overwrite = 0;
- chan.attr.subbuf_size = 32768;
-// chan.attr.subbuf_size = 1048576; /* 1MB */
+// chan.attr.subbuf_size = 32768;
+ chan.attr.subbuf_size = 1048576; /* 1MB */
chan.attr.num_subbuf = 4;
chan.attr.switch_timer_interval = 0;
chan.attr.read_timer_interval = 200;
memset(&ev, '\0', sizeof(struct lttng_event));
//sprintf(ev.name, "sched_switch");
ev.type = LTTNG_EVENT_TRACEPOINT;
-
if ((ret = lttng_enable_event(handle, &ev, channel_name)) < 0) {
fprintf(stderr,"error enabling event : %s\n",
helper_lttcomm_get_readable_code(ret));
goto end;
}
+ ev.type = LTTNG_EVENT_SYSCALL;
+ if ((ret = lttng_enable_event(handle, &ev, channel_name)) < 0) {
+ fprintf(stderr,"error enabling syscalls : %s\n",
+ helper_lttcomm_get_readable_code(ret));
+ goto end;
+ }
+
kctxpid.ctx = LTTNG_EVENT_CONTEXT_PID;
lttng_add_context(handle, &kctxpid, NULL, NULL);
kctxppid.ctx = LTTNG_EVENT_CONTEXT_PPID;
helper_kernctl_buffer_flush(consumerd_metadata);
- /* Create thread to manage the polling/writing of traces */
- ret = pthread_create(&thread_live_consume, NULL, live_consume, NULL);
- if (ret != 0) {
- perror("pthread_create");
- goto end;
- }
-
/* block until metadata is ready */
sem_init(&metadata_available, 0, 0);
- //init_lttngtop();
-
end:
return NULL;
}
}
if (!opt_input_path) {
- pthread_create(&live_trace_thread, NULL, setup_live_tracing, (void *) NULL);
- sleep(2000);
- printf("STOPPING\n");
+ setup_live_tracing();
+ init_lttngtop();
+ if (!opt_textdump) {
+ pthread_create(&display_thread, NULL, ncurses_display, (void *) NULL);
+ pthread_create(&timer_thread, NULL, refresh_thread, (void *) NULL);
+ }
+ live_consume(&bt_ctx);
+ iter_trace(bt_ctx);
+
+ pthread_join(timer_thread, NULL);
+ quit = 1;
+ pthread_join(display_thread, NULL);
+
lttng_stop_tracing("test");
- printf("DESTROYING\n");
lttng_destroy_session("test");
- printf("CANCELLING\n");
- pthread_cancel(live_trace_thread);
goto end;
} else {
init_lttngtop();
iter_trace(bt_ctx);
- quit = 1;
pthread_join(display_thread, NULL);
+ quit = 1;
pthread_join(timer_thread, NULL);
}