From: Jérémie Galarneau Date: Fri, 29 Jul 2016 19:36:28 +0000 (-0400) Subject: Implement trace listener interface X-Git-Tag: v2.0.0-pre1~802 X-Git-Url: http://git.efficios.com/?p=babeltrace.git;a=commitdiff_plain;h=9b888ff3a2025a7a36d55303a9977923f5c3bf50 Implement trace listener interface Signed-off-by: Jérémie Galarneau --- diff --git a/formats/ctf/ir/stream-class.c b/formats/ctf/ir/stream-class.c index cddbb979..877a9c4a 100644 --- a/formats/ctf/ir/stream-class.c +++ b/formats/ctf/ir/stream-class.c @@ -462,6 +462,13 @@ int bt_ctf_stream_class_add_event_class( stream_class->byte_order); } + /* Notifiy listeners of the trace's schema modification. */ + if (trace) { + struct bt_ctf_ir_element element = { .element = event_class, + .type = BT_CTF_IR_TYPE_EVENT_CLASS }; + + (void) bt_ctf_trace_element_modification(&element, trace); + } end: BT_PUT(trace); BT_PUT(old_stream_class); diff --git a/formats/ctf/ir/trace.c b/formats/ctf/ir/trace.c index 2b3fb0e6..8ead3792 100644 --- a/formats/ctf/ir/trace.c +++ b/formats/ctf/ir/trace.c @@ -111,6 +111,12 @@ struct bt_ctf_trace *bt_ctf_trace_create(void) goto error; } + trace->listeners = g_ptr_array_new_with_free_func( + (GDestroyNotify) g_free); + if (!trace->listeners) { + goto error; + } + return trace; error: @@ -139,6 +145,10 @@ void bt_ctf_trace_destroy(struct bt_object *obj) g_ptr_array_free(trace->stream_classes, TRUE); } + if (trace->listeners) { + g_ptr_array_free(trace->listeners, TRUE); + } + bt_put(trace->packet_header_type); g_free(trace); } @@ -640,6 +650,9 @@ int bt_ctf_trace_add_stream_class(struct bt_ctf_trace *trace, bt_ctf_stream_class_freeze(stream_class); bt_ctf_trace_freeze(trace); + /* Notifiy listeners of the trace's schema modification. */ + bt_ctf_stream_class_visit(stream_class, + bt_ctf_trace_element_modification, trace); end: if (ret) { bt_object_set_parent(stream_class, NULL); @@ -1073,30 +1086,12 @@ end: } static -int ir_visitor(struct bt_ctf_ir_element *element, void *data) +int invoke_listener(struct bt_ctf_ir_element *element, void *data) { - int ret = 0; + struct listener_wrapper *listener_wrapper = data; - switch (element->type) { - case BT_CTF_IR_TYPE_TRACE: - { - break; - } - case BT_CTF_IR_TYPE_STREAM_CLASS: - { - break; - } - case BT_CTF_IR_TYPE_EVENT_CLASS: - { - break; - } - default: - assert(0); - ret = -1; - goto end; - } -end: - return ret; + listener_wrapper->listener(element, listener_wrapper->data); + return 0; } int bt_ctf_trace_add_listener(struct bt_ctf_trace *trace, @@ -1115,7 +1110,7 @@ int bt_ctf_trace_add_listener(struct bt_ctf_trace *trace, listener_wrapper->data = listener_data; /* Visit the current schema. */ - ret = bt_ctf_trace_visit(trace, ir_visitor, listener_wrapper); + ret = bt_ctf_trace_visit(trace, invoke_listener, listener_wrapper); if (ret) { goto error; } @@ -1131,6 +1126,30 @@ error: return ret; } +BT_HIDDEN +int bt_ctf_trace_element_modification(struct bt_ctf_ir_element *element, + void *trace_ptr) +{ + size_t i; + struct bt_ctf_trace *trace = trace_ptr; + + assert(trace); + assert(element); + + if (trace->listeners->len == 0) { + goto end; + } + + for (i = 0; i < trace->listeners->len; i++) { + struct listener_wrapper *listener = + g_ptr_array_index(trace->listeners, i); + + listener->listener(element, listener->data); + } +end: + return 0; +} + BT_HIDDEN struct bt_ctf_field_type *get_field_type(enum field_type_alias alias) { diff --git a/include/babeltrace/ctf-ir/trace-internal.h b/include/babeltrace/ctf-ir/trace-internal.h index 2ea71097..db3d84f7 100644 --- a/include/babeltrace/ctf-ir/trace-internal.h +++ b/include/babeltrace/ctf-ir/trace-internal.h @@ -80,4 +80,8 @@ const char *get_byte_order_string(int byte_order); BT_HIDDEN struct bt_ctf_field_type *get_field_type(enum field_type_alias alias); +BT_HIDDEN +int bt_ctf_trace_element_modification(struct bt_ctf_ir_element *element, + void *trace_ptr); + #endif /* BABELTRACE_CTF_IR_TRACE_INTERNAL_H */