diff options
author | Lennart Poettering <lennart@poettering.net> | 2013-11-22 19:17:52 +0100 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2013-11-22 19:27:56 +0100 |
commit | 92c1622e14dd99890928b1a1596e4a670b31a7ff (patch) | |
tree | 777b78cfd0a493f6f3715636bbb6e3e34e46a19c /src | |
parent | 66ca4ec48a63ee0e71532148b9b373cda318c7e2 (diff) |
service: honour that for services RestartSec=0 means immediate restarts but TimeoutSec= means no timing out at all
Diffstat (limited to 'src')
-rw-r--r-- | src/core/service.c | 40 |
1 files changed, 24 insertions, 16 deletions
diff --git a/src/core/service.c b/src/core/service.c index d9e525e485..e408338b10 100644 --- a/src/core/service.c +++ b/src/core/service.c @@ -346,11 +346,6 @@ static int service_arm_timer(Service *s, usec_t usec) { assert(s); - if (usec <= 0) { - s->timer_event_source = sd_event_source_unref(s->timer_event_source); - return 0; - } - if (s->timer_event_source) { r = sd_event_source_set_time(s->timer_event_source, now(CLOCK_MONOTONIC) + usec); if (r < 0) @@ -1597,21 +1592,30 @@ static int service_coldplug(Unit *u) { s->deserialized_state == SERVICE_STOP_SIGKILL || s->deserialized_state == SERVICE_STOP_POST || s->deserialized_state == SERVICE_FINAL_SIGTERM || - s->deserialized_state == SERVICE_FINAL_SIGKILL || - s->deserialized_state == SERVICE_AUTO_RESTART) { + s->deserialized_state == SERVICE_FINAL_SIGKILL) { + + usec_t k; - if (s->deserialized_state == SERVICE_AUTO_RESTART || s->timeout_start_usec > 0) { + k = s->deserialized_state == SERVICE_START_PRE || s->deserialized_state == SERVICE_START || + s->deserialized_state == SERVICE_START_POST || s->deserialized_state == SERVICE_RELOAD ? + s->timeout_start_usec : s->timeout_stop_usec; - r = service_arm_timer(s, - s->deserialized_state == SERVICE_AUTO_RESTART ? s->restart_usec : - s->deserialized_state == SERVICE_START_PRE || s->deserialized_state == SERVICE_START || - s->deserialized_state == SERVICE_START_POST || s->deserialized_state == SERVICE_RELOAD ? s->timeout_start_usec : - s->timeout_stop_usec); + /* For the start/stop timeouts 0 means off */ + if (k > 0) { + r = service_arm_timer(s, k); if (r < 0) return r; } } + if (s->deserialized_state == SERVICE_AUTO_RESTART) { + + /* The restart timeouts 0 means immediately */ + r = service_arm_timer(s, s->restart_usec); + if (r < 0) + return r; + } + if ((s->deserialized_state == SERVICE_START && (s->type == SERVICE_FORKING || s->type == SERVICE_DBUS || @@ -1651,6 +1655,7 @@ static int service_coldplug(Unit *u) { service_set_state(s, s->deserialized_state); } + return 0; } @@ -1763,9 +1768,12 @@ static int service_spawn( } } - r = service_arm_timer(s, timeout ? s->timeout_start_usec : 0); - if (r < 0) - goto fail; + if (timeout && s->timeout_start_usec > 0) { + r = service_arm_timer(s, s->timeout_start_usec); + if (r < 0) + goto fail; + } else + s->timer_event_source = sd_event_source_unref(s->timer_event_source); r = unit_full_printf_strv(UNIT(s), c->argv, &argv); if (r < 0) |