diff --git a/src/core/execute.c b/src/core/execute.c index 80736abbfd..ccfe3e097d 100644 --- a/src/core/execute.c +++ b/src/core/execute.c @@ -3685,6 +3685,24 @@ void exec_command_free_array(ExecCommand **c, size_t n) { c[i] = exec_command_free_list(c[i]); } +void exec_command_reset_status_array(ExecCommand *c, size_t n) { + size_t i; + + for (i = 0; i < n; i++) + exec_status_reset(&c[i].exec_status); +} + +void exec_command_reset_status_list_array(ExecCommand **c, size_t n) { + size_t i; + + for (i = 0; i < n; i++) { + ExecCommand *z; + + LIST_FOREACH(command, z, c[i]) + exec_status_reset(&z->exec_status); + } +} + typedef struct InvalidEnvInfo { const Unit *unit; const char *path; @@ -4364,6 +4382,12 @@ void exec_status_exit(ExecStatus *s, const ExecContext *context, pid_t pid, int } } +void exec_status_reset(ExecStatus *s) { + assert(s); + + *s = (ExecStatus) {}; +} + void exec_status_dump(const ExecStatus *s, FILE *f, const char *prefix) { char buf[FORMAT_TIMESTAMP_MAX]; diff --git a/src/core/execute.h b/src/core/execute.h index bc832eebf0..678ee5b189 100644 --- a/src/core/execute.h +++ b/src/core/execute.h @@ -340,10 +340,10 @@ int exec_spawn(Unit *unit, pid_t *ret); void exec_command_done_array(ExecCommand *c, size_t n); - ExecCommand* exec_command_free_list(ExecCommand *c); void exec_command_free_array(ExecCommand **c, size_t n); - +void exec_command_reset_status_array(ExecCommand *c, size_t n); +void exec_command_reset_status_list_array(ExecCommand **c, size_t n); void exec_command_dump_list(ExecCommand *c, FILE *f, const char *prefix); void exec_command_append_list(ExecCommand **l, ExecCommand *e); int exec_command_set(ExecCommand *c, const char *path, ...); @@ -367,6 +367,7 @@ void exec_context_free_log_extra_fields(ExecContext *c); void exec_status_start(ExecStatus *s, pid_t pid); void exec_status_exit(ExecStatus *s, const ExecContext *context, pid_t pid, int code, int status); void exec_status_dump(const ExecStatus *s, FILE *f, const char *prefix); +void exec_status_reset(ExecStatus *s); int exec_runtime_acquire(Manager *m, const ExecContext *c, const char *name, bool create, ExecRuntime **ret); ExecRuntime *exec_runtime_unref(ExecRuntime *r, bool destroy); diff --git a/src/core/mount.c b/src/core/mount.c index 21437dad08..75e1b6ac53 100644 --- a/src/core/mount.c +++ b/src/core/mount.c @@ -1074,6 +1074,7 @@ static int mount_start(Unit *u) { m->result = MOUNT_SUCCESS; m->reload_result = MOUNT_SUCCESS; + exec_command_reset_status_array(m->exec_command, _MOUNT_EXEC_COMMAND_MAX); u->reset_accounting = true; diff --git a/src/core/service.c b/src/core/service.c index 872bb77526..7476ee5333 100644 --- a/src/core/service.c +++ b/src/core/service.c @@ -1673,7 +1673,6 @@ static void service_enter_stop_post(Service *s, ServiceResult f) { s->result = f; service_unwatch_control_pid(s); - (void) unit_enqueue_rewatch_pids(UNIT(s)); s->control_command = s->exec_command[SERVICE_EXEC_STOP_POST]; @@ -2252,8 +2251,6 @@ static int service_start(Unit *u) { s->main_pid_alien = false; s->forbid_restart = false; - u->reset_accounting = true; - s->status_text = mfree(s->status_text); s->status_errno = 0; @@ -2262,12 +2259,17 @@ static int service_start(Unit *u) { s->watchdog_override_enable = false; s->watchdog_override_usec = 0; + exec_command_reset_status_list_array(s->exec_command, _SERVICE_EXEC_COMMAND_MAX); + exec_status_reset(&s->main_exec_status); + /* This is not an automatic restart? Flush the restart counter then */ if (s->flush_n_restarts) { s->n_restarts = 0; s->flush_n_restarts = false; } + u->reset_accounting = true; + service_enter_start_pre(s); return 1; } diff --git a/src/core/socket.c b/src/core/socket.c index 1bd32cf250..a6127654b5 100644 --- a/src/core/socket.c +++ b/src/core/socket.c @@ -2457,6 +2457,7 @@ static int socket_start(Unit *u) { return r; s->result = SOCKET_SUCCESS; + exec_command_reset_status_list_array(s->exec_command, _SOCKET_EXEC_COMMAND_MAX); u->reset_accounting = true; diff --git a/src/core/swap.c b/src/core/swap.c index b78b1aa266..f8d6a4dd22 100644 --- a/src/core/swap.c +++ b/src/core/swap.c @@ -853,6 +853,7 @@ static int swap_start(Unit *u) { return r; s->result = SWAP_SUCCESS; + exec_command_reset_status_array(s->exec_command, _SWAP_EXEC_COMMAND_MAX); u->reset_accounting = true;