chiark
/
gitweb
/
~ianmdlvl
/
elogind.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
logind: rework session shutdown logic
[elogind.git]
/
src
/
login
/
logind.c
diff --git
a/src/login/logind.c
b/src/login/logind.c
index b97ba6df3ea54a721f37d70323e082bb3d63dd79..a6f84e85360cc172efd3aa017a77ec152c18c5aa 100644
(file)
--- a/
src/login/logind.c
+++ b/
src/login/logind.c
@@
-198,6
+198,10
@@
static int manager_enumerate_devices(Manager *m) {
if (r < 0)
return r;
if (r < 0)
return r;
+ r = udev_enumerate_add_match_is_initialized(e);
+ if (r < 0)
+ return r;
+
r = udev_enumerate_scan_devices(e);
if (r < 0)
return r;
r = udev_enumerate_scan_devices(e);
if (r < 0)
return r;
@@
-211,9
+215,6
@@
static int manager_enumerate_devices(Manager *m) {
if (!d)
return -ENOMEM;
if (!d)
return -ENOMEM;
- if (!udev_device_get_is_initialized(d))
- continue;
-
k = manager_process_seat_device(m, d);
if (k < 0)
r = k;
k = manager_process_seat_device(m, d);
if (k < 0)
r = k;
@@
-249,6
+250,10
@@
static int manager_enumerate_buttons(Manager *m) {
if (r < 0)
return r;
if (r < 0)
return r;
+ r = udev_enumerate_add_match_is_initialized(e);
+ if (r < 0)
+ return r;
+
r = udev_enumerate_scan_devices(e);
if (r < 0)
return r;
r = udev_enumerate_scan_devices(e);
if (r < 0)
return r;
@@
-262,9
+267,6
@@
static int manager_enumerate_buttons(Manager *m) {
if (!d)
return -ENOMEM;
if (!d)
return -ENOMEM;
- if (!udev_device_get_is_initialized(d))
- continue;
-
k = manager_process_button_device(m, d);
if (k < 0)
r = k;
k = manager_process_button_device(m, d);
if (k < 0)
r = k;
@@
-869,8
+871,15
@@
void manager_gc(Manager *m, bool drop_not_started) {
LIST_REMOVE(gc_queue, m->session_gc_queue, session);
session->in_gc_queue = false;
LIST_REMOVE(gc_queue, m->session_gc_queue, session);
session->in_gc_queue = false;
- if (!session_check_gc(session, drop_not_started)) {
+ /* First, if we are not closing yet, initiate stopping */
+ if (!session_check_gc(session, drop_not_started) &&
+ session_get_state(session) != SESSION_CLOSING)
session_stop(session);
session_stop(session);
+
+ /* Normally, this should make the session busy again,
+ * if it doesn't then let's get rid of it
+ * immediately */
+ if (!session_check_gc(session, drop_not_started)) {
session_finalize(session);
session_free(session);
}
session_finalize(session);
session_free(session);
}
@@
-880,8
+889,11
@@
void manager_gc(Manager *m, bool drop_not_started) {
LIST_REMOVE(gc_queue, m->user_gc_queue, user);
user->in_gc_queue = false;
LIST_REMOVE(gc_queue, m->user_gc_queue, user);
user->in_gc_queue = false;
- if (!user_check_gc(user, drop_not_started)) {
+ if (!user_check_gc(user, drop_not_started) &&
+ user_get_state(user) != USER_CLOSING)
user_stop(user);
user_stop(user);
+
+ if (!user_check_gc(user, drop_not_started)) {
user_finalize(user);
user_free(user);
}
user_finalize(user);
user_free(user);
}