mirror of
https://github.com/systemd/systemd-stable.git
synced 2025-03-06 12:58:22 +03:00
logind: hook up inhibit logic with idle hint logic
This commit is contained in:
parent
f8e2fb7b14
commit
c7b5eb98e8
@ -1649,7 +1649,7 @@ static DBusHandlerResult manager_message_handler(
|
||||
return bus_send_error_reply(connection, message, &error, r);
|
||||
|
||||
multiple_sessions = r > 0;
|
||||
inhibit = !!(manager_inhibit_what(m) & INHIBIT_SHUTDOWN);
|
||||
inhibit = manager_is_inhibited(m, INHIBIT_SHUTDOWN, NULL);
|
||||
|
||||
if (multiple_sessions) {
|
||||
action = streq(dbus_message_get_member(message), "PowerOff") ?
|
||||
@ -1723,7 +1723,7 @@ static DBusHandlerResult manager_message_handler(
|
||||
return bus_send_error_reply(connection, message, &error, r);
|
||||
|
||||
multiple_sessions = r > 0;
|
||||
inhibit = !!(manager_inhibit_what(m) & INHIBIT_SHUTDOWN);
|
||||
inhibit = manager_is_inhibited(m, INHIBIT_SHUTDOWN, NULL);
|
||||
|
||||
if (multiple_sessions) {
|
||||
action = streq(dbus_message_get_member(message), "CanPowerOff") ?
|
||||
|
@ -150,6 +150,8 @@ int inhibitor_start(Inhibitor *i) {
|
||||
if (i->started)
|
||||
return 0;
|
||||
|
||||
dual_timestamp_get(&i->since);
|
||||
|
||||
log_debug("Inhibitor %s (%s) pid=%lu uid=%lu started.",
|
||||
strna(i->who), strna(i->why),
|
||||
(unsigned long) i->pid, (unsigned long) i->uid);
|
||||
@ -325,6 +327,32 @@ InhibitWhat manager_inhibit_what(Manager *m) {
|
||||
return what;
|
||||
}
|
||||
|
||||
bool manager_is_inhibited(Manager *m, InhibitWhat w, dual_timestamp *since) {
|
||||
Inhibitor *i;
|
||||
Iterator j;
|
||||
struct dual_timestamp ts = { 0, 0 };
|
||||
bool inhibited = false;
|
||||
|
||||
assert(m);
|
||||
assert(w > 0 && w < _INHIBIT_WHAT_MAX);
|
||||
|
||||
HASHMAP_FOREACH(i, m->inhibitor_fds, j) {
|
||||
if (!(i->what & w))
|
||||
continue;
|
||||
|
||||
if (!inhibited ||
|
||||
i->since.monotonic < ts.monotonic)
|
||||
ts = i->since;
|
||||
|
||||
inhibited = true;
|
||||
}
|
||||
|
||||
if (since)
|
||||
*since = ts;
|
||||
|
||||
return inhibited;
|
||||
}
|
||||
|
||||
const char *inhibit_what_to_string(InhibitWhat w) {
|
||||
|
||||
static const char* const table[_INHIBIT_WHAT_MAX] = {
|
||||
|
@ -52,6 +52,8 @@ struct Inhibitor {
|
||||
pid_t pid;
|
||||
uid_t uid;
|
||||
|
||||
dual_timestamp since;
|
||||
|
||||
char *fifo_path;
|
||||
int fifo_fd;
|
||||
};
|
||||
@ -69,6 +71,7 @@ int inhibitor_create_fifo(Inhibitor *i);
|
||||
void inhibitor_remove_fifo(Inhibitor *i);
|
||||
|
||||
InhibitWhat manager_inhibit_what(Manager *m);
|
||||
bool manager_is_inhibited(Manager *m, InhibitWhat w, dual_timestamp *since);
|
||||
|
||||
const char *inhibit_what_to_string(InhibitWhat k);
|
||||
InhibitWhat inhibit_what_from_string(const char *s);
|
||||
|
@ -1157,12 +1157,14 @@ void manager_gc(Manager *m, bool drop_not_started) {
|
||||
|
||||
int manager_get_idle_hint(Manager *m, dual_timestamp *t) {
|
||||
Session *s;
|
||||
bool idle_hint = true;
|
||||
bool idle_hint;
|
||||
dual_timestamp ts = { 0, 0 };
|
||||
Iterator i;
|
||||
|
||||
assert(m);
|
||||
|
||||
idle_hint = !manager_is_inhibited(m, INHIBIT_IDLE, t);
|
||||
|
||||
HASHMAP_FOREACH(s, m->sessions, i) {
|
||||
dual_timestamp k;
|
||||
int ih;
|
||||
|
Loading…
x
Reference in New Issue
Block a user