85 lines
3.6 KiB
Diff
85 lines
3.6 KiB
Diff
From c17091b79773e9c458f03a897b26c2257d7366a7 Mon Sep 17 00:00:00 2001
|
|
From: David Herrmann <dh.herrmann@gmail.com>
|
|
Date: Mon, 22 Sep 2014 18:05:19 +0200
|
|
Subject: [PATCH] terminal: signal object removal during sysview_context_stop()
|
|
|
|
Now that we no longer propagate callback return values, we can safely call
|
|
into user-callbacks during sysview_context_stop(). This way, users can
|
|
rely on all objects to be removed via callbacks (except if they failed
|
|
during object creation). This avoids duplicating any object hashtables on
|
|
the users' side and reduces memory consumption.
|
|
---
|
|
src/libsystemd-terminal/evcat.c | 3 ++-
|
|
src/libsystemd-terminal/modeset.c | 3 ++-
|
|
src/libsystemd-terminal/sysview.c | 22 ++++++++--------------
|
|
3 files changed, 12 insertions(+), 16 deletions(-)
|
|
|
|
diff --git a/src/libsystemd-terminal/evcat.c b/src/libsystemd-terminal/evcat.c
|
|
index b3f08e60bf..62556f6a2b 100644
|
|
--- a/src/libsystemd-terminal/evcat.c
|
|
+++ b/src/libsystemd-terminal/evcat.c
|
|
@@ -330,7 +330,8 @@ static int evcat_sysview_fn(sysview_context *c, void *userdata, sysview_event *e
|
|
case SYSVIEW_EVENT_SESSION_REMOVE:
|
|
idev_session_disable(e->idev_session);
|
|
e->idev_session = idev_session_free(e->idev_session);
|
|
- sd_event_exit(e->event, 0);
|
|
+ if (sd_event_get_exit_code(e->event, &r) == -ENODATA)
|
|
+ sd_event_exit(e->event, 0);
|
|
break;
|
|
case SYSVIEW_EVENT_SESSION_ATTACH:
|
|
d = ev->session_attach.device;
|
|
diff --git a/src/libsystemd-terminal/modeset.c b/src/libsystemd-terminal/modeset.c
|
|
index 7a28e7ab97..f564fa0f65 100644
|
|
--- a/src/libsystemd-terminal/modeset.c
|
|
+++ b/src/libsystemd-terminal/modeset.c
|
|
@@ -332,7 +332,8 @@ static int modeset_sysview_fn(sysview_context *c, void *userdata, sysview_event
|
|
grdev_session_restore(m->grdev_session);
|
|
grdev_session_disable(m->grdev_session);
|
|
m->grdev_session = grdev_session_free(m->grdev_session);
|
|
- sd_event_exit(m->event, 0);
|
|
+ if (sd_event_get_exit_code(m->event, &r) == -ENODATA)
|
|
+ sd_event_exit(m->event, 0);
|
|
break;
|
|
case SYSVIEW_EVENT_SESSION_ATTACH:
|
|
d = ev->session_attach.device;
|
|
diff --git a/src/libsystemd-terminal/sysview.c b/src/libsystemd-terminal/sysview.c
|
|
index 969514ad9d..cd776f62d8 100644
|
|
--- a/src/libsystemd-terminal/sysview.c
|
|
+++ b/src/libsystemd-terminal/sysview.c
|
|
@@ -1437,20 +1437,6 @@ void sysview_context_stop(sysview_context *c) {
|
|
|
|
log_debug("sysview: stop");
|
|
|
|
- c->running = false;
|
|
- c->scanned = false;
|
|
- c->event_fn = NULL;
|
|
- c->userdata = NULL;
|
|
- c->scan_src = sd_event_source_unref(c->scan_src);
|
|
- context_ud_stop(c);
|
|
- context_ld_stop(c);
|
|
-
|
|
- /*
|
|
- * Event-callbacks are already cleared, hence we can safely ignore
|
|
- * return codes of the context_remove_*() helpers. They cannot be
|
|
- * originated from user-callbacks, so we already handled them.
|
|
- */
|
|
-
|
|
while ((device = hashmap_first(c->device_map)))
|
|
context_remove_device(c, device);
|
|
|
|
@@ -1459,6 +1445,14 @@ void sysview_context_stop(sysview_context *c) {
|
|
|
|
while ((seat = hashmap_first(c->seat_map)))
|
|
context_remove_seat(c, seat);
|
|
+
|
|
+ c->running = false;
|
|
+ c->scanned = false;
|
|
+ c->event_fn = NULL;
|
|
+ c->userdata = NULL;
|
|
+ c->scan_src = sd_event_source_unref(c->scan_src);
|
|
+ context_ud_stop(c);
|
|
+ context_ld_stop(c);
|
|
}
|
|
|
|
static int context_scan_fn(sd_event_source *s, void *userdata) {
|