Get trace_regblock_size from metadata instead of event

In ctf trace, for each 'R' block, we save it as a "register" event,
as defined below in metadata.

event {
        name = "register";
        id = 0;
        fields := struct {
                ascii contents[440];
        };
}

Nowadays, we initialize trace_regblock_size by getting the length of
"contents" from a "register" event.  However, 'R' block may not exist
in traceframe, as a result, "register" event doesn't exist in trace file
and trace_regblock_size isn't set.

This patch changes to get trace_regblock_size from metadata (or declaration)
which always exists.

gdb:

2014-04-19  Yao Qi  <yao@codesourcery.com>

	* ctf.c (handle_id): New static variable.
	(ctf_open_dir): Get handle_id from bt_context_add_trace return
	value.  Get the declaration of event "register" and get length
	of field "contents".
This commit is contained in:
Yao Qi
2014-04-19 10:14:58 +08:00
parent dac3e7103f
commit 614d5099da
2 changed files with 29 additions and 34 deletions

View File

@ -1,3 +1,10 @@
2014-04-19 Yao Qi <yao@codesourcery.com>
* ctf.c (handle_id): New static variable.
(ctf_open_dir): Get handle_id from bt_context_add_trace return
value. Get the declaration of event "register" and get length
of field "contents".
2014-04-19 Yao Qi <yao@codesourcery.com> 2014-04-19 Yao Qi <yao@codesourcery.com>
* ctf.c (ctf_xfer_partial): Check 'name' is NULL before strcmp. * ctf.c (ctf_xfer_partial): Check 'name' is NULL before strcmp.

View File

@ -873,6 +873,7 @@ ctf_trace_file_writer_new (void)
#include <babeltrace/ctf/iterator.h> #include <babeltrace/ctf/iterator.h>
/* The struct pointer for current CTF directory. */ /* The struct pointer for current CTF directory. */
static int handle_id = -1;
static struct bt_context *ctx = NULL; static struct bt_context *ctx = NULL;
static struct bt_ctf_iter *ctf_iter = NULL; static struct bt_ctf_iter *ctf_iter = NULL;
/* The position of the first packet containing trace frame. */ /* The position of the first packet containing trace frame. */
@ -905,15 +906,16 @@ ctf_destroy (void)
static void static void
ctf_open_dir (char *dirname) ctf_open_dir (char *dirname)
{ {
int ret;
struct bt_iter_pos begin_pos; struct bt_iter_pos begin_pos;
struct bt_iter_pos *pos; struct bt_iter_pos *pos;
unsigned int count, i;
struct bt_ctf_event_decl * const *list;
ctx = bt_context_create (); ctx = bt_context_create ();
if (ctx == NULL) if (ctx == NULL)
error (_("Unable to create bt_context")); error (_("Unable to create bt_context"));
ret = bt_context_add_trace (ctx, dirname, "ctf", NULL, NULL, NULL); handle_id = bt_context_add_trace (ctx, dirname, "ctf", NULL, NULL, NULL);
if (ret < 0) if (handle_id < 0)
{ {
ctf_destroy (); ctf_destroy ();
error (_("Unable to use libbabeltrace on directory \"%s\""), error (_("Unable to use libbabeltrace on directory \"%s\""),
@ -928,42 +930,28 @@ ctf_open_dir (char *dirname)
error (_("Unable to create bt_iterator")); error (_("Unable to create bt_iterator"));
} }
/* Iterate over events, and look for an event for register block /* Look for the declaration of register block. Get the length of
to set trace_regblock_size. */ array "contents" to set trace_regblock_size. */
/* Save the current position. */ bt_ctf_get_event_decl_list (handle_id, ctx, &list, &count);
pos = bt_iter_get_pos (bt_ctf_get_iter (ctf_iter)); for (i = 0; i < count; i++)
gdb_assert (pos->type == BT_SEEK_RESTORE); 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;
while (1) bt_ctf_get_decl_fields (list[i], BT_EVENT_FIELDS, &field_list,
{ &count);
const char *name;
struct bt_ctf_event *event;
event = bt_ctf_iter_read_event (ctf_iter); 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);
name = bt_ctf_event_name (event);
if (name == NULL)
break; break;
else if (strcmp (name, "register") == 0) }
{
const struct bt_definition *scope
= bt_ctf_get_top_level_scope (event,
BT_EVENT_FIELDS);
const struct bt_definition *array
= bt_ctf_get_field (event, scope, "contents");
trace_regblock_size
= bt_ctf_get_array_len (bt_ctf_get_decl_from_def (array));
}
if (bt_iter_next (bt_ctf_get_iter (ctf_iter)) < 0)
break;
}
/* Restore the position. */
bt_iter_set_pos (bt_ctf_get_iter (ctf_iter), pos);
} }
#define SET_INT32_FIELD(EVENT, SCOPE, VAR, FIELD) \ #define SET_INT32_FIELD(EVENT, SCOPE, VAR, FIELD) \