static void ctf_live_packet_seek(struct bt_stream_pos *stream_pos,
size_t index, int whence);
-static void add_traces(gpointer key, gpointer value, gpointer user_data);
+static int add_traces(struct lttng_live_ctx *ctx);
static int del_traces(gpointer key, gpointer value, gpointer user_data);
static int get_new_metadata(struct lttng_live_ctx *ctx,
struct lttng_live_viewer_stream *viewer_stream,
int ret = 0;
trace = g_hash_table_lookup(stream->session->ctf_traces,
- (gpointer) ctf_trace_id);
+ &ctf_trace_id);
if (!trace) {
trace = g_new0(struct lttng_live_ctf_trace, 1);
trace->ctf_trace_id = ctf_trace_id;
trace->streams = g_ptr_array_new();
g_hash_table_insert(stream->session->ctf_traces,
- (gpointer) ctf_trace_id,
+ &trace->ctf_trace_id,
trace);
}
if (stream->metadata_flag)
goto error;
}
if (ret_len != sizeof(rp)) {
- fprintf(stderr, "[error] get_data_packet: expected %" PRId64
- ", received %" PRId64 "\n", sizeof(rp),
+ fprintf(stderr, "[error] get_data_packet: expected %zu"
+ ", received %zd\n", sizeof(rp),
ret_len);
goto error;
}
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)
+ if (ret < 0) {
goto error;
- else if (ret > 0)
- g_hash_table_foreach(ctx->session->ctf_traces,
- add_traces, ctx->bt_ctx);
+ } else if (ret > 0) {
+ ret = add_traces(ctx);
+ if (ret < 0) {
+ goto error;
+ }
+ }
}
if (rp.flags & (LTTNG_VIEWER_FLAG_NEW_METADATA
| LTTNG_VIEWER_FLAG_NEW_STREAM)) {
}
do {
+ if (lttng_live_should_quit()) {
+ ret = -1;
+ goto error;
+ }
/*
* get_one_metadata_packet returns the number of bytes
* received, 0 when we have received everything, a
if (rp->flags & LTTNG_VIEWER_FLAG_NEW_STREAM) {
printf_verbose("get_next_index: need new streams\n");
ret = ask_new_streams(ctx);
- if (ret < 0)
+ if (ret < 0) {
goto error;
- else if (ret > 0)
- g_hash_table_foreach(ctx->session->ctf_traces,
- add_traces, ctx->bt_ctx);
+ } else if (ret > 0) {
+ ret = add_traces(ctx);
+ if (ret < 0) {
+ goto error;
+ }
+ }
}
break;
case LTTNG_VIEWER_INDEX_RETRY:
}
static
-void add_traces(gpointer key, gpointer value, gpointer user_data)
+int add_one_trace(struct lttng_live_ctx *ctx,
+ struct lttng_live_ctf_trace *trace)
{
int i, ret;
- struct bt_context *bt_ctx = user_data;
- struct lttng_live_ctf_trace *trace = value;
+ struct bt_context *bt_ctx = ctx->bt_ctx;
struct lttng_live_viewer_stream *stream;
struct bt_mmap_stream *new_mmap_stream;
struct bt_mmap_stream_list mmap_list;
- struct lttng_live_ctx *ctx = NULL;
struct bt_trace_descriptor *td;
struct bt_trace_handle *handle;
* times the same traces.
* If a trace is already in the context, we just skip this function.
*/
- if (trace->in_use)
- return;
+ if (trace->in_use) {
+ ret = 0;
+ goto end;
+ }
BT_INIT_LIST_HEAD(&mmap_list.head);
for (i = 0; i < trace->streams->len; i++) {
stream = g_ptr_array_index(trace->streams, i);
- ctx = stream->session->ctx;
if (!stream->metadata_flag) {
new_mmap_stream = zmalloc(sizeof(struct bt_mmap_stream));
if (!trace->metadata_fp) {
fprintf(stderr, "[error] No metadata stream opened\n");
+ ret = -1;
goto end_free;
}
ctf_live_packet_seek, &mmap_list, trace->metadata_fp);
if (ret < 0) {
fprintf(stderr, "[error] Error adding trace\n");
+ ret = -1;
goto end_free;
}
trace->metadata_stream->metadata_len = 0;
end_free:
bt_context_put(bt_ctx);
end:
- return;
+ return ret;
+}
+
+static
+int add_traces(struct lttng_live_ctx *ctx)
+{
+ int ret;
+ struct lttng_live_ctf_trace *trace;
+ GHashTableIter it;
+ gpointer key;
+ gpointer value;
+
+ g_hash_table_iter_init(&it, ctx->session->ctf_traces);
+ while (g_hash_table_iter_next(&it, &key, &value)) {
+ trace = (struct lttng_live_ctf_trace *) value;
+ ret = add_one_trace(ctx, trace);
+ if (ret < 0) {
+ goto end;
+ }
+ }
+
+ ret = 0;
+
+end:
+ return ret;
}
/*
for (i = 0; i < ctx->session_ids->len; i++) {
id = g_array_index(ctx->session_ids, uint64_t, i);
- printf_verbose("Attaching to session %lu\n", id);
+ printf_verbose("Attaching to session %" PRIu64 "\n", id);
ret = lttng_live_attach_session(ctx, id);
printf_verbose("Attaching session returns %d\n", ret);
if (ret < 0) {
}
}
- g_hash_table_foreach(ctx->session->ctf_traces, add_traces,
- ctx->bt_ctx);
+ ret = add_traces(ctx);
+ if (ret < 0) {
+ goto end_free;
+ }
begin_pos.type = BT_SEEK_BEGIN;
iter = bt_ctf_iter_create(ctx->bt_ctx, &begin_pos, NULL);