X-Git-Url: https://git.lttng.org/?p=lttngtop.git;a=blobdiff_plain;f=src%2Flttngtop.c;h=fd23e74da416c746cf437586ecb275d3c0628a2d;hp=fde9bf30547e8a320961d4cc6c2493c7cb0330dc;hb=c78f2cdca5c8f39eddd468a7c4ec6c373ed5495e;hpb=4e6aeb3d1a8330c7486b762336f11510baaa433c diff --git a/src/lttngtop.c b/src/lttngtop.c index fde9bf3..fd23e74 100644 --- a/src/lttngtop.c +++ b/src/lttngtop.c @@ -40,6 +40,7 @@ #include #include #include +#include #include "lttngtoptypes.h" #include "cputop.h" @@ -54,12 +55,14 @@ const char *opt_input_path; 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; @@ -137,7 +140,7 @@ enum bt_cb_ret check_timestamp(struct bt_ctf_event *call_data, void *private_dat { unsigned long timestamp; - timestamp = bt_ctf_get_real_timestamp(call_data); + timestamp = bt_ctf_get_timestamp(call_data); if (timestamp == -1ULL) goto error; @@ -268,7 +271,7 @@ enum bt_cb_ret fix_process_table(struct bt_ctf_event *call_data, struct processtop *parent, *child; unsigned long timestamp; - timestamp = bt_ctf_get_real_timestamp(call_data); + timestamp = bt_ctf_get_timestamp(call_data); if (timestamp == -1ULL) goto error; @@ -643,6 +646,7 @@ int check_requirements(struct bt_context *ctx) void dump_snapshot() { +#if 0 struct lttng_consumer_stream *iter; unsigned long spos; struct mmap_stream *new_snapshot; @@ -670,6 +674,7 @@ void dump_snapshot() for (i = 0; i < lttng_consumer_stream_array->len; i++) { iter = g_ptr_array_index(lttng_consumer_stream_array, i); helper_kernctl_buffer_flush(helper_get_lttng_consumer_stream_wait_fd(iter)); + printf("Taking snapshot of fd : %d\n", helper_get_lttng_consumer_stream_wait_fd(iter)); ret = helper_lttng_consumer_take_snapshot(ctx, iter); if (ret != 0) { ret = errno; @@ -679,30 +684,30 @@ void dump_snapshot() } for (i = 0; i < lttng_consumer_stream_array->len; i++) { iter = g_ptr_array_index(lttng_consumer_stream_array, i); - //cds_list_for_each_entry(iter2, &mmap_stream_list.head, list) { - ret = helper_lttng_consumer_get_produced_snapshot(ctx, iter, &spos); if (ret != 0) { ret = errno; perror("helper_lttng_consumer_get_produced_snapshot"); goto end; } - //while (iter->last_pos < spos) { FIXME : last_pos does not exists + while (helper_get_lttng_consumer_stream_wait_last_pos(iter) < spos) { new_snapshot = g_new0(struct mmap_stream, 1); new_snapshot->fd = helper_get_lttng_consumer_stream_wait_fd(iter); - //FIXME new_snapshot->last_pos = iter->last_pos; /* not last_pos, pos for the snapshot */ -// fprintf(stderr,"ADDING AVAILABLE SNAPSHOT ON FD %d AT POSITION %lu\n", -// new_snapshot->kconsumerd_fd->wait_fd, -// new_snapshot->last_pos); + new_snapshot->last_pos = helper_get_lttng_consumer_stream_wait_last_pos(iter); + fprintf(stderr,"ADDING AVAILABLE SNAPSHOT ON FD %d AT POSITION %lu\n", + new_snapshot->fd, + new_snapshot->last_pos); g_ptr_array_add(available_snapshots, new_snapshot); - //FIXME iter->last_pos += iter->chan->max_sb_size; - //} + helper_set_lttng_consumer_stream_wait_last_pos(iter, + helper_get_lttng_consumer_stream_wait_last_pos(iter) + + helper_get_lttng_consumer_stream_chan_max_sb_size(iter)); + } } if (!metadata_ready) { -// fprintf(stderr, "BLOCKING BEFORE METADATA\n"); + fprintf(stderr, "BLOCKING BEFORE METADATA\n"); sem_wait(&metadata_available); -// fprintf(stderr,"OPENING TRACE\n"); + fprintf(stderr,"OPENING TRACE\n"); if (access("/tmp/livesession/kernel/metadata", F_OK) != 0) { fprintf(stderr,"NO METADATA FILE, SKIPPING\n"); return; @@ -711,15 +716,10 @@ void dump_snapshot() metadata_fp = fopen("/tmp/livesession/kernel/metadata", "r"); } - if (!trace_opened) { - //bt_ctx = bt_context_create(); -// ret = bt_context_add_trace(ctx, NULL, "ctf", ctf_move_mmap_pos_slow, mmap_list, metadata_fp); - trace_opened = 1; - } - //iter_trace(bt_ctx); end: return; +#endif } ssize_t read_subbuffer(struct lttng_consumer_stream *kconsumerd_fd, @@ -824,7 +824,7 @@ int on_recv_fd(struct lttng_consumer_stream *kconsumerd_fd) } g_ptr_array_add(lttng_consumer_stream_array, kconsumerd_fd); - ret = 1; + ret = 0; } else { consumerd_metadata = helper_get_lttng_consumer_stream_wait_fd(kconsumerd_fd); sessiond_metadata = helper_get_lttng_consumer_stream_key(kconsumerd_fd); @@ -835,6 +835,36 @@ end: return ret; } +void *live_consume() +{ + struct bt_context *bt_ctx = NULL; + int ret; + + while (1) { +// dump_snapshot(); + + if (!metadata_ready) { + fprintf(stderr, "BLOCKING BEFORE METADATA\n"); + sem_wait(&metadata_available); + fprintf(stderr,"OPENING TRACE\n"); + if (access("/tmp/livesession/kernel/metadata", F_OK) != 0) { + fprintf(stderr,"NO METADATA FILE, SKIPPING\n"); + return; + } + 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", + lttngtop_ctf_packet_seek, &mmap_list, metadata_fp); + trace_opened = 1; + } + iter_trace(bt_ctx); + sleep(1); + } +} int setup_consumer(char *command_sock_path, pthread_t *threads, struct lttng_consumer_local_data *ctx) @@ -854,14 +884,14 @@ int setup_consumer(char *command_sock_path, pthread_t *threads, ret = pthread_create(&threads[0], NULL, helper_lttng_consumer_thread_receive_fds, (void *) ctx); if (ret != 0) { - perror("pthread_create"); + perror("pthread_create receive fd"); goto end; } /* Create thread to manage the polling/writing of traces */ ret = pthread_create(&threads[1], NULL, helper_lttng_consumer_thread_poll_fds, (void *) ctx); if (ret != 0) { - perror("pthread_create"); + perror("pthread_create poll fd"); goto end; } @@ -869,7 +899,7 @@ end: return ret; } -int setup_live_tracing() +void *setup_live_tracing() { struct lttng_domain dom; struct lttng_channel chan; @@ -916,9 +946,9 @@ int setup_live_tracing() } strcpy(chan.name, channel_name); - chan.attr.overwrite = 1; -// chan.attr.subbuf_size = 32768; - chan.attr.subbuf_size = 1048576; /* 1MB */ + chan.attr.overwrite = 0; + 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; @@ -953,10 +983,15 @@ int setup_live_tracing() } helper_kernctl_buffer_flush(consumerd_metadata); - sleep(10); - lttng_stop_tracing("test"); - lttng_destroy_session("test"); + /* 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; + } + +// pthread_cancel(live_trace_thread); /* block until metadata is ready */ sem_init(&metadata_available, 0, 0); @@ -983,7 +1018,15 @@ int main(int argc, char **argv) if (!opt_input_path) { printf("live tracing enabled\n"); - setup_live_tracing(); + pthread_create(&live_trace_thread, NULL, setup_live_tracing, (void *) NULL); + sleep(20); + printf("STOPPING\n"); + lttng_stop_tracing("test"); + printf("DESTROYING\n"); + lttng_destroy_session("test"); + + printf("CANCELLING\n"); + pthread_cancel(live_trace_thread); goto end; } else { init_lttngtop();