diff options
author | Tom Gundersen <teg@jklm.no> | 2015-06-26 21:41:44 +0200 |
---|---|---|
committer | Tom Gundersen <teg@jklm.no> | 2015-06-26 21:41:44 +0200 |
commit | 281d4a7710b861559f11023657e661511d524ba0 (patch) | |
tree | 2bccb1831ba6c6581bbd6ba0c8e810e1032d6e48 /src/login | |
parent | 57a2bf232946ece2a59e4994440558b980017156 (diff) | |
parent | 418b22b88f79911fe5d76fabedd18ef1eb491680 (diff) |
Merge pull request #377 from zonque/logind
logind: fix delayed execution regression
Diffstat (limited to 'src/login')
-rw-r--r-- | src/login/logind-dbus.c | 28 | ||||
-rw-r--r-- | src/login/logind.c | 6 | ||||
-rw-r--r-- | src/login/logind.h | 2 |
3 files changed, 29 insertions, 7 deletions
diff --git a/src/login/logind-dbus.c b/src/login/logind-dbus.c index 8ebcd3f5ca..640ae92f7f 100644 --- a/src/login/logind-dbus.c +++ b/src/login/logind-dbus.c @@ -1486,18 +1486,13 @@ static int execute_shutdown_or_sleep( return 0; } -static int manager_inhibit_timeout_handler( - sd_event_source *s, - uint64_t usec, - void *userdata) { +int manager_dispatch_delayed(Manager *manager, bool timeout) { _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL; Inhibitor *offending = NULL; - Manager *manager = userdata; int r; assert(manager); - assert(manager->inhibit_timeout_source == s); if (manager->action_what == 0 || manager->action_job) return 0; @@ -1505,6 +1500,9 @@ static int manager_inhibit_timeout_handler( if (manager_is_inhibited(manager, manager->action_what, INHIBIT_DELAY, NULL, false, false, 0, &offending)) { _cleanup_free_ char *comm = NULL, *u = NULL; + if (!timeout) + return 0; + (void) get_process_comm(offending->pid, &comm); u = uid_to_name(offending->uid); @@ -1520,9 +1518,25 @@ static int manager_inhibit_timeout_handler( manager->action_unit = NULL; manager->action_what = 0; + return r; } - return 0; + return 1; +} + +static int manager_inhibit_timeout_handler( + sd_event_source *s, + uint64_t usec, + void *userdata) { + + Manager *manager = userdata; + int r; + + assert(manager); + assert(manager->inhibit_timeout_source == s); + + r = manager_dispatch_delayed(manager, true); + return (r < 0) ? r : 0; } static int delay_shutdown_or_sleep( diff --git a/src/login/logind.c b/src/login/logind.c index 01f7cd9ee0..e2fb496289 100644 --- a/src/login/logind.c +++ b/src/login/logind.c @@ -1109,6 +1109,12 @@ static int manager_run(Manager *m) { manager_gc(m, true); + r = manager_dispatch_delayed(m, false); + if (r < 0) + return r; + if (r > 0) + continue; + r = sd_event_run(m->event, (uint64_t) -1); if (r < 0) return r; diff --git a/src/login/logind.h b/src/login/logind.h index feb381d0b1..ad437b72cb 100644 --- a/src/login/logind.h +++ b/src/login/logind.h @@ -194,3 +194,5 @@ int manager_get_seat_from_creds(Manager *m, sd_bus_message *message, const char int manager_setup_wall_message_timer(Manager *m); bool logind_wall_tty_filter(const char *tty, void *userdata); + +int manager_dispatch_delayed(Manager *manager, bool timeout); |