-void live_consume(struct bt_context **bt_ctx)
-{
- int ret;
- FILE *metadata_fp;
-
- sem_wait(&metadata_available);
- if (access("/tmp/livesession/kernel/metadata", F_OK) != 0) {
- fprintf(stderr,"no metadata\n");
- goto end;
- }
- metadata_fp = fopen("/tmp/livesession/kernel/metadata", "r");
-
- *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");
- goto end;
- }
-
-end:
- return;
-}
-
-int setup_consumer(char *command_sock_path, pthread_t *threads,
- struct lttng_consumer_local_data *ctx)
-{
- int ret = 0;
-
- ctx = helper_lttng_consumer_create(HELPER_LTTNG_CONSUMER_KERNEL,
- read_subbuffer, NULL, on_recv_fd, on_update_fd);
- if (!ctx)
- goto end;
-
- unlink(command_sock_path);
- helper_lttng_consumer_set_command_sock_path(ctx, command_sock_path);
- helper_lttng_consumer_init();
-
- /* Create the thread to manage the receive of fd */
- ret = pthread_create(&threads[0], NULL, helper_lttng_consumer_thread_receive_fds,
- (void *) ctx);
- if (ret != 0) {
- 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 poll fd");
- goto end;
- }
-
-end:
- return ret;
-}
-
-int setup_live_tracing()
-{
- struct lttng_domain dom;
- struct lttng_channel chan;
- char *channel_name = "mmapchan";
- struct lttng_event ev;
- int ret = 0;
- char *command_sock_path = "/tmp/consumerd_sock";
- static pthread_t threads[2]; /* recv_fd, poll */
- struct lttng_event_context kctxpid, kctxcomm, kctxppid, kctxtid;
-
- struct lttng_handle *handle;
-
- BT_INIT_LIST_HEAD(&mmap_list.head);
-
- lttng_consumer_stream_array = g_ptr_array_new();
-
- if ((ret = setup_consumer(command_sock_path, threads, ctx)) < 0) {
- fprintf(stderr,"error setting up consumer\n");
- goto error;
- }
-
- available_snapshots = g_ptr_array_new();
-
- /* setup the session */
- dom.type = LTTNG_DOMAIN_KERNEL;
-
- ret = unlink("/tmp/livesession");
-
- lttng_destroy_session("test");
- if ((ret = lttng_create_session("test", "/tmp/livesession")) < 0) {
- fprintf(stderr,"error creating the session : %s\n",
- helper_lttcomm_get_readable_code(ret));
- goto error;
- }
-
- if ((handle = lttng_create_handle("test", &dom)) == NULL) {
- fprintf(stderr,"error creating handle\n");
- goto error_session;
- }
-
- /*
- * FIXME : need to let the
- * helper_lttng_consumer_thread_receive_fds create the
- * socket.
- * Cleaner solution ?
- */
- while (access(command_sock_path, F_OK)) {
- sleep(0.1);
- }
-
- if ((ret = lttng_register_consumer(handle, command_sock_path)) < 0) {
- fprintf(stderr,"error registering consumer : %s\n",
- helper_lttcomm_get_readable_code(ret));
- goto error_session;
- }
-
- strcpy(chan.name, channel_name);
- chan.attr.overwrite = 0;
- if (opt_pid) {
- chan.attr.subbuf_size = 32768;
- chan.attr.num_subbuf = 8;
- } else {
- chan.attr.subbuf_size = 1048576; /* 1MB */
- chan.attr.num_subbuf = 4;
- }
- chan.attr.switch_timer_interval = 0;
- chan.attr.read_timer_interval = 200;
- chan.attr.output = LTTNG_EVENT_MMAP;
-
- if ((ret = lttng_enable_channel(handle, &chan)) < 0) {
- fprintf(stderr,"error creating channel : %s\n",
- helper_lttcomm_get_readable_code(ret));
- goto error_session;
- }
-
- memset(&ev, '\0', sizeof(struct lttng_event));
- //sprintf(ev.name, "sched_switch");
- if (!opt_pid) {
- 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 error_session;
- }
- }
-
- 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 error_session;
- }
-
- kctxpid.ctx = LTTNG_EVENT_CONTEXT_PID;
- lttng_add_context(handle, &kctxpid, NULL, NULL);
- kctxtid.ctx = LTTNG_EVENT_CONTEXT_TID;
- lttng_add_context(handle, &kctxtid, NULL, NULL);
- if (!opt_pid) {
- kctxppid.ctx = LTTNG_EVENT_CONTEXT_PPID;
- lttng_add_context(handle, &kctxppid, NULL, NULL);
- kctxcomm.ctx = LTTNG_EVENT_CONTEXT_PROCNAME;
- lttng_add_context(handle, &kctxcomm, NULL, NULL);
- kctxpid.ctx = LTTNG_EVENT_CONTEXT_VPID;
- lttng_add_context(handle, &kctxpid, NULL, NULL);
- kctxtid.ctx = LTTNG_EVENT_CONTEXT_VTID;
- lttng_add_context(handle, &kctxtid, NULL, NULL);
- }
-
- if ((ret = lttng_start_tracing("test")) < 0) {
- fprintf(stderr,"error starting tracing : %s\n",
- helper_lttcomm_get_readable_code(ret));
- goto error_session;
- }
-
- helper_kernctl_buffer_flush(consumerd_metadata);
-
- /* block until metadata is ready */
- sem_init(&metadata_available, 0, 0);
-
- return 0;
-
-error_session:
- lttng_destroy_session("test");
-error:
- return -1;
-}
-