Пример #1
0
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;
}
Пример #2
0
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;
}