LttvTraceset *lttv_traceset_copy(LttvTraceset *s_orig) { guint i; LttvTraceset *s; LttvTrace * trace; s = g_new(LttvTraceset, 1); s->filename = NULL; s->common_path = strdup(s_orig->common_path); s->traces = g_ptr_array_new(); s->state_trace_handle_index = g_ptr_array_new(); for(i=0;i<s_orig->traces->len;i++) { trace = g_ptr_array_index(s_orig->traces, i); trace->ref_count++; /* WARNING: this is an alias, not a copy. */ g_ptr_array_add(s->traces, trace); g_ptr_array_set_size(s->state_trace_handle_index,trace->id+1); g_ptr_array_index(s->state_trace_handle_index,trace->id) = trace->state; } s->context = s_orig->context; bt_context_get(s->context); s->a = LTTV_ATTRIBUTE(lttv_iattribute_deep_copy(LTTV_IATTRIBUTE(s_orig->a))); return s; }
int bt_iter_init(struct bt_iter *iter, struct bt_context *ctx, const struct bt_iter_pos *begin_pos, const struct bt_iter_pos *end_pos) { int i; int ret = 0; if (!iter || !ctx || !ctx->tc || !ctx->tc->array) return -EINVAL; if (ctx->current_iterator) { ret = -1; goto error_ctx; } iter->stream_heap = g_new(struct ptr_heap, 1); iter->end_pos = end_pos; bt_context_get(ctx); iter->ctx = ctx; ret = bt_heap_init(iter->stream_heap, 0, stream_compare); if (ret < 0) goto error_heap_init; for (i = 0; i < ctx->tc->array->len; i++) { struct bt_trace_descriptor *td_read; td_read = g_ptr_array_index(ctx->tc->array, i); if (!td_read) continue; ret = bt_iter_add_trace(iter, td_read); if (ret < 0) goto error; } ctx->current_iterator = iter; if (begin_pos && begin_pos->type != BT_SEEK_BEGIN) { ret = bt_iter_set_pos(iter, begin_pos); if (ret) { goto error; } } return ret; error: bt_heap_free(iter->stream_heap); error_heap_init: g_free(iter->stream_heap); iter->stream_heap = NULL; error_ctx: return ret; }