Exemple #1
0
LttvTraceset *lttv_traceset_new(void)
{
	LttvTraceset *ts;
	struct bt_iter_pos begin_pos;

	ts = g_new(LttvTraceset, 1);
	ts->filename = NULL;
	ts->common_path = NULL;
	ts->traces = g_ptr_array_new();
	ts->context = bt_context_create();
	ts->a = g_object_new(LTTV_ATTRIBUTE_TYPE, NULL);

	/*Initialize iterator to the beginning of the traces*/        
	begin_pos.type = BT_SEEK_BEGIN;
	ts->iter = bt_ctf_iter_create(ts->context, &begin_pos, NULL);

	ts->event_hooks = lttv_hooks_new();

	ts->state_trace_handle_index = g_ptr_array_new();
	ts->has_precomputed_states = FALSE;

	ts->time_span.start_time = ltt_time_zero;
        ts->time_span.end_time = ltt_time_zero;
	lttv_traceset_get_time_span_real(ts);
	return ts;
}
Exemple #2
0
static void
ctf_open_dir (const char *dirname)
{
  struct bt_iter_pos begin_pos;
  struct bt_iter_pos *pos;
  unsigned int count, i;
  struct bt_ctf_event_decl * const *list;

  ctx = bt_context_create ();
  if (ctx == NULL)
    error (_("Unable to create bt_context"));
  handle_id = bt_context_add_trace (ctx, dirname, "ctf", NULL, NULL, NULL);
  if (handle_id < 0)
    {
      ctf_destroy ();
      error (_("Unable to use libbabeltrace on directory \"%s\""),
	     dirname);
    }

  begin_pos.type = BT_SEEK_BEGIN;
  ctf_iter = bt_ctf_iter_create (ctx, &begin_pos, NULL);
  if (ctf_iter == NULL)
    {
      ctf_destroy ();
      error (_("Unable to create bt_iterator"));
    }

  /* Look for the declaration of register block.  Get the length of
     array "contents" to set trace_regblock_size.  */

  bt_ctf_get_event_decl_list (handle_id, ctx, &list, &count);
  for (i = 0; i < count; i++)
    if (strcmp ("register", bt_ctf_get_decl_event_name (list[i])) == 0)
      {
	unsigned int j;
	const struct bt_ctf_field_decl * const *field_list;
	const struct bt_declaration *decl;

	bt_ctf_get_decl_fields (list[i], BT_EVENT_FIELDS, &field_list,
				&count);

	gdb_assert (count == 1);
	gdb_assert (0 == strcmp ("contents",
				 bt_ctf_get_decl_field_name (field_list[0])));
	decl = bt_ctf_get_decl_from_field_decl (field_list[0]);
	trace_regblock_size = bt_ctf_get_array_len (decl);

	break;
      }
}
static
int convert_trace(struct bt_trace_descriptor *td_write,
		  struct bt_context *ctx)
{
	struct bt_ctf_iter *iter;
	struct ctf_text_stream_pos *sout;
	struct bt_iter_pos *begin_pos = NULL, *end_pos = NULL;
	struct bt_ctf_event *ctf_event;
	int ret;

	sout = container_of(td_write, struct ctf_text_stream_pos,
			trace_descriptor);

	if (!sout->parent.event_cb) {
		return 0;
	}

	if (opt_stream_intersection) {
		iter = bt_ctf_iter_create_intersect(ctx, &begin_pos, &end_pos);
	} else {
		begin_pos = bt_iter_create_time_pos(NULL, 0);
		begin_pos->type = BT_SEEK_BEGIN;
		iter = bt_ctf_iter_create(ctx, begin_pos, NULL);
	}
	if (!iter) {
		ret = -1;
		goto error_iter;
	}
	while ((ctf_event = bt_ctf_iter_read_event(iter))) {
		ret = sout->parent.event_cb(&sout->parent, ctf_event->parent->stream);
		if (ret) {
			fprintf(stderr, "[error] Writing event failed.\n");
			goto end;
		}
		ret = bt_iter_next(bt_ctf_get_iter(iter));
		if (ret < 0) {
			goto end;
		}
	}
	ret = 0;

end:
	bt_ctf_iter_destroy(iter);
error_iter:
	bt_iter_free_pos(begin_pos);
	bt_iter_free_pos(end_pos);
	return ret;
}
struct bt_ctf_iter *bt_ctf_iter_create_intersect(struct bt_context *ctx,
		struct bt_iter_pos **inter_begin_pos,
		struct bt_iter_pos **inter_end_pos)
{
	int ret;
	uint64_t begin, end;

	/*
	 * The iterator's range is the union of each trace's intersection of
	 * streams. This means that we determine the "active" region of each
	 * trace (that is the region where all of its streams are active), and
	 * use the TraceCollection to merge all of these active regions.
	 *
	 * This results in a union of the traces' active regions.
	 */
	ret = ctf_find_tc_stream_packet_intersection_union(ctx, &begin, &end);
	if (ret == 1) {
		fprintf(stderr, "[error] No intersection found between trace files.\n");
		goto error;
	} else if (ret != 0) {
		goto error;
	}
	*inter_begin_pos = bt_iter_create_time_pos(NULL, begin);
	if (!(*inter_begin_pos)) {
		goto error;
	}
	*inter_end_pos = bt_iter_create_time_pos(NULL, end);
	if (!(*inter_end_pos)) {
		goto error;
	}

	ret = ctf_tc_set_stream_intersection_mode(ctx);
	if (ret) {
		goto error;
	}

	/*
	 * bt_ctf_iter does not take ownership of begin and end positions,
	 * so we return them to the caller who must still assume their ownership
	 * until the iterator is destroyed.
	 */
	return bt_ctf_iter_create(ctx, *inter_begin_pos,
			*inter_end_pos);
error:
	return NULL;
}