The when the macro KS_DEFINE_PLUGIN_CONTEXT is used by the plugin, the final free of the memory is done by calling __close() with a negative stream id. Althow, this was provisioned in the definition of the macro, it was never implemented in the GUI. Signed-off-by: Yordan Karadzhov (VMware) <y.karadz@xxxxxxxxx> --- src/libkshark-plugin.c | 10 ++++++++++ src/libkshark-plugin.h | 5 ++++- src/libkshark.h | 2 +- src/plugins/sched_events.c | 4 ++++ 4 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/libkshark-plugin.c b/src/libkshark-plugin.c index ebd2579..09886ce 100644 --- a/src/libkshark-plugin.c +++ b/src/libkshark-plugin.c @@ -117,6 +117,9 @@ int kshark_unregister_event_handler(struct kshark_data_stream *stream, { struct kshark_event_proc_handler **last; + if (stream->stream_id < 0) + return 0; + for (last = &stream->event_handlers; *last; last = &(*last)->next) { if ((*last)->id == event_id && (*last)->event_func == evt_func) { @@ -182,6 +185,9 @@ void kshark_unregister_draw_handler(struct kshark_data_stream *stream, { struct kshark_draw_handler **last; + if (stream->stream_id < 0) + return; + for (last = &stream->draw_handlers; *last; last = &(*last)->next) { if ((*last)->draw_func == draw_func) { struct kshark_draw_handler *this_handler; @@ -410,12 +416,16 @@ void kshark_unregister_plugin(struct kshark_context *kshark_ctx, */ void kshark_free_plugin_list(struct kshark_plugin_list *plugins) { + struct kshark_data_stream stream; struct kshark_plugin_list *last; + stream.stream_id = KS_PLUGIN_CONTEXT_FREE; while (plugins) { last = plugins; plugins = plugins->next; + if (last->process_interface) + last->process_interface->close(&stream); free_plugin(last); } } diff --git a/src/libkshark-plugin.h b/src/libkshark-plugin.h index 752dbeb..85a0a8c 100644 --- a/src/libkshark-plugin.h +++ b/src/libkshark-plugin.h @@ -366,6 +366,9 @@ int kshark_handle_all_dpis(struct kshark_data_stream *stream, __ok; \ }) \ +/** Identifier used to free the plugin context. */ +#define KS_PLUGIN_CONTEXT_FREE -1 + /** * General purpose macro defining methods for adding plugin context. * Do not use this macro in header files. @@ -395,7 +398,7 @@ __hidden type *__init(int sd) \ } \ __hidden void __close(int sd) \ { \ - if (sd < 0) { \ + if (sd == KS_PLUGIN_CONTEXT_FREE) { \ free(__context_handler); \ __n_streams = -1; \ return; \ diff --git a/src/libkshark.h b/src/libkshark.h index aa4b3ca..ee3a1d3 100644 --- a/src/libkshark.h +++ b/src/libkshark.h @@ -281,7 +281,7 @@ struct kshark_generic_stream_interface { /** Structure representing a stream of trace data. */ struct kshark_data_stream { /** Data stream identifier. */ - uint16_t stream_id; + int16_t stream_id; /** The number of CPUs presented in this data stream. */ int n_cpus; diff --git a/src/plugins/sched_events.c b/src/plugins/sched_events.c index 5798322..5c82803 100644 --- a/src/plugins/sched_events.c +++ b/src/plugins/sched_events.c @@ -201,6 +201,9 @@ int KSHARK_PLOT_PLUGIN_DEINITIALIZER(struct kshark_data_stream *stream) struct plugin_sched_context *plugin_ctx; int sd = stream->stream_id; + if (sd == KS_PLUGIN_CONTEXT_FREE) + goto close; + plugin_ctx = __get_context(sd); if (!plugin_ctx) return 0; @@ -215,6 +218,7 @@ int KSHARK_PLOT_PLUGIN_DEINITIALIZER(struct kshark_data_stream *stream) kshark_unregister_draw_handler(stream, plugin_draw); + close: __close(sd); return 1; -- 2.27.0