diff options
author | Pekka Paalanen <pekka.paalanen@collabora.com> | 2019-11-06 12:59:32 +0200 |
---|---|---|
committer | Daniel Stone <daniel@fooishbar.org> | 2019-11-21 16:32:55 +0000 |
commit | 6ffbba3ac13bc16d247ea50ef09cb149d892e125 (patch) | |
tree | f92bdd36e87929a9cc30b0675cfc84b6775ba099 /remoting | |
parent | 5caef6d355f87af2e7f20372dc8c328faba53148 (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.c | 10 |
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; } |