bool done_filling_string;
/* Trace and classes */
+ /* True to set IR fields */
+ bool set_ir_fields;
+
struct {
struct ctf_trace_class *tc;
struct ctf_stream_class *sc;
struct ctf_event_class *ec;
} meta;
- /* Current packet header field wrapper (NULL if not created yet) */
- bt_packet_header_field *packet_header_field;
-
- /* Current packet header field wrapper (NULL if not created yet) */
+ /* Current packet context field wrapper (NULL if not created yet) */
bt_packet_context_field *packet_context_field;
- /* Current event header field (NULL if not created yet) */
- bt_event_header_field *event_header_field;
-
/* Current packet (NULL if not created yet) */
bt_packet *packet;
/* Database of current dynamic scopes */
struct {
- bt_field *trace_packet_header;
bt_field *stream_packet_context;
- bt_field *event_header;
bt_field *event_common_context;
bt_field *event_spec_context;
bt_field *event_payload;
static
void release_event_dscopes(struct bt_msg_iter *notit)
{
- notit->dscopes.event_header = NULL;
-
- if (notit->event_header_field) {
- bt_event_header_field_release(notit->event_header_field);
- notit->event_header_field = NULL;
- }
-
notit->dscopes.event_common_context = NULL;
notit->dscopes.event_spec_context = NULL;
notit->dscopes.event_payload = NULL;
static
void release_all_dscopes(struct bt_msg_iter *notit)
{
- notit->dscopes.trace_packet_header = NULL;
-
- if (notit->packet_header_field) {
- bt_packet_header_field_release(notit->packet_header_field);
- notit->packet_header_field = NULL;
- }
-
notit->dscopes.stream_packet_context = NULL;
if (notit->packet_context_field) {
goto end;
}
- BT_ASSERT(!notit->packet_header_field);
-
- if (packet_header_fc->in_ir) {
- /*
- * Create free packet header field from trace class.
- * This field is going to be moved to the packet once we
- * create it. We cannot create the packet now because:
- *
- * 1. A packet is created from a stream.
- * 2. A stream is created from a stream class.
- * 3. We need the packet header field's content to know
- * the ID of the stream class to select.
- */
- notit->packet_header_field =
- bt_packet_header_field_create(
- notit->meta.tc->ir_tc);
- if (!notit->packet_header_field) {
- BT_LOGE_STR("Cannot create packet header field wrapper from trace class.");
- ret = BT_MSG_ITER_STATUS_ERROR;
- goto end;
- }
-
- notit->dscopes.trace_packet_header =
- bt_packet_header_field_borrow_field(
- notit->packet_header_field);
- BT_ASSERT(notit->dscopes.trace_packet_header);
- }
-
notit->cur_stream_class_id = -1;
notit->cur_event_class_id = -1;
notit->cur_data_stream_id = -1;
notit, notit->meta.tc, packet_header_fc);
ret = read_dscope_begin_state(notit, packet_header_fc,
STATE_AFTER_TRACE_PACKET_HEADER,
- STATE_DSCOPE_TRACE_PACKET_HEADER_CONTINUE,
- notit->dscopes.trace_packet_header);
+ STATE_DSCOPE_TRACE_PACKET_HEADER_CONTINUE, NULL);
if (ret < 0) {
BT_LOGW("Cannot decode packet header field: "
"notit-addr=%p, trace-class-addr=%p, "
* This field is going to be moved to the packet once we
* create it. We cannot create the packet now because a
* packet is created from a stream, and this API must be
- * able to return the packet header and context fields
- * without creating a stream
- * (bt_msg_iter_borrow_packet_header_context_fields()).
+ * able to return the packet context properties without
+ * creating a stream
+ * (bt_msg_iter_get_packet_properties()).
*/
notit->packet_context_field =
bt_packet_context_field_create(
goto end;
}
- if (event_header_fc->in_ir) {
- BT_ASSERT(!notit->event_header_field);
- notit->event_header_field =
- bt_event_header_field_create(
- notit->meta.sc->ir_sc);
- if (!notit->event_header_field) {
- BT_LOGE_STR("Cannot create event header field wrapper from trace class.");
- status = BT_MSG_ITER_STATUS_ERROR;
- goto end;
- }
-
- notit->dscopes.event_header =
- bt_event_header_field_borrow_field(
- notit->event_header_field);
- BT_ASSERT(notit->dscopes.event_header);
- }
-
BT_LOGV("Decoding event header field: "
"notit-addr=%p, stream-class-addr=%p, "
"stream-class-id=%" PRId64 ", "
event_header_fc);
status = read_dscope_begin_state(notit, event_header_fc,
STATE_AFTER_EVENT_HEADER,
- STATE_DSCOPE_EVENT_HEADER_CONTINUE,
- notit->dscopes.event_header);
+ STATE_DSCOPE_EVENT_HEADER_CONTINUE, NULL);
if (status < 0) {
BT_LOGW("Cannot decode event header field: "
"notit-addr=%p, stream-class-addr=%p, "
notit->event = bt_message_event_borrow_event(
notit->event_msg);
BT_ASSERT(notit->event);
-
- if (notit->event_header_field) {
- int ret;
-
- BT_ASSERT(notit->event);
- ret = bt_event_move_header_field(notit->event,
- notit->event_header_field);
- if (ret) {
- status = BT_MSG_ITER_STATUS_ERROR;
- goto end;
- }
-
- notit->event_header_field = NULL;
-
- /*
- * At this point notit->dscopes.event_header has
- * the same value as the event header field within
- * notit->event.
- */
- BT_ASSERT(bt_event_borrow_header_field(
- notit->event) == notit->dscopes.event_header);
- }
-
notit->state = STATE_DSCOPE_EVENT_COMMON_CONTEXT_BEGIN;
end:
release_all_dscopes(notit);
notit->cur_dscope_field = NULL;
- if (notit->packet_header_field) {
- bt_packet_header_field_release(notit->packet_header_field);
- notit->packet_header_field = NULL;
- }
-
if (notit->packet_context_field) {
bt_packet_context_field_release(notit->packet_context_field);
notit->packet_context_field = NULL;
}
- if (notit->event_header_field) {
- bt_event_header_field_release(notit->event_header_field);
- notit->event_header_field = NULL;
- }
-
notit->buf.addr = NULL;
notit->buf.sz = 0;
notit->buf.at = 0;
"notit-addr=%p, bfcr-addr=%p, fc-addr=%p, "
"fc-type=%d, fc-in-ir=%d, value=%f",
notit, notit->bfcr, fc, fc->type, fc->in_ir, value);
- BT_ASSERT(fc->in_ir);
+
+ if (unlikely(!fc->in_ir)) {
+ goto end;
+ }
+
field = borrow_next_field(notit);
BT_ASSERT(field);
BT_ASSERT(bt_field_borrow_class_const(field) == fc->ir_fc);
BT_FIELD_CLASS_TYPE_REAL);
bt_field_real_set_value(field, value);
stack_top(notit->stack)->index++;
+
+end:
return status;
}
"fc-type=%d, fc-in-ir=%d",
notit, notit->bfcr, fc, fc->type, fc->in_ir);
- BT_ASSERT(fc->in_ir);
+ if (unlikely(!fc->in_ir)) {
+ goto end;
+ }
+
field = borrow_next_field(notit);
BT_ASSERT(field);
BT_ASSERT(bt_field_borrow_class_const(field) == fc->ir_fc);
* subsequent call to bfcr_string_end_cb().
*/
stack_push(notit->stack, field);
+
+end:
return BT_BFCR_STATUS_OK;
}
"fc-type=%d, fc-in-ir=%d, string-length=%zu",
notit, notit->bfcr, fc, fc->type, fc->in_ir,
len);
- BT_ASSERT(fc->in_ir);
+
+ if (unlikely(!fc->in_ir)) {
+ goto end;
+ }
+
field = stack_top(notit->stack)->base;
BT_ASSERT(field);
"notit-addr=%p, bfcr-addr=%p, fc-addr=%p, "
"fc-type=%d, fc-in-ir=%d",
notit, notit->bfcr, fc, fc->type, fc->in_ir);
- BT_ASSERT(fc->in_ir);
+
+ if (unlikely(!fc->in_ir)) {
+ goto end;
+ }
/* Pop string field */
stack_pop(notit->stack);
/* Go to next field */
stack_top(notit->stack)->index++;
+
+end:
return BT_BFCR_STATUS_OK;
}
notit->packet, notit->snapshots.end_clock);
}
- if (notit->packet_header_field) {
- ret = bt_packet_move_header_field(
- notit->packet, notit->packet_header_field);
- if (ret) {
- goto end;
- }
-
- notit->packet_header_field = NULL;
-
- /*
- * At this point notit->dscopes.trace_packet_header has
- * the same value as the packet header field within
- * notit->packet.
- */
- BT_ASSERT(bt_packet_borrow_header_field(
- notit->packet) ==
- notit->dscopes.trace_packet_header);
- }
-
if (notit->packet_context_field) {
ret = bt_packet_move_context_field(
notit->packet, notit->packet_context_field);
notit->packet_context_field = NULL;
/*
- * At this point notit->dscopes.trace_packet_header has
- * the same value as the packet header field within
+ * At this point notit->dscopes.stream_packet_context
+ * has the same value as the packet context field within
* notit->packet.
*/
BT_ASSERT(bt_packet_borrow_context_field(
return status;
}
-BT_HIDDEN
-enum bt_msg_iter_status bt_msg_iter_borrow_packet_header_context_fields(
- struct bt_msg_iter *notit,
- bt_field **packet_header_field,
- bt_field **packet_context_field)
+static
+enum bt_msg_iter_status read_packet_header_context_fields(
+ struct bt_msg_iter *notit)
{
int ret;
enum bt_msg_iter_status status = BT_MSG_ITER_STATUS_OK;
if (notit->state == STATE_EMIT_MSG_NEW_PACKET) {
/* We're already there */
- goto set_fields;
+ goto end;
}
while (true) {
* Packet header and context fields are
* potentially decoded (or they don't exist).
*/
- goto set_fields;
+ goto end;
case STATE_INIT:
case STATE_EMIT_MSG_NEW_STREAM:
case STATE_DSCOPE_TRACE_PACKET_HEADER_BEGIN:
}
}
-set_fields:
+end:
ret = set_current_packet_content_sizes(notit);
if (ret) {
status = BT_MSG_ITER_STATUS_ERROR;
goto end;
}
- if (packet_header_field) {
- *packet_header_field = notit->dscopes.trace_packet_header;
- }
-
- if (packet_context_field) {
- *packet_context_field = notit->dscopes.stream_packet_context;
- }
-
-end:
return status;
}
struct bt_msg_iter *notit,
struct bt_msg_iter_packet_properties *props)
{
+ enum bt_msg_iter_status status;
+
BT_ASSERT(notit);
BT_ASSERT(props);
+ status = read_packet_header_context_fields(notit);
+ if (status != BT_MSG_ITER_STATUS_OK) {
+ goto end;
+ }
props->exp_packet_total_size =
(uint64_t) notit->cur_exp_packet_total_size;
props->snapshots.packets = notit->snapshots.packets;
props->snapshots.beginning_clock = notit->snapshots.beginning_clock;
props->snapshots.end_clock = notit->snapshots.end_clock;
- return BT_MSG_ITER_STATUS_OK;
+
+end:
+ return status;
}