From: Kristian Evensen Date: Sat, 6 Apr 2019 12:28:30 +0000 (+0200) Subject: procd: instance: Support deleting stopped instances X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=baaf38c5e540b23ba086d94743de860b60c37161;p=oweals%2Fprocd.git procd: instance: Support deleting stopped instances procd currently does not support deleting a stopped instance. The reason is that we return in instance_stop(), if pending is set to false. This patch adds a new function, instance_delete(), which does the necessary clean-up of an instance. instance_delete() is called before we return in instance_stop(), as well as when a process that should not be restarted has exited in instance_exit(). Signed-off-by: Kristian Evensen --- diff --git a/service/instance.c b/service/instance.c index a5742b7..3512f66 100644 --- a/service/instance.c +++ b/service/instance.c @@ -518,6 +518,16 @@ instance_timeout(struct uloop_timeout *t) instance_start(in); } +static void +instance_delete(struct service_instance *in) +{ + struct service *s = in->srv; + + avl_delete(&s->instances.avl, &in->node.avl); + instance_free(in); + service_stopped(s); +} + static void instance_exit(struct uloop_process *p, int ret) { @@ -539,13 +549,8 @@ instance_exit(struct uloop_process *p, int ret) instance_removepid(in); if (in->restart) instance_start(in); - else { - struct service *s = in->srv; - - avl_delete(&s->instances.avl, &in->node.avl); - instance_free(in); - service_stopped(s); - } + else + instance_delete(in); } else if (in->restart) { instance_start(in); } else if (in->respawn) { @@ -569,8 +574,11 @@ instance_exit(struct uloop_process *p, int ret) void instance_stop(struct service_instance *in, bool halt) { - if (!in->proc.pending) + if (!in->proc.pending) { + if (halt) + instance_delete(in); return; + } in->halt = halt; in->restart = in->respawn = false; kill(in->proc.pid, SIGTERM);