X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Flogin%2Flogind.c;h=a6f84e85360cc172efd3aa017a77ec152c18c5aa;hb=89f7c8465cd1ab37347dd0c15920bce31e8225df;hp=b97ba6df3ea54a721f37d70323e082bb3d63dd79;hpb=bf5332d2bf2a1acbba9daacf40570a4addbd3411;p=elogind.git diff --git a/src/login/logind.c b/src/login/logind.c index b97ba6df3..a6f84e853 100644 --- 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; + r = udev_enumerate_add_match_is_initialized(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 (!udev_device_get_is_initialized(d)) - continue; - 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; + r = udev_enumerate_add_match_is_initialized(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 (!udev_device_get_is_initialized(d)) - continue; - 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; - 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); + + /* 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); } @@ -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; - 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); + + if (!user_check_gc(user, drop_not_started)) { user_finalize(user); user_free(user); }