summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2010-08-11 02:07:59 +0200
committerLennart Poettering <lennart@poettering.net>2010-08-11 02:07:59 +0200
commit6c073082e7e3859cb6020db8c548325f342b7ba6 (patch)
treedfc968328216e659a66b89f06114f8bf5580b0cf
parent4927fcae48de061393b3ce9c12d49f80d73fbf1d (diff)
socket: disable GC for pre-allocated per-connection service until it is used
-rw-r--r--src/socket.c3
-rw-r--r--src/unit.c3
-rw-r--r--src/unit.h2
3 files changed, 8 insertions, 0 deletions
diff --git a/src/socket.c b/src/socket.c
index 7c280e0067..23658ac274 100644
--- a/src/socket.c
+++ b/src/socket.c
@@ -165,6 +165,7 @@ static int socket_instantiate_service(Socket *s) {
if (r < 0)
return r;
+ u->meta.no_gc = true;
s->service = SERVICE(u);
return 0;
}
@@ -1202,6 +1203,8 @@ static void socket_enter_running(Socket *s, int cfd) {
s->service = NULL;
s->n_accepted ++;
+ service->meta.no_gc = false;
+
unit_choose_id(UNIT(service), name);
free(name);
diff --git a/src/unit.c b/src/unit.c
index 3c4bdec981..881f91a677 100644
--- a/src/unit.c
+++ b/src/unit.c
@@ -236,6 +236,9 @@ bool unit_check_gc(Unit *u) {
if (UNIT_VTABLE(u)->no_gc)
return true;
+ if (u->meta.no_gc)
+ return true;
+
if (u->meta.job)
return true;
diff --git a/src/unit.h b/src/unit.h
index 1c97e158fc..00e929ac4e 100644
--- a/src/unit.h
+++ b/src/unit.h
@@ -208,6 +208,8 @@ struct Meta {
bool in_gc_queue:1;
bool sent_dbus_new_signal:1;
+
+ bool no_gc:1;
};
#include "service.h"