summaryrefslogtreecommitdiff
path: root/remoting
diff options
context:
space:
mode:
authorPekka Paalanen <pekka.paalanen@collabora.com>2019-11-06 12:59:32 +0200
committerDaniel Stone <daniel@fooishbar.org>2019-11-21 16:32:55 +0000
commit6ffbba3ac13bc16d247ea50ef09cb149d892e125 (patch)
treef92bdd36e87929a9cc30b0675cfc84b6775ba099 /remoting
parent5caef6d355f87af2e7f20372dc8c328faba53148 (diff)
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>
Diffstat (limited to 'remoting')
-rw-r--r--remoting/remoting-plugin.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/remoting/remoting-plugin.c b/remoting/remoting-plugin.c
index 8b82572a..0928a6b1 100644
--- a/remoting/remoting-plugin.c
+++ b/remoting/remoting-plugin.c
@@ -913,6 +913,13 @@ weston_module_init(struct weston_compositor *compositor)
if (!remoting)
return -1;
+ if (!weston_compositor_add_destroy_listener_once(compositor,
+ &remoting->destroy_listener,
+ weston_remoting_destroy)) {
+ free(remoting);
+ return 0;
+ }
+
remoting->virtual_output_api = api;
remoting->compositor = compositor;
wl_list_init(&remoting->output_list);
@@ -932,11 +939,10 @@ weston_module_init(struct weston_compositor *compositor)
goto failed;
}
- remoting->destroy_listener.notify = weston_remoting_destroy;
- wl_signal_add(&compositor->destroy_signal, &remoting->destroy_listener);
return 0;
failed:
+ wl_list_remove(&remoting->destroy_listener.link);
free(remoting);
return -1;
}