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().
v1->v2: - Only call instance_delete() in instance_stop() if halt is true (thanks Hans Dedecker). Signed-off-by: Kristian Evensen <kristian.even...@gmail.com> --- service/instance.c | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) 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); -- 2.19.1 _______________________________________________ openwrt-devel mailing list openwrt-devel@lists.openwrt.org https://lists.openwrt.org/mailman/listinfo/openwrt-devel