1
0
mirror of https://github.com/systemd/systemd.git synced 2024-10-29 04:55:36 +03:00

logind: switch to sd_bus_track helper

Let logind use the sd_bus_track helper object to track the controllers of
sessions. This does not only remove quite some code but also kills the
unconditional matches for all NameOwnerChanged signals.

The latter is something we should never ever do, as it wakes up the daemon
every time a client connects, which doesn't scale.
This commit is contained in:
Daniel Mack 2015-08-05 15:58:39 +02:00
parent 652f0e397f
commit 3cde9e8fa0
6 changed files with 23 additions and 99 deletions

View File

@ -183,44 +183,6 @@ int manager_add_button(Manager *m, const char *name, Button **_button) {
return 0;
}
int manager_watch_busname(Manager *m, const char *name) {
char *n;
int r;
assert(m);
assert(name);
if (set_get(m->busnames, (char*) name))
return 0;
n = strdup(name);
if (!n)
return -ENOMEM;
r = set_put(m->busnames, n);
if (r < 0) {
free(n);
return r;
}
return 0;
}
void manager_drop_busname(Manager *m, const char *name) {
Session *session;
Iterator i;
assert(m);
assert(name);
/* keep it if the name still owns a controller */
HASHMAP_FOREACH(session, m->sessions, i)
if (session_is_controller(session, name))
return;
free(set_remove(m->busnames, (char*) name));
}
int manager_process_seat_device(Manager *m, struct udev_device *d) {
Device *device;
int r;

View File

@ -2652,41 +2652,6 @@ int match_reloading(sd_bus_message *message, void *userdata, sd_bus_error *error
return 0;
}
int match_name_owner_changed(sd_bus_message *message, void *userdata, sd_bus_error *error) {
const char *name, *old, *new;
Manager *m = userdata;
Session *session;
Iterator i;
int r;
char *key;
assert(message);
assert(m);
r = sd_bus_message_read(message, "sss", &name, &old, &new);
if (r < 0) {
bus_log_parse_error(r);
return r;
}
if (isempty(old) || !isempty(new))
return 0;
key = set_remove(m->busnames, (char*) old);
if (!key)
return 0;
/* Drop all controllers owned by this name */
free(key);
HASHMAP_FOREACH(session, m->sessions, i)
if (session_is_controller(session, old))
session_drop_controller(session);
return 0;
}
int manager_send_changed(Manager *manager, const char *property, ...) {
char **l;

View File

@ -1120,7 +1120,18 @@ static void session_release_controller(Session *s, bool notify) {
session_device_free(sd);
s->controller = NULL;
manager_drop_busname(s->manager, name);
s->track = sd_bus_track_unref(s->track);
}
static int on_bus_track(sd_bus_track *track, void *userdata) {
Session *s = userdata;
assert(track);
assert(s);
session_drop_controller(s);
return 0;
}
int session_set_controller(Session *s, const char *sender, bool force) {
@ -1139,8 +1150,13 @@ int session_set_controller(Session *s, const char *sender, bool force) {
if (!name)
return -ENOMEM;
r = manager_watch_busname(s->manager, name);
if (r)
s->track = sd_bus_track_unref(s->track);
r = sd_bus_track_new(s->manager->bus, &s->track, on_bus_track, s);
if (r < 0)
return r;
r = sd_bus_track_add_name(s->track, name);
if (r < 0)
return r;
/* When setting a session controller, we forcibly mute the VT and set
@ -1153,7 +1169,7 @@ int session_set_controller(Session *s, const char *sender, bool force) {
* or reset the VT in case it crashed/exited, too. */
r = session_prepare_vt(s);
if (r < 0) {
manager_drop_busname(s->manager, name);
s->track = sd_bus_track_unref(s->track);
return r;
}
@ -1171,6 +1187,7 @@ void session_drop_controller(Session *s) {
if (!s->controller)
return;
s->track = sd_bus_track_unref(s->track);
session_release_controller(s, false);
session_save(s);
session_restore_vt(s);

View File

@ -117,6 +117,7 @@ struct Session {
char *controller;
Hashmap *devices;
sd_bus_track *track;
LIST_FIELDS(Session, sessions_by_user);
LIST_FIELDS(Session, sessions_by_seat);

View File

@ -76,10 +76,7 @@ static Manager *manager_new(void) {
m->user_units = hashmap_new(&string_hash_ops);
m->session_units = hashmap_new(&string_hash_ops);
m->busnames = set_new(&string_hash_ops);
if (!m->devices || !m->seats || !m->sessions || !m->users || !m->inhibitors || !m->buttons || !m->busnames ||
!m->user_units || !m->session_units)
if (!m->devices || !m->seats || !m->sessions || !m->users || !m->inhibitors || !m->buttons || !m->user_units || !m->session_units)
goto fail;
m->kill_exclude_users = strv_new("root", NULL);
@ -141,8 +138,6 @@ static void manager_free(Manager *m) {
hashmap_free(m->user_units);
hashmap_free(m->session_units);
set_free_free(m->busnames);
sd_event_source_unref(m->idle_action_event_source);
sd_event_source_unref(m->inhibit_timeout_source);
sd_event_source_unref(m->scheduled_shutdown_timeout_source);
@ -626,17 +621,6 @@ static int manager_connect_bus(Manager *m) {
if (r < 0)
return log_error_errno(r, "Failed to add user enumerator: %m");
r = sd_bus_add_match(m->bus,
NULL,
"type='signal',"
"sender='org.freedesktop.DBus',"
"interface='org.freedesktop.DBus',"
"member='NameOwnerChanged',"
"path='/org/freedesktop/DBus'",
match_name_owner_changed, m);
if (r < 0)
return log_error_errno(r, "Failed to add match for NameOwnerChanged: %m");
r = sd_bus_add_match(m->bus,
NULL,
"type='signal',"

View File

@ -48,8 +48,6 @@ struct Manager {
Hashmap *inhibitors;
Hashmap *buttons;
Set *busnames;
LIST_HEAD(Seat, seat_gc_queue);
LIST_HEAD(Session, session_gc_queue);
LIST_HEAD(User, user_gc_queue);
@ -181,9 +179,6 @@ int manager_job_is_active(Manager *manager, const char *path);
/* gperf lookup function */
const struct ConfigPerfItem* logind_gperf_lookup(const char *key, unsigned length);
int manager_watch_busname(Manager *manager, const char *name);
void manager_drop_busname(Manager *manager, const char *name);
int manager_set_lid_switch_ignore(Manager *m, usec_t until);
int config_parse_tmpfs_size(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);