X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=src%2Flib%2Ftrace-ir%2Fevent.h;h=b1fb2313034b08a8d88e27e6dfbb1ab1dd06986c;hb=c4f23e30bf67d2523163614bc9461d84cbe1ae80;hp=8cd6419cf27380eff845f06cb0a4f29e0d455c75;hpb=91d8147391efdc4d42cc4e1c171a65c0372a008f;p=babeltrace.git diff --git a/src/lib/trace-ir/event.h b/src/lib/trace-ir/event.h index 8cd6419c..b1fb2313 100644 --- a/src/lib/trace-ir/event.h +++ b/src/lib/trace-ir/event.h @@ -25,8 +25,8 @@ */ /* Protection: this file uses BT_LIB_LOG*() macros directly */ -#ifndef BABELTRACE_LIB_LOGGING_INTERNAL_H -# error Please include before including this file. +#ifndef BT_LIB_LOG_SUPPORTED +# error Please include "lib/logging.h" before including this file. #endif #include "lib/assert-pre.h" @@ -39,6 +39,7 @@ #include "lib/object.h" #include "common/assert.h" #include +#include #include "event-class.h" #include "field.h" @@ -46,8 +47,8 @@ #include "packet.h" #include "stream.h" -#define BT_ASSERT_PRE_EVENT_HOT(_event) \ - BT_ASSERT_PRE_HOT(((const struct bt_event *) (_event)), \ +#define BT_ASSERT_PRE_DEV_EVENT_HOT(_event) \ + BT_ASSERT_PRE_DEV_HOT(((const struct bt_event *) (_event)), \ "Event", ": %!+e", (_event)) struct bt_event { @@ -56,9 +57,12 @@ struct bt_event { /* Owned by this */ struct bt_event_class *class; - /* Owned by this */ + /* Owned by this (can be `NULL`) */ struct bt_packet *packet; + /* Owned by this */ + struct bt_stream *stream; + struct bt_field *common_context_field; struct bt_field *specific_context_field; struct bt_field *payload_field; @@ -84,7 +88,7 @@ __attribute__((unused)) static inline void _bt_event_reset_dev_mode(struct bt_event *event) { - BT_ASSERT(event); + BT_ASSERT_DBG(event); if (event->common_context_field) { bt_field_set_is_frozen( @@ -115,11 +119,16 @@ void _bt_event_reset_dev_mode(struct bt_event *event) static inline void bt_event_reset(struct bt_event *event) { - BT_ASSERT(event); + BT_ASSERT_DBG(event); BT_LIB_LOGD("Resetting event: %!+e", event); bt_event_set_is_frozen(event, false); - bt_object_put_no_null_check(&event->packet->base); - event->packet = NULL; + bt_object_put_ref_no_null_check(&event->stream->base); + event->stream = NULL; + + if (event->packet) { + bt_object_put_ref_no_null_check(&event->packet->base); + event->packet = NULL; + } } static inline @@ -127,7 +136,7 @@ void bt_event_recycle(struct bt_event *event) { struct bt_event_class *event_class; - BT_ASSERT(event); + BT_ASSERT_DBG(event); BT_LIB_LOGD("Recycling event: %!+e", event); /* @@ -154,51 +163,75 @@ void bt_event_recycle(struct bt_event *event) */ bt_event_reset(event); event_class = event->class; - BT_ASSERT(event_class); + BT_ASSERT_DBG(event_class); event->class = NULL; bt_object_pool_recycle_object(&event_class->event_pool, event); - bt_object_put_no_null_check(&event_class->base); + bt_object_put_ref_no_null_check(&event_class->base); } static inline void bt_event_set_packet(struct bt_event *event, struct bt_packet *packet) { - BT_ASSERT_PRE_NON_NULL(event, "Event"); - BT_ASSERT_PRE_NON_NULL(packet, "Packet"); - BT_ASSERT_PRE_EVENT_HOT(event); - BT_ASSERT_PRE(bt_event_class_borrow_stream_class( + BT_ASSERT_PRE_DEV_NON_NULL(event, "Event"); + BT_ASSERT_PRE_DEV_NON_NULL(packet, "Packet"); + BT_ASSERT_PRE_DEV_EVENT_HOT(event); + BT_ASSERT_PRE_DEV(bt_event_class_borrow_stream_class( event->class) == packet->stream->class, "Packet's stream class and event's stream class differ: " "%![event-]+e, %![packet-]+a", event, packet); - - BT_ASSERT(!event->packet); + BT_ASSERT_DBG(event->stream->class->supports_packets); + BT_ASSERT_DBG(!event->packet); event->packet = packet; - bt_object_get_no_null_check_no_parent_check(&event->packet->base); - BT_LIB_LOGV("Set event's packet: %![event-]+e, %![packet-]+a", + bt_object_get_ref_no_null_check_no_parent_check(&event->packet->base); + BT_LIB_LOGD("Set event's packet: %![event-]+e, %![packet-]+a", event, packet); } +static inline +void bt_event_set_stream(struct bt_event *event, struct bt_stream *stream) +{ + BT_ASSERT_PRE_DEV_NON_NULL(event, "Event"); + BT_ASSERT_PRE_DEV_NON_NULL(stream, "Stream"); + BT_ASSERT_PRE_DEV_EVENT_HOT(event); + BT_ASSERT_PRE_DEV(bt_event_class_borrow_stream_class( + event->class) == stream->class, + "Stream's class and event's stream class differ: " + "%![event-]+e, %![stream-]+s", event, stream); + BT_ASSERT_DBG(!event->stream); + event->stream = stream; + bt_object_get_ref_no_null_check_no_parent_check(&event->stream->base); + BT_LIB_LOGD("Set event's stream: %![event-]+e, %![stream-]+s", + event, stream); +} + static inline struct bt_event *bt_event_create(struct bt_event_class *event_class, - struct bt_packet *packet) + struct bt_packet *packet, struct bt_stream *stream) { struct bt_event *event = NULL; - BT_ASSERT(event_class); + BT_ASSERT_DBG(event_class); + BT_ASSERT_DBG(stream); event = bt_object_pool_create_object(&event_class->event_pool); if (G_UNLIKELY(!event)) { - BT_LIB_LOGE("Cannot allocate one event from event class's event pool: " + BT_LIB_LOGE_APPEND_CAUSE( + "Cannot allocate one event from event class's event pool: " "%![ec-]+E", event_class); goto end; } if (G_LIKELY(!event->class)) { event->class = event_class; - bt_object_get_no_null_check(&event_class->base); + bt_object_get_ref_no_null_check(&event_class->base); + } + + bt_event_set_stream(event, stream); + + if (packet) { + BT_ASSERT_DBG(packet); + bt_event_set_packet(event, packet); } - BT_ASSERT(packet); - bt_event_set_packet(event, packet); goto end; end: