diff options
author | Felix Fietkau <nbd@openwrt.org> | 2012-06-07 18:58:42 +0200 |
---|---|---|
committer | Felix Fietkau <nbd@openwrt.org> | 2012-06-07 18:58:42 +0200 |
commit | 84c2e44d4c1ae46418cc8f7891b31e9df4131d96 (patch) | |
tree | f04e35d4d0f6dca6960f119254b13cf3ce740693 /instance.c | |
parent | 86009b5439a898fa00cc27e675bb7834576be70a (diff) | |
download | unitd-84c2e44d4c1ae46418cc8f7891b31e9df4131d96.tar unitd-84c2e44d4c1ae46418cc8f7891b31e9df4131d96.zip |
move instance code to a separate source file
Diffstat (limited to 'instance.c')
-rw-r--r-- | instance.c | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/instance.c b/instance.c new file mode 100644 index 0000000..e2c8b28 --- /dev/null +++ b/instance.c @@ -0,0 +1,85 @@ +#include "procd.h" +#include "service.h" +#include "instance.h" + +void +instance_start(struct service_instance *in) +{ + in->restart = false; +} + +static void +instance_timeout(struct uloop_timeout *t) +{ + struct service_instance *in; + + in = container_of(t, struct service_instance, timeout); + kill(in->proc.pid, SIGKILL); + uloop_process_delete(&in->proc); + in->proc.cb(&in->proc, -1); +} + +static void +instance_exit(struct uloop_process *p, int ret) +{ + struct service_instance *in; + + in = container_of(p, struct service_instance, proc); + uloop_timeout_cancel(&in->timeout); + if (in->restart) + instance_start(in); +} + +void +instance_stop(struct service_instance *in, bool restart) +{ + if (!in->proc.pending) + return; + + kill(in->proc.pid, SIGTERM); +} + +static bool +instance_config_changed(struct service_instance *in, struct service_instance *in_new) +{ + int len = blob_pad_len(in->config); + + if (len != blob_pad_len(in_new->config)) + return true; + + if (memcmp(in->config, in_new->config, blob_pad_len(in->config)) != 0) + return true; + + return false; +} + +bool +instance_update(struct service_instance *in, struct service_instance *in_new) +{ + bool changed = instance_config_changed(in, in_new); + + in->config = in_new->config; + if (!changed) + return false; + + instance_stop(in, true); + return true; +} + +void +instance_free(struct service_instance *in) +{ + uloop_process_delete(&in->proc); + uloop_timeout_cancel(&in->timeout); + free(in); +} + +void +instance_init(struct service_instance *in, struct blob_attr *config) +{ + in->config = config; + in->timeout.cb = instance_timeout; + in->proc.cb = instance_exit; +} + + |