Add trace moficiation notification handler interface
authorJérémie Galarneau <jeremie.galarneau@efficios.com>
Wed, 20 Apr 2016 16:15:10 +0000 (12:15 -0400)
committerJérémie Galarneau <jeremie.galarneau@efficios.com>
Sat, 27 May 2017 16:57:26 +0000 (12:57 -0400)
Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
formats/ctf/ir/trace.c
include/babeltrace/ctf-ir/trace-internal.h
include/babeltrace/ctf-ir/trace.h

index 4d9e97f9e1f8f53770c464ec2c9dca53681c5330..c4889b79b44fb2f4ef318f387434bfad800ca79f 100644 (file)
 #define DEFAULT_IDENTIFIER_SIZE 128
 #define DEFAULT_METADATA_STRING_SIZE 4096
 
+struct notification_handler {
+       bt_ctf_notification_cb func;
+       void *data;
+};
+
 static
 void bt_ctf_trace_destroy(struct bt_object *obj);
 static
@@ -1027,6 +1032,27 @@ end:
        return ret;
 }
 
+int bt_ctf_trace_add_notification_handler_cb(struct bt_ctf_trace *trace,
+               bt_ctf_notification_cb handler, void *handler_data)
+{
+       int ret = 0;
+       struct notification_handler *handler_wrapper =
+                       g_new0(struct notification_handler, 1);
+
+       if (!trace || !handler || !handler_wrapper) {
+               ret = -1;
+               goto error;
+       }
+
+       handler_wrapper->func = handler;
+       handler_wrapper->data = handler_data;
+       g_ptr_array_add(trace->notification_handlers, handler_wrapper);
+       return ret;
+error:
+       g_free(handler_wrapper);
+       return ret;
+}
+
 BT_HIDDEN
 struct bt_ctf_field_type *get_field_type(enum field_type_alias alias)
 {
index f9091425b0d111523760620d4414861d769d7862..c631b97d816f24dd75e29030aff023b29e896875 100644 (file)
@@ -65,6 +65,7 @@ struct bt_ctf_trace {
         * trace is _always_ frozen.
         */
        int valid;
+       GPtrArray *notification_handlers; /* Array of notification_handler */
 };
 
 struct metadata_context {
index ee740039829052cf6367cca4d9feaba46c84e1f5..ccbfe9ef284529243fea8450a771adcd1bfc46d7 100644 (file)
@@ -43,6 +43,18 @@ struct bt_ctf_stream;
 struct bt_ctf_stream_class;
 struct bt_ctf_clock;
 
+/**
+ * Notification handling function type.
+ *
+ * A reference must be taken on the notification if the handler has to
+ * keep ownership of the notification beyond the invocation of the callback.
+ *
+ * @param notification Notification to handle
+ * @param data         Handler private data
+ */
+typedef void (*bt_ctf_notification_cb)(
+               struct bt_notification *notification, void *data);
+
 /*
  * bt_ctf_trace_create: create a trace instance.
  *
@@ -338,6 +350,25 @@ extern struct bt_ctf_field_type *bt_ctf_trace_get_packet_header_type(
 extern int bt_ctf_trace_set_packet_header_type(struct bt_ctf_trace *trace,
                struct bt_ctf_field_type *packet_header_type);
 
+/*
+ * bt_ctf_trace_add_notification_handler_cb: set a notification callback
+ * which will be invoked whenever a trace's schema is modified.
+ *
+ * Register a notification handler to a trace.
+ *
+ * @param trace Trace instance.
+ * @param handler Notification handler to invoke on trace xmodification.
+ * @param handler_data Private data passed to the notification handler.
+ *
+ * Returns 0 on success, a negative value on error.
+ *
+ * Note: the notification handler will be used to serialize the trace's current
+ * state on registration. It will then be invoked on any change occuring within
+ * the trace's hierarchy.
+ */
+extern int bt_ctf_trace_add_notification_handler_cb(struct bt_ctf_trace *trace,
+               bt_ctf_notification_cb handler, void *handler_data);
+
 #ifdef __cplusplus
 }
 #endif
This page took 0.02729 seconds and 4 git commands to generate.