1
1
mirror of https://github.com/systemd/systemd-stable.git synced 2024-10-27 10:25:06 +03:00

Merge pull request #377 from zonque/logind

logind: fix delayed execution regression
This commit is contained in:
Tom Gundersen 2015-06-26 21:41:44 +02:00
commit 281d4a7710
3 changed files with 29 additions and 7 deletions

View File

@ -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(

View File

@ -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;

View File

@ -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);