lib: rename include dir to babeltrace2
[babeltrace.git] / plugins / text / dmesg / dmesg.c
index 332322b83e4f410be598444456e114d916bc914b..b10c94252201c2a040bb22e932ce2475411fd5d9 100644 (file)
 #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
@@ -50,12 +50,15 @@ struct dmesg_msg_iter {
        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;
@@ -79,19 +82,19 @@ struct dmesg_component {
 };
 
 static
-bt_field_class *create_event_payload_fc(void)
+bt_field_class *create_event_payload_fc(bt_trace_class *trace_class)
 {
        bt_field_class *root_fc = NULL;
        bt_field_class *fc = NULL;
        int ret;
 
-       root_fc = bt_field_class_structure_create();
+       root_fc = bt_field_class_structure_create(trace_class);
        if (!root_fc) {
                BT_LOGE_STR("Cannot create an empty structure field class object.");
                goto error;
        }
 
-       fc = bt_field_class_string_create();
+       fc = bt_field_class_string_create(trace_class);
        if (!fc) {
                BT_LOGE_STR("Cannot create a string field class object.");
                goto error;
@@ -138,18 +141,31 @@ int create_meta(struct dmesg_component *dmesg_comp, bool has_ts)
 
        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(
@@ -165,7 +181,7 @@ int create_meta(struct dmesg_component *dmesg_comp, bool has_ts)
                goto error;
        }
 
-       fc = create_event_payload_fc();
+       fc = create_event_payload_fc(dmesg_comp->trace_class);
        if (!fc) {
                BT_LOGE_STR("Cannot create event payload field class.");
                goto error;
@@ -245,7 +261,7 @@ static
 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);
@@ -288,12 +304,6 @@ int create_packet_and_stream_and_trace(struct dmesg_component *dmesg_comp)
                goto error;
        }
 
-       ret = bt_trace_make_static(dmesg_comp->trace);
-       if (ret) {
-               BT_LOGE_STR("Cannot make trace static.");
-               goto error;
-       }
-
        goto end;
 
 error:
@@ -358,6 +368,7 @@ void destroy_dmesg_component(struct dmesg_component *dmesg_comp)
        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);
 }
 
@@ -512,8 +523,16 @@ skip_ts:
                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;
@@ -521,11 +540,6 @@ skip_ts:
 
        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:
@@ -633,6 +647,8 @@ void destroy_dmesg_msg_iter(struct dmesg_msg_iter *dmesg_msg_iter)
        g_free(dmesg_msg_iter);
 }
 
+
+
 BT_HIDDEN
 bt_self_message_iterator_status dmesg_msg_iter_init(
                bt_self_message_iterator *self_msg_iter,
@@ -711,6 +727,7 @@ bt_self_message_iterator_status dmesg_msg_iter_next_one(
 
        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;
        }
@@ -775,12 +792,26 @@ 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:
@@ -789,8 +820,20 @@ handle_state:
                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:
@@ -856,3 +899,29 @@ bt_self_message_iterator_status dmesg_msg_iter_next(
 
        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;
+}
This page took 0.025749 seconds and 4 git commands to generate.