chiark / gitweb /
logind: ignore PropertiesChanged signals for jobs
[elogind.git] / src / login / logind.c
index b97ba6df3ea54a721f37d70323e082bb3d63dd79..554409926a120b0b6345c36b4861c874f159d83b 100644 (file)
@@ -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;
@@ -860,7 +862,7 @@ void manager_gc(Manager *m, bool drop_not_started) {
                 seat->in_gc_queue = false;
 
                 if (!seat_check_gc(seat, drop_not_started)) {
-                        seat_stop(seat);
+                        seat_stop(seat, false);
                         seat_free(seat);
                 }
         }
@@ -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;
 
+                /* 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, false);
+
+                /* 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_stop(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;
 
+                if (!user_check_gc(user, drop_not_started) &&
+                    user_get_state(user) != USER_CLOSING)
+                        user_stop(user, false);
+
                 if (!user_check_gc(user, drop_not_started)) {
-                        user_stop(user);
                         user_finalize(user);
                         user_free(user);
                 }