logind: hook up inhibit logic with idle hint logic

This commit is contained in:
Lennart Poettering 2012-04-16 17:05:15 +02:00
parent f8e2fb7b14
commit c7b5eb98e8
4 changed files with 36 additions and 3 deletions

View File

@ -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") ?

View File

@ -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] = {

View File

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

View File

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