m->cgroups = hashmap_new(string_hash_func, string_compare_func);
m->fifo_fds = hashmap_new(trivial_hash_func, trivial_compare_func);
- if (!m->devices || !m->seats || !m->sessions || !m->users) {
+ if (!m->devices || !m->seats || !m->sessions || !m->users || !m->cgroups || !m->fifo_fds) {
+ manager_free(m);
+ return NULL;
+ }
+
+ m->reset_controllers = strv_new("cpu", NULL);
+ m->kill_exclude_users = strv_new("root", NULL);
+ if (!m->reset_controllers || !m->kill_exclude_users) {
manager_free(m);
return NULL;
}
assert(m);
- /* FIXME: drop this check as soon as libudev's enum support
- * honours tags and subsystem matches at the same time */
- if (!streq_ptr(udev_device_get_subsystem(d), "graphics"))
- return 0;
-
if (streq_ptr(udev_device_get_action(d), "remove")) {
/* FIXME: use syspath instead of sysname here, as soon as fb driver is fixed */
Seat *seat;
sn = udev_device_get_property_value(d, "ID_SEAT");
- if (!sn)
+ if (isempty(sn))
sn = "seat0";
if (!seat_name_is_valid(sn)) {
return r;
}
-
static int manager_enumerate_linger_users(Manager *m) {
DIR *d;
struct dirent *de;
while ((k = cg_read_subgroup(d, &name)) > 0) {
Session *session;
+ if (streq(name, "shared"))
+ continue;
+
k = manager_add_session(m, u, name, &session);
if (k < 0) {
free(name);
return 0;
}
-void manager_gc(Manager *m) {
+void manager_gc(Manager *m, bool drop_not_started) {
Seat *seat;
Session *session;
User *user;
LIST_REMOVE(Seat, gc_queue, m->seat_gc_queue, seat);
seat->in_gc_queue = false;
- if (seat_check_gc(seat) == 0) {
+ if (seat_check_gc(seat, drop_not_started) == 0) {
seat_stop(seat);
seat_free(seat);
}
LIST_REMOVE(Session, gc_queue, m->session_gc_queue, session);
session->in_gc_queue = false;
- if (session_check_gc(session) == 0) {
+ if (session_check_gc(session, drop_not_started) == 0) {
session_stop(session);
session_free(session);
}
LIST_REMOVE(User, gc_queue, m->user_gc_queue, user);
user->in_gc_queue = false;
- if (user_check_gc(user) == 0) {
+ if (user_check_gc(user, drop_not_started) == 0) {
user_stop(user);
user_free(user);
}
manager_enumerate_users(m);
manager_enumerate_sessions(m);
+ /* Remove stale objects before we start them */
+ manager_gc(m, false);
+
/* And start everything */
HASHMAP_FOREACH(seat, m->seats, i)
seat_start(seat);
struct epoll_event event;
int n;
- manager_gc(m);
+ manager_gc(m, true);
if (dbus_connection_dispatch(m->bus) != DBUS_DISPATCH_COMPLETE)
continue;
- manager_gc(m);
+ manager_gc(m, true);
n = epoll_wait(m->epoll_fd, &event, 1, -1);
if (n < 0) {
const ConfigItem items[] = {
{ "NAutoVTs", config_parse_unsigned, 0, &m->n_autovts, "Login" },
{ "KillUserProcesses", config_parse_bool, 0, &m->kill_user_processes, "Login" },
- { "KilOnlyUsers", config_parse_strv, 0, &m->kill_only_users, "Login" },
+ { "KillOnlyUsers", config_parse_strv, 0, &m->kill_only_users, "Login" },
{ "KillExcludeUsers", config_parse_strv, 0, &m->kill_exclude_users, "Login" },
{ "Controllers", config_parse_strv, 0, &m->controllers, "Login" },
{ "ResetControllers", config_parse_strv, 0, &m->reset_controllers, "Login" },