X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=plugins%2Ftext%2Fdmesg%2Fdmesg.c;h=b10c94252201c2a040bb22e932ce2475411fd5d9;hb=3fadfbc0c91f82c46bd36e6e0657ea93570c9db1;hp=697d1965506a379599ac5a19f72616f19c1f7f5c;hpb=a59806b759fcfdbcb18927abe6dd5e4fd31148d4;p=babeltrace.git diff --git a/plugins/text/dmesg/dmesg.c b/plugins/text/dmesg/dmesg.c index 697d1965..b10c9425 100644 --- a/plugins/text/dmesg/dmesg.c +++ b/plugins/text/dmesg/dmesg.c @@ -28,12 +28,12 @@ #include #include #include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include #include #define NSEC_PER_USEC 1000UL @@ -50,6 +50,7 @@ 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, @@ -140,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( @@ -290,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: @@ -360,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); } @@ -514,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; @@ -523,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: @@ -635,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, @@ -788,8 +802,16 @@ handle_state: 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: @@ -798,8 +820,15 @@ 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: @@ -870,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; +}