ir: add bt_ctf_event_copy() (event deep copy)
authorPhilippe Proulx <eeppeliteloop@gmail.com>
Tue, 7 Apr 2015 23:24:17 +0000 (19:24 -0400)
committerJérémie Galarneau <jeremie.galarneau@efficios.com>
Tue, 28 Apr 2015 19:21:43 +0000 (15:21 -0400)
Signed-off-by: Philippe Proulx <eeppeliteloop@gmail.com>
Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
formats/ctf/ir/event.c
include/babeltrace/ctf-ir/event.h

index db55b26b5e68c0798ae7121151821954d85c14e5..c168854e244ad4f81d61df6e5e2009f5663a646c 100644 (file)
@@ -1230,3 +1230,71 @@ int bt_ctf_event_set_stream(struct bt_ctf_event *event,
 end:
        return ret;
 }
+
+struct bt_ctf_event *bt_ctf_event_copy(struct bt_ctf_event *event)
+{
+       struct bt_ctf_event *copy = NULL;
+
+       if (!event) {
+               goto error;
+       }
+
+       copy = g_new0(struct bt_ctf_event, 1);
+       if (!copy) {
+               goto error;
+       }
+
+       bt_ctf_ref_init(&copy->ref_count);
+       copy->event_class = event->event_class;
+       bt_ctf_event_class_get(copy->event_class);
+       copy->stream = event->stream;
+
+       if (event->event_header) {
+               copy->event_header = bt_ctf_field_copy(event->event_header);
+
+               if (!copy->event_header) {
+                       goto error;
+               }
+       }
+
+       if (event->context_payload) {
+               copy->context_payload = bt_ctf_field_copy(
+                       event->context_payload);
+
+               if (!copy->context_payload) {
+                       goto error;
+               }
+       }
+
+       if (event->fields_payload) {
+               copy->fields_payload = bt_ctf_field_copy(event->fields_payload);
+
+               if (!copy->fields_payload) {
+                       goto error;
+               }
+       }
+
+       return copy;
+
+error:
+       if (copy) {
+               if (copy->event_class) {
+                       bt_ctf_event_class_put(copy->event_class);
+               }
+
+               if (copy->event_header) {
+                       bt_ctf_field_put(copy->event_header);
+               }
+
+               if (copy->context_payload) {
+                       bt_ctf_field_put(copy->context_payload);
+               }
+
+               if (copy->fields_payload) {
+                       bt_ctf_field_put(copy->fields_payload);
+               }
+       }
+
+       g_free(copy);
+       return NULL;
+}
index 316c6eed5205b7aedd0eea3620d5bbc28b1b0a4b..63bd74e584edcec2372b248ba530b31247fa3053 100644 (file)
@@ -474,6 +474,19 @@ extern struct bt_ctf_field *bt_ctf_event_get_event_context(
 extern int bt_ctf_event_set_event_context(struct bt_ctf_event *event,
                struct bt_ctf_field *context);
 
+/*
+ * bt_ctf_event_copy: Deep-copy an event.
+ *
+ * Get an event's deep copy.
+ *
+ * On success, the returned copy has its reference count set to 1.
+ *
+ * @param event Event to copy.
+ *
+ * Returns the deep-copied event on success, NULL on error.
+ */
+extern struct bt_ctf_event *bt_ctf_event_copy(struct bt_ctf_event *event);
+
 /*
  * bt_ctf_event_get and bt_ctf_event_put: increment and decrement
  * the event's reference count.
This page took 0.026323 seconds and 4 git commands to generate.