chiark / gitweb /
logind: when initializing drop sessions that are unreferenced
authorLennart Poettering <lennart@poettering.net>
Wed, 29 Jun 2011 01:48:16 +0000 (03:48 +0200)
committerLennart Poettering <lennart@poettering.net>
Wed, 29 Jun 2011 01:48:16 +0000 (03:48 +0200)
src/logind-seat.c
src/logind-seat.h
src/logind-session.c
src/logind-session.h
src/logind-user.c
src/logind-user.h
src/logind.c
src/logind.h

index b8f1f607d09f8f13eab19849aed3db306d966784..3cf3958c8d47330d13cac925573238713a54ef55 100644 (file)
@@ -446,10 +446,10 @@ int seat_get_idle_hint(Seat *s, dual_timestamp *t) {
         return idle_hint;
 }
 
-int seat_check_gc(Seat *s) {
+int seat_check_gc(Seat *s, bool drop_not_started) {
         assert(s);
 
-        if (!s->started)
+        if (drop_not_started && !s->started)
                 return 0;
 
         if (seat_is_vtconsole(s))
index 6d9c36db34c12e9a04a428731e09a9ac77a2baf5..5bce1434e90dcbe034a72c487a8428fbda319ee9 100644 (file)
@@ -68,7 +68,7 @@ int seat_start(Seat *s);
 int seat_stop(Seat *s);
 int seat_stop_sessions(Seat *s);
 
-int seat_check_gc(Seat *s);
+int seat_check_gc(Seat *s, bool drop_not_started);
 void seat_add_to_gc_queue(Seat *s);
 
 bool seat_name_is_valid(const char *name);
index 088e956bfcf5366f53743759a2c73d841ded9eef..35213098466c89588984ed0eb3866e7f577c8a07 100644 (file)
@@ -841,12 +841,12 @@ void session_remove_fifo(Session *s) {
         }
 }
 
-int session_check_gc(Session *s) {
+int session_check_gc(Session *s, bool drop_not_started) {
         int r;
 
         assert(s);
 
-        if (!s->started)
+        if (drop_not_started && !s->started)
                 return 0;
 
         if (s->fifo_fd >= 0) {
index d0cf0ed8866e3888a2be47938d69e27c61a9db91..303e61abdfb7fc34cc9d7eac8cc72b5a3323391b 100644 (file)
@@ -86,7 +86,7 @@ struct Session {
 
 Session *session_new(Manager *m, User *u, const char *id);
 void session_free(Session *s);
-int session_check_gc(Session *s);
+int session_check_gc(Session *s, bool drop_not_started);
 void session_add_to_gc_queue(Session *s);
 int session_activate(Session *s);
 bool session_is_active(Session *s);
index 3076ed15738fb68ca5b37438315151406d1722b1..dacf148f7829e603c2224447408054e8cb052a58 100644 (file)
@@ -457,13 +457,13 @@ int user_get_idle_hint(User *u, dual_timestamp *t) {
         return idle_hint;
 }
 
-int user_check_gc(User *u) {
+int user_check_gc(User *u, bool drop_not_started) {
         int r;
         char *p;
 
         assert(u);
 
-        if (!u->started)
+        if (drop_not_started && !u->started)
                 return 0;
 
         if (u->sessions)
index dd0dcad9cfa65bec5d3fd69b270482b068a95552..8a8d5ede4098ebd9f2aa14bf3999faff3b016061 100644 (file)
@@ -63,7 +63,7 @@ struct User {
 
 User* user_new(Manager *m, uid_t uid, gid_t gid, const char *name);
 void user_free(User *u);
-int user_check_gc(User *u);
+int user_check_gc(User *u, bool drop_not_started);
 void user_add_to_gc_queue(User *u);
 int user_start(User *u);
 int user_stop(User *u);
index d7d04a2c53ddfa07e435da0fd2b2e62c0bf7b5a0..9bab8751318153886d86001a31a94a133d983b33 100644 (file)
@@ -975,7 +975,7 @@ static int manager_connect_udev(Manager *m) {
         return 0;
 }
 
-void manager_gc(Manager *m) {
+void manager_gc(Manager *m, bool drop_not_started) {
         Seat *seat;
         Session *session;
         User *user;
@@ -986,7 +986,7 @@ void manager_gc(Manager *m) {
                 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);
                 }
@@ -996,7 +996,7 @@ void manager_gc(Manager *m) {
                 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);
                 }
@@ -1006,7 +1006,7 @@ void manager_gc(Manager *m) {
                 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);
                 }
@@ -1090,6 +1090,9 @@ int manager_startup(Manager *m) {
         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);
@@ -1110,12 +1113,12 @@ int manager_run(Manager *m) {
                 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) {
index ebf859eb2ef14068bc940d766a4c9ac2a3151807..8726502c1c8e953d911eb7d4ee603c40d92db6b0 100644 (file)
@@ -131,7 +131,7 @@ int manager_spawn_autovt(Manager *m, int vtnr);
 
 void manager_cgroup_notify_empty(Manager *m, const char *cgroup);
 
-void manager_gc(Manager *m);
+void manager_gc(Manager *m, bool drop_not_started);
 
 int manager_get_idle_hint(Manager *m, dual_timestamp *t);