X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=formats%2Flttng-live%2Flttng-live-comm.c;h=945df4317bdec9d0ca1aa324405f110d229d8143;hb=f312b3aa35382b62e9f8bd2c4cbdd9180490845e;hp=785f5f37022609a702cddf3341e20b32611d0d1c;hpb=b7e8a8e17de9b9e5b717d8b664b8385a2562aee8;p=babeltrace.git diff --git a/formats/lttng-live/lttng-live-comm.c b/formats/lttng-live/lttng-live-comm.c index 785f5f37..945df431 100644 --- a/formats/lttng-live/lttng-live-comm.c +++ b/formats/lttng-live/lttng-live-comm.c @@ -33,6 +33,7 @@ #include #include #include +#include #include @@ -54,6 +55,8 @@ #include "lttng-live.h" #include "lttng-viewer-abi.h" +#define ACTIVE_POLL_DELAY 100 /* ms */ + /* * Memory allocation zeroed */ @@ -586,10 +589,12 @@ int append_metadata(struct lttng_live_ctx *ctx, ret = ctf_append_trace_metadata( viewer_stream->ctf_trace->handle->td, metadata->ctf_trace->metadata_fp); - if (ret != 0) { + /* We accept empty metadata packets */ + if (ret != 0 && ret != -ENOENT) { fprintf(stderr, "[error] Appending metadata\n"); goto error; } + ret = 0; error: return ret; @@ -671,15 +676,19 @@ retry: ret = append_metadata(ctx, stream); if (ret) goto error; - goto retry; } if (rp.flags & LTTNG_VIEWER_FLAG_NEW_STREAM) { + printf_verbose("get_data_packet: new streams needed\n"); ret = ask_new_streams(ctx); if (ret < 0) goto error; g_hash_table_foreach(ctx->session->ctf_traces, add_traces, ctx->bt_ctx); } + if (rp.flags & (LTTNG_VIEWER_FLAG_NEW_METADATA + | LTTNG_VIEWER_FLAG_NEW_STREAM)) { + goto retry; + } fprintf(stderr, "[error] get_data_packet: error\n"); ret = -1; goto end; @@ -740,7 +749,7 @@ retry: goto error; } assert(ret_len == len); - + ret = 0; end: error: return ret; @@ -869,7 +878,7 @@ int get_new_metadata(struct lttng_live_ctx *ctx, { int ret = 0; struct lttng_live_viewer_stream *metadata_stream; - size_t size; + size_t size, len_read = 0;; metadata_stream = viewer_stream->ctf_trace->metadata_stream; if (!metadata_stream) { @@ -890,7 +899,13 @@ int get_new_metadata(struct lttng_live_ctx *ctx, * negative value on error. */ ret = get_one_metadata_packet(ctx, metadata_stream); - } while (ret > 0); + if (ret > 0) { + len_read += ret; + } + if (!len_read) { + (void) poll(NULL, 0, ACTIVE_POLL_DELAY); + } + } while (ret > 0 || !len_read); if (fclose(metadata_stream->metadata_fp_write)) perror("fclose"); @@ -986,7 +1001,7 @@ retry: break; case LTTNG_VIEWER_INDEX_RETRY: printf_verbose("get_next_index: retry\n"); - sleep(1); + (void) poll(NULL, 0, ACTIVE_POLL_DELAY); goto retry; case LTTNG_VIEWER_INDEX_HUP: printf_verbose("get_next_index: stream hung up\n"); @@ -1485,6 +1500,8 @@ void lttng_live_read(struct lttng_live_ctx *ctx) ret = ask_new_streams(ctx); if (ret < 0) goto end_free; + if (!ctx->session->stream_count) + (void) poll(NULL, 0, ACTIVE_POLL_DELAY); } g_hash_table_foreach(ctx->session->ctf_traces, add_traces,