Use weston_compositor_add_destroy_listener_once() in plugins
This introduces a new convention of checking through the compositor destroy
listener if the plugin is already initialized. If the plugin is already
initialized, then the plugin entry function succeeds as a no-op. This makes it
safe to load the same plugin multiple times in a running compositor.
Currently module loading functions return failure if a plugin is already
loaded, but that will change in the future. Therefore we need this other method
of ensuring we do not double-initialize a plugin which would lead to list
corruptions the very least.
All plugins are converted to use the new helper, except:
- those that do not have a destroy listener already, and
- hmi-controller which does the same open-coded as the common code pattern
did not fit there.
Plugins should always have a compositor destroy listener registered since they
very least allocate a struct to hold their data. Hence omissions are
highlighted in code.
Backends do not need this because weston_compositor_load_backend() already
protects against double-init. GL-renderer does not export a standard module
init function so cannot be initialized the usual way and therefore is not
vulnerable to double-init.
Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.com>
diff --git a/compositor/cms-static.c b/compositor/cms-static.c
index 2f357c4..540d6ad 100644
--- a/compositor/cms-static.c
+++ b/compositor/cms-static.c
@@ -105,8 +105,13 @@
return -1;
cms->ec = ec;
- cms->destroy_listener.notify = cms_notifier_destroy;
- wl_signal_add(&ec->destroy_signal, &cms->destroy_listener);
+
+ if (!weston_compositor_add_destroy_listener_once(ec,
+ &cms->destroy_listener,
+ cms_notifier_destroy)) {
+ free(cms);
+ return 0;
+ }
cms->output_created_listener.notify = cms_notifier_output_created;
wl_signal_add(&ec->output_created_signal, &cms->output_created_listener);