X-Git-Url: https://git.lttng.org/?p=lttngtop.git;a=blobdiff_plain;f=src%2Flttngtop.c;h=7d89e5c8af12896dcc38eb36cf79251bed207cfd;hp=2857d5763c9c32f37fa97be864989b0929b4657f;hb=cade341846ca2769283fb568700b1bd2732f28d0;hpb=b872c906dbdf4780d0bad7bb01b0fa74af530d68 diff --git a/src/lttngtop.c b/src/lttngtop.c index 2857d57..7d89e5c 100644 --- a/src/lttngtop.c +++ b/src/lttngtop.c @@ -51,18 +51,16 @@ #define DEFAULT_FILE_ARRAY_SIZE 1 const char *opt_input_path; +int opt_textdump; 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; @@ -78,23 +76,25 @@ int metadata_ready = 0; 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; + 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); @@ -142,7 +142,6 @@ enum bt_cb_ret print_timestamp(struct bt_ctf_event *call_data, void *private_dat struct tm start; uint64_t ts_nsec_start; - timestamp = bt_ctf_get_timestamp(call_data); start = format_timestamp(timestamp); @@ -359,6 +358,8 @@ void init_lttngtop() 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(); @@ -388,6 +389,9 @@ static int parse_options(int argc, char **argv) usage(stdout); ret = 1; /* exit cleanly */ goto end; + case OPT_TEXTDUMP: + opt_textdump = 1; + goto end; default: ret = -EINVAL; goto end; @@ -413,56 +417,57 @@ void iter_trace(struct bt_context *bt_ctx) 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 + NULL, 0, handle_statedump_file_descriptor, + NULL, NULL, NULL); + } + while ((event = bt_ctf_iter_read_event(iter)) != NULL) { ret = bt_iter_next(bt_ctf_get_iter(iter)); if (ret < 0) @@ -763,34 +768,33 @@ end: 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, @@ -853,7 +857,7 @@ void *setup_live_tracing() /* 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) { @@ -875,8 +879,8 @@ void *setup_live_tracing() 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; @@ -891,13 +895,19 @@ void *setup_live_tracing() 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; @@ -915,18 +925,9 @@ void *setup_live_tracing() 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; } @@ -946,15 +947,22 @@ int main(int argc, char **argv) } 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); + + quit = 1; + pthread_join(display_thread, NULL); + pthread_join(timer_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();