Add missing include of unistd.h
[babeltrace.git] / lib / ctf-ir / stream.c
index 3ff937ac4118e7a29e7153d341364c3b7d835619..fa1122e30b40f78c284a6106594309c822f9e8c4 100644 (file)
@@ -48,6 +48,7 @@
 #include <babeltrace/compiler-internal.h>
 #include <babeltrace/align-internal.h>
 #include <inttypes.h>
+#include <unistd.h>
 
 static
 void bt_ctf_stream_destroy(struct bt_object *obj);
@@ -353,18 +354,50 @@ int set_packet_context_events_discarded(struct bt_ctf_stream *stream)
                goto end;
        }
 
-       ret = bt_ctf_field_unsigned_integer_set_value(field,
-               stream->discarded_events);
-       if (ret) {
-               BT_LOGW("Cannot set packet context field's `events_discarded` integer field's value: "
-                       "stream-addr=%p, stream-name=\"%s\", field-addr=%p, value=%" PRIu64,
-                       stream, bt_ctf_stream_get_name(stream),
-                       field, stream->discarded_events);
+       /*
+        * If the field is set by the user, make sure that the value is
+        * greater than or equal to the stream's current count of
+        * discarded events. We do not allow wrapping here. If it's
+        * valid, update the stream's current count.
+        */
+       if (bt_ctf_field_is_set(field)) {
+               uint64_t user_val;
+
+               ret = bt_ctf_field_unsigned_integer_get_value(field,
+                       &user_val);
+               if (ret) {
+                       BT_LOGW("Cannot get packet context `events_discarded` field's unsigned value: "
+                               "stream-addr=%p, stream-name=\"%s\", field-addr=%p",
+                               stream, bt_ctf_stream_get_name(stream), field);
+                       goto end;
+               }
+
+               if (user_val < stream->discarded_events) {
+                       BT_LOGW("Invalid packet context `events_discarded` field's unsigned value: "
+                               "value is lesser than the stream's current discarded events count: "
+                               "stream-addr=%p, stream-name=\"%s\", field-addr=%p, "
+                               "value=%" PRIu64 ", "
+                               "stream-discarded-events-count=%" PRIu64,
+                               stream, bt_ctf_stream_get_name(stream), field,
+                               user_val, stream->discarded_events);
+                       goto end;
+               }
+
+               stream->discarded_events = user_val;
        } else {
-               BT_LOGV("Set packet context field's `events_discarded` field's value: "
-                       "stream-addr=%p, stream-name=\"%s\", field-addr=%p, value=%" PRIu64,
-                       stream, bt_ctf_stream_get_name(stream),
-                       field, stream->discarded_events);
+               ret = bt_ctf_field_unsigned_integer_set_value(field,
+                       stream->discarded_events);
+               if (ret) {
+                       BT_LOGW("Cannot set packet context field's `events_discarded` integer field's value: "
+                               "stream-addr=%p, stream-name=\"%s\", field-addr=%p, value=%" PRIu64,
+                               stream, bt_ctf_stream_get_name(stream),
+                               field, stream->discarded_events);
+               } else {
+                       BT_LOGV("Set packet context field's `events_discarded` field's value: "
+                               "stream-addr=%p, stream-name=\"%s\", field-addr=%p, value=%" PRIu64,
+                               stream, bt_ctf_stream_get_name(stream),
+                               field, stream->discarded_events);
+               }
        }
 
 end:
@@ -1621,6 +1654,7 @@ end:
        reset_structure_field(stream->packet_context, "timestamp_end");
        reset_structure_field(stream->packet_context, "packet_size");
        reset_structure_field(stream->packet_context, "content_size");
+       reset_structure_field(stream->packet_context, "events_discarded");
 
        if (ret < 0) {
                /*
@@ -1855,15 +1889,16 @@ void bt_ctf_stream_map_component_to_port(struct bt_ctf_stream *stream,
         * listener so that we remove this hash table entry when we know
         * the component is destroyed.
         */
-       bt_component_add_destroy_listener(comp, component_destroy_listener,
-               stream);
-       g_hash_table_insert(stream->comp_cur_port, comp, port);
-       BT_LOGV("Mapped component to port for stream: stream-addr=%p, "
-               "stream-name=\"%s\", comp-addr=%p, comp-name=\"%s\", "
-               "port-addr=%p, port-name=\"%s\"",
+       BT_LOGV("Adding component's destroy listener for stream: "
+               "stream-addr=%p, stream-name=\"%s\", comp-addr=%p, "
+               "comp-name=\"%s\", port-addr=%p, port-name=\"%s\"",
                stream, bt_ctf_stream_get_name(stream),
                comp, bt_component_get_name(comp), port,
                bt_port_get_name(port));
+       bt_component_add_destroy_listener(comp, component_destroy_listener,
+               stream);
+       g_hash_table_insert(stream->comp_cur_port, comp, port);
+       BT_LOGV_STR("Mapped component to port for stream.");
 }
 
 BT_HIDDEN
This page took 0.028702 seconds and 4 git commands to generate.