#include <string.h>
#include <ctype.h>
#include <stdio.h>
-#include <babeltrace/assert-internal.h>
-#include <babeltrace/common-internal.h>
-#include <babeltrace/babeltrace.h>
-#include <babeltrace/value-internal.h>
-#include <babeltrace/compat/utc-internal.h>
-#include <babeltrace/compat/stdio-internal.h>
+#include <babeltrace2/assert-internal.h>
+#include <babeltrace2/common-internal.h>
+#include <babeltrace2/babeltrace.h>
+#include <babeltrace2/value-internal.h>
+#include <babeltrace2/compat/utc-internal.h>
+#include <babeltrace2/compat/stdio-internal.h>
#include <glib.h>
#define NSEC_PER_USEC 1000UL
size_t linebuf_len;
FILE *fp;
bt_message *tmp_event_msg;
+ uint64_t last_clock_value;
enum {
STATE_EMIT_STREAM_BEGINNING,
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_beginning_default_clock_snapshot(
+ dmesg_comp->stream_class, BT_TRUE);
+ bt_stream_class_set_packets_have_end_default_clock_snapshot(
+ dmesg_comp->stream_class, BT_TRUE);
}
dmesg_comp->event_class = bt_event_class_create(
goto error;
}
- ret = bt_trace_make_static(dmesg_comp->trace);
- if (ret) {
- BT_LOGE_STR("Cannot make trace static.");
- goto error;
- }
-
goto end;
error:
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,
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:
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;
+}