size_t linebuf_len;
FILE *fp;
bt_message *tmp_event_msg;
+ uint64_t last_clock_value;
enum {
STATE_EMIT_STREAM_BEGINNING,
+ STATE_EMIT_STREAM_ACTIVITY_BEGINNING,
STATE_EMIT_PACKET_BEGINNING,
STATE_EMIT_EVENT,
STATE_EMIT_PACKET_END,
+ STATE_EMIT_STREAM_ACTIVITY_END,
STATE_EMIT_STREAM_END,
STATE_DONE,
} state;
if (has_ts) {
dmesg_comp->clock_class = bt_clock_class_create(
- dmesg_comp->trace_class);
+ bt_self_component_source_as_self_component(
+ dmesg_comp->self_comp));
if (!dmesg_comp->clock_class) {
BT_LOGE_STR("Cannot create clock class.");
goto error;
}
+ /*
+ * The `dmesg` timestamp's origin is not the Unix epoch,
+ * it's the boot time.
+ */
+ bt_clock_class_set_origin_is_unix_epoch(dmesg_comp->clock_class,
+ BT_FALSE);
+
ret = bt_stream_class_set_default_clock_class(
dmesg_comp->stream_class, dmesg_comp->clock_class);
if (ret) {
BT_LOGE_STR("Cannot set stream class's default clock class.");
goto error;
}
+
+ bt_stream_class_set_packets_have_default_beginning_clock_snapshot(
+ dmesg_comp->stream_class, BT_TRUE);
+ bt_stream_class_set_packets_have_default_end_clock_snapshot(
+ dmesg_comp->stream_class, BT_TRUE);
}
dmesg_comp->event_class = bt_event_class_create(
int create_packet_and_stream_and_trace(struct dmesg_component *dmesg_comp)
{
int ret = 0;
- const char *trace_name;
+ const char *trace_name = NULL;
gchar *basename = NULL;
dmesg_comp->trace = bt_trace_create(dmesg_comp->trace_class);
goto error;
}
- ret = bt_trace_make_static(dmesg_comp->trace);
- if (ret) {
- BT_LOGE_STR("Cannot make trace static.");
- goto error;
- }
-
goto end;
error:
bt_event_class_put_ref(dmesg_comp->event_class);
bt_stream_put_ref(dmesg_comp->stream);
bt_clock_class_put_ref(dmesg_comp->clock_class);
+ bt_trace_class_put_ref(dmesg_comp->trace_class);
g_free(dmesg_comp);
}
goto error;
}
- msg = bt_message_event_create(msg_iter->pc_msg_iter,
- dmesg_comp->event_class, dmesg_comp->packet);
+ if (dmesg_comp->clock_class) {
+ msg = bt_message_event_create_with_default_clock_snapshot(
+ msg_iter->pc_msg_iter,
+ dmesg_comp->event_class, dmesg_comp->packet, ts);
+ msg_iter->last_clock_value = ts;
+ } else {
+ msg = bt_message_event_create(msg_iter->pc_msg_iter,
+ dmesg_comp->event_class, dmesg_comp->packet);
+ }
+
if (!msg) {
BT_LOGE_STR("Cannot create event message.");
goto error;
event = bt_message_event_borrow_event(msg);
BT_ASSERT(event);
-
- if (dmesg_comp->clock_class) {
- bt_event_set_default_clock_snapshot(event, ts);
- }
-
goto end;
error:
g_free(dmesg_msg_iter);
}
+
+
BT_HIDDEN
bt_self_message_iterator_status dmesg_msg_iter_init(
bt_self_message_iterator *self_msg_iter,
if (dmesg_msg_iter->tmp_event_msg ||
dmesg_msg_iter->state == STATE_EMIT_PACKET_END ||
+ dmesg_msg_iter->state == STATE_EMIT_STREAM_ACTIVITY_END ||
dmesg_msg_iter->state == STATE_EMIT_STREAM_END) {
goto handle_state;
}
BT_ASSERT(dmesg_msg_iter->tmp_event_msg);
*msg = bt_message_stream_beginning_create(
dmesg_msg_iter->pc_msg_iter, dmesg_comp->stream);
+ dmesg_msg_iter->state = STATE_EMIT_STREAM_ACTIVITY_BEGINNING;
+ break;
+ case STATE_EMIT_STREAM_ACTIVITY_BEGINNING:
+ BT_ASSERT(dmesg_msg_iter->tmp_event_msg);
+ *msg = bt_message_stream_activity_beginning_create(
+ dmesg_msg_iter->pc_msg_iter, dmesg_comp->stream);
dmesg_msg_iter->state = STATE_EMIT_PACKET_BEGINNING;
break;
case STATE_EMIT_PACKET_BEGINNING:
BT_ASSERT(dmesg_msg_iter->tmp_event_msg);
- *msg = bt_message_packet_beginning_create(
- dmesg_msg_iter->pc_msg_iter, dmesg_comp->packet);
+
+ if (dmesg_comp->clock_class) {
+ *msg = bt_message_packet_beginning_create_with_default_clock_snapshot(
+ dmesg_msg_iter->pc_msg_iter, dmesg_comp->packet,
+ dmesg_msg_iter->last_clock_value);
+ } else {
+ *msg = bt_message_packet_beginning_create(
+ dmesg_msg_iter->pc_msg_iter, dmesg_comp->packet);
+ }
+
dmesg_msg_iter->state = STATE_EMIT_EVENT;
break;
case STATE_EMIT_EVENT:
dmesg_msg_iter->tmp_event_msg = NULL;
break;
case STATE_EMIT_PACKET_END:
- *msg = bt_message_packet_end_create(
- dmesg_msg_iter->pc_msg_iter, dmesg_comp->packet);
+ if (dmesg_comp->clock_class) {
+ *msg = bt_message_packet_end_create_with_default_clock_snapshot(
+ dmesg_msg_iter->pc_msg_iter, dmesg_comp->packet,
+ dmesg_msg_iter->last_clock_value);
+ } else {
+ *msg = bt_message_packet_end_create(
+ dmesg_msg_iter->pc_msg_iter, dmesg_comp->packet);
+ }
+
+ dmesg_msg_iter->state = STATE_EMIT_STREAM_ACTIVITY_END;
+ break;
+ case STATE_EMIT_STREAM_ACTIVITY_END:
+ *msg = bt_message_stream_activity_end_create(
+ dmesg_msg_iter->pc_msg_iter, dmesg_comp->stream);
dmesg_msg_iter->state = STATE_EMIT_STREAM_END;
break;
case STATE_EMIT_STREAM_END:
return status;
}
+
+BT_HIDDEN
+bt_bool dmesg_msg_iter_can_seek_beginning(
+ bt_self_message_iterator *self_msg_iter)
+{
+ struct dmesg_msg_iter *dmesg_msg_iter =
+ bt_self_message_iterator_get_data(self_msg_iter);
+
+ /* Can't seek the beginning of the standard input stream */
+ return !dmesg_msg_iter->dmesg_comp->params.read_from_stdin;
+}
+
+BT_HIDDEN
+bt_self_message_iterator_status dmesg_msg_iter_seek_beginning(
+ bt_self_message_iterator *self_msg_iter)
+{
+ struct dmesg_msg_iter *dmesg_msg_iter =
+ bt_self_message_iterator_get_data(self_msg_iter);
+
+ BT_ASSERT(!dmesg_msg_iter->dmesg_comp->params.read_from_stdin);
+
+ BT_MESSAGE_PUT_REF_AND_RESET(dmesg_msg_iter->tmp_event_msg);
+ dmesg_msg_iter->last_clock_value = 0;
+ dmesg_msg_iter->state = STATE_EMIT_STREAM_BEGINNING;
+ return BT_SELF_MESSAGE_ITERATOR_STATUS_OK;
+}