From 6d699c3f54197df54dde8cbf7495da646359b5b8 Mon Sep 17 00:00:00 2001
From: Philipp Zabel
Date: Wed, 21 Jun 2023 10:46:14 +0200
Subject: [PATCH] libweston: add weston_backend::shutdown callback
Add a weston_backend::shutdown callback to split out the part of
weston_backend::destroy that needs to be done before compositor
shutdown.
Signed-off-by: Philipp Zabel
---
libweston/backend-drm/drm.c | 21 +++++++++++++++------
libweston/backend-rdp/rdp.c | 16 ++++++++++++----
libweston/backend-vnc/vnc.c | 11 +++++++++--
libweston/backend-wayland/wayland.c | 11 +++++++++--
libweston/backend-x11/x11.c | 15 +++++++++++----
libweston/backend.h | 5 +++++
libweston/compositor.c | 3 +++
7 files changed, 64 insertions(+), 18 deletions(-)
diff --git a/libweston/backend-drm/drm.c b/libweston/backend-drm/drm.c
index debd3ef7..7134c809 100644
--- a/libweston/backend-drm/drm.c
+++ b/libweston/backend-drm/drm.c
@@ -3203,17 +3203,13 @@ udev_drm_event(int fd, uint32_t mask, void *data)
return 1;
}
-void
-drm_destroy(struct weston_backend *backend)
+static void
+drm_shutdown(struct weston_backend *backend)
{
struct drm_backend *b = container_of(backend, struct drm_backend, base);
struct weston_compositor *ec = b->compositor;
- struct drm_device *device = b->drm;
- struct weston_head *base, *next;
struct weston_output *output_base;
struct drm_output *output;
- struct drm_crtc *crtc, *crtc_tmp;
- struct drm_writeback *writeback, *writeback_tmp;
udev_input_destroy(&b->input);
@@ -3252,6 +3248,18 @@ drm_destroy(struct weston_backend *backend)
weston_log_scope_destroy(b->debug);
b->debug = NULL;
+}
+
+void
+drm_destroy(struct weston_backend *backend)
+{
+ struct drm_backend *b = container_of(backend, struct drm_backend, base);
+ struct weston_compositor *ec = b->compositor;
+ struct drm_device *device = b->drm;
+ struct weston_head *base, *next;
+ struct drm_crtc *crtc, *crtc_tmp;
+ struct drm_writeback *writeback, *writeback_tmp;
+
weston_compositor_shutdown(ec);
wl_list_for_each_safe(crtc, crtc_tmp, &b->drm->crtc_list, link)
@@ -3861,6 +3869,7 @@ drm_backend_create(struct weston_compositor *compositor,
goto err_udev_dev;
}
+ b->base.shutdown = drm_shutdown;
b->base.destroy = drm_destroy;
b->base.repaint_begin = drm_repaint_begin;
b->base.repaint_flush = drm_repaint_flush;
diff --git a/libweston/backend-rdp/rdp.c b/libweston/backend-rdp/rdp.c
index 76381233..02c5135e 100644
--- a/libweston/backend-rdp/rdp.c
+++ b/libweston/backend-rdp/rdp.c
@@ -692,12 +692,10 @@ rdp_head_destroy(struct weston_head *base)
free(head);
}
-void
-rdp_destroy(struct weston_backend *backend)
+static void
+rdp_shutdown(struct weston_backend *backend)
{
struct rdp_backend *b = container_of(backend, struct rdp_backend, base);
- struct weston_compositor *ec = b->compositor;
- struct weston_head *base, *next;
struct rdp_peers_item *rdp_peer, *tmp;
int i;
@@ -713,6 +711,15 @@ rdp_destroy(struct weston_backend *backend)
if (b->listener_events[i])
wl_event_source_remove(b->listener_events[i]);
+}
+
+void
+rdp_destroy(struct weston_backend *backend)
+{
+ struct rdp_backend *b = container_of(backend, struct rdp_backend, base);
+ struct weston_compositor *ec = b->compositor;
+ struct weston_head *base, *next;
+
if (b->clipboard_debug) {
weston_log_scope_destroy(b->clipboard_debug);
b->clipboard_debug = NULL;
@@ -1880,6 +1887,7 @@ rdp_backend_create(struct weston_compositor *compositor,
b = xzalloc(sizeof *b);
b->compositor_tid = gettid();
b->compositor = compositor;
+ b->base.shutdown = rdp_shutdown;
b->base.destroy = rdp_destroy;
b->base.create_output = rdp_output_create;
b->rdp_key = config->rdp_key ? strdup(config->rdp_key) : NULL;
diff --git a/libweston/backend-vnc/vnc.c b/libweston/backend-vnc/vnc.c
index 4566a8ca..050bddef 100644
--- a/libweston/backend-vnc/vnc.c
+++ b/libweston/backend-vnc/vnc.c
@@ -869,6 +869,14 @@ vnc_create_output(struct weston_backend *backend, const char *name)
return &output->base;
}
+static void
+vnc_shutdown(struct weston_backend *base)
+{
+ struct vnc_backend *backend = container_of(base, struct vnc_backend, base);
+
+ nvnc_close(backend->server);
+}
+
static void
vnc_destroy(struct weston_backend *base)
{
@@ -876,8 +884,6 @@ vnc_destroy(struct weston_backend *base)
struct weston_compositor *ec = backend->compositor;
struct weston_head *head, *next;
- nvnc_close(backend->server);
-
weston_compositor_shutdown(ec);
wl_event_source_remove(backend->aml_event);
@@ -1217,6 +1223,7 @@ vnc_backend_create(struct weston_compositor *compositor,
return NULL;
backend->compositor = compositor;
+ backend->base.shutdown = vnc_shutdown;
backend->base.destroy = vnc_destroy;
backend->base.create_output = vnc_create_output;
backend->vnc_monitor_refresh_rate = config->refresh_rate * 1000;
diff --git a/libweston/backend-wayland/wayland.c b/libweston/backend-wayland/wayland.c
index dc2d3120..b2de06f8 100644
--- a/libweston/backend-wayland/wayland.c
+++ b/libweston/backend-wayland/wayland.c
@@ -2739,6 +2739,14 @@ wayland_backend_handle_event(int fd, uint32_t mask, void *data)
return count;
}
+static void
+wayland_shutdown(struct weston_backend *backend)
+{
+ struct wayland_backend *b = to_wayland_backend(backend);
+
+ wl_event_source_remove(b->parent.wl_source);
+}
+
static void
wayland_destroy(struct weston_backend *backend)
{
@@ -2748,8 +2756,6 @@ wayland_destroy(struct weston_backend *backend)
struct wayland_parent_output *output, *next_output;
struct wayland_input *input, *next_input;
- wl_event_source_remove(b->parent.wl_source);
-
weston_compositor_shutdown(ec);
wl_list_for_each_safe(base, next, &ec->head_list, compositor_link) {
@@ -2928,6 +2934,7 @@ wayland_backend_create(struct weston_compositor *compositor,
}
}
+ b->base.shutdown = wayland_shutdown;
b->base.destroy = wayland_destroy;
b->base.create_output = wayland_output_create;
diff --git a/libweston/backend-x11/x11.c b/libweston/backend-x11/x11.c
index 43fff36e..dc42c95d 100644
--- a/libweston/backend-x11/x11.c
+++ b/libweston/backend-x11/x11.c
@@ -1829,14 +1829,20 @@ x11_backend_get_wm_info(struct x11_backend *c)
}
static void
-x11_destroy(struct weston_backend *base)
+x11_shutdown(struct weston_backend *base)
{
- struct x11_backend *backend = container_of(base, struct x11_backend, base);
- struct weston_compositor *ec = backend->compositor;
- struct weston_head *head, *next;
+ struct x11_backend *backend = to_x11_backend(base);
wl_event_source_remove(backend->xcb_source);
x11_input_destroy(backend);
+}
+
+static void
+x11_destroy(struct weston_backend *base)
+{
+ struct x11_backend *backend = to_x11_backend(base);
+ struct weston_compositor *ec = backend->compositor;
+ struct weston_head *head, *next;
weston_compositor_shutdown(ec); /* destroys outputs, too */
@@ -1923,6 +1929,7 @@ x11_backend_create(struct weston_compositor *compositor,
goto err_xdisplay;
}
+ b->base.shutdown = x11_shutdown;
b->base.destroy = x11_destroy;
b->base.create_output = x11_output_create;
diff --git a/libweston/backend.h b/libweston/backend.h
index bfd15572..ad60786d 100644
--- a/libweston/backend.h
+++ b/libweston/backend.h
@@ -35,6 +35,11 @@
struct weston_hdr_metadata_type1;
struct weston_backend {
+ /** Prepare for compositor shutdown (optional)
+ *
+ * This will be called before weston_compositor_shutdown()
+ */
+ void (*shutdown)(struct weston_backend *backend);
void (*destroy)(struct weston_backend *backend);
/** Begin a repaint sequence
diff --git a/libweston/compositor.c b/libweston/compositor.c
index 12affe01..f95a3eff 100644
--- a/libweston/compositor.c
+++ b/libweston/compositor.c
@@ -9088,6 +9088,9 @@ weston_compositor_destroy(struct weston_compositor *compositor)
weston_compositor_xkb_destroy(compositor);
+ if (compositor->backend && compositor->backend->shutdown)
+ compositor->backend->shutdown(compositor->backend);
+
if (compositor->backend)
compositor->backend->destroy(compositor->backend);