From 8ce7d986283f5ef63377a0a447850c970c5cc493 Mon Sep 17 00:00:00 2001 From: David Oberhollenzer Date: Thu, 14 May 2020 01:41:30 +0200 Subject: Move service rt data to libinit, try to improve memory packing Signed-off-by: David Oberhollenzer --- initd/init.h | 18 ------------------ lib/include/service.h | 33 ++++++++++++++++++++++++++------- lib/init/rdsvc.c | 28 ++++++++++++++++++++-------- lib/init/svc_tsort.c | 2 +- 4 files changed, 47 insertions(+), 34 deletions(-) diff --git a/initd/init.h b/initd/init.h index deb6da9..3400ec0 100644 --- a/initd/init.h +++ b/initd/init.h @@ -28,24 +28,6 @@ #define ENVFILE ETCPATH "/initd.env" #define PROCFDDIR "/proc/self/fd" -/* service run time data */ - -enum { - STATE_OFF, - STATE_RUNNING, - STATE_QUEUED, - STATE_COMPLETED, - STATE_FAILED, -}; - -typedef struct { - service_t *svc; /* the underlying service description */ - int state; /* what STATE_* the service is currently in */ - int rspwn_count; /* services respawn counter */ - int status; /* if exited, process exit status */ - pid_t pid; /* if still running, the pid */ -} svc_run_data_t; - /********** runsvc.c **********/ /* diff --git a/lib/include/service.h b/lib/include/service.h index 05ab8de..f388f87 100644 --- a/lib/include/service.h +++ b/lib/include/service.h @@ -3,6 +3,7 @@ #define SERVICE_H #include +#include typedef struct exec_t { struct exec_t *next; @@ -10,6 +11,14 @@ typedef struct exec_t { char args[]; /* argument vectot string blob */ } exec_t; +enum { + STATE_OFF, + STATE_RUNNING, + STATE_QUEUED, + STATE_COMPLETED, + STATE_FAILED, +}; + enum { /* Start the service in the background and continue with @@ -44,17 +53,13 @@ enum { SVC_FLAG_HAS_EXEC = 0x10, }; +/* persistent service configuration read from disk */ typedef struct service_t { struct service_t *next; char *fname; /* source file name */ - - int type; /* SVC_* service type */ - int target; /* TGT_* service target */ char *desc; /* description string */ char *ctty; /* controlling tty or log file */ - int rspwn_limit; /* maximum respawn count */ - unsigned int flags; /* SVC_FLAG_* bit field */ /* linked list of command lines to execute */ exec_t *exec; @@ -62,8 +67,13 @@ typedef struct service_t { char *before; /* services that must be executed later */ char *after; /* services that must be executed first */ - int num_before; - int num_after; + uint32_t num_before; + uint32_t num_after; + + uint16_t rspwn_limit; /* maximum respawn count */ + uint16_t flags; /* SVC_FLAG_* bit field */ + uint8_t type; /* SVC_* service type */ + uint8_t target; /* TGT_* service target */ char name[]; /* canonical service name */ } service_t; @@ -72,6 +82,15 @@ typedef struct { service_t *targets[TGT_MAX]; } service_list_t; +/* run time configuration in-memory for managing services */ +typedef struct { + service_t *svc; /* the underlying service description */ + pid_t pid; /* if still running, the pid */ + uint16_t rspwn_count; /* services respawn counter */ + uint8_t state; /* what STATE_* the service is currently in */ + uint8_t status; /* if exited, process exit status */ +} svc_run_data_t; + /* Read a service from a file. */ diff --git a/lib/init/rdsvc.c b/lib/init/rdsvc.c index c461d98..9992668 100644 --- a/lib/init/rdsvc.c +++ b/lib/init/rdsvc.c @@ -104,6 +104,7 @@ static int svc_exec(void *user, char *arg, rdline_t *rd) static int svc_before(void *user, char *arg, rdline_t *rd) { service_t *svc = user; + int ret; if (svc->before != NULL) { fprintf(stderr, "%s: %zu: 'before' dependencies respecified\n", @@ -115,13 +116,18 @@ static int svc_before(void *user, char *arg, rdline_t *rd) if (svc->before == NULL) return -1; - svc->num_before = try_pack_argv(svc->before, rd); - return (svc->num_before < 0) ? -1 : 0; + ret = try_pack_argv(svc->before, rd); + if (ret < 0) + return -1; + + svc->num_before = ret; + return 0; } static int svc_after(void *user, char *arg, rdline_t *rd) { service_t *svc = user; + int ret; if (svc->after != NULL) { fprintf(stderr, "%s: %zu: 'after' dependencies respecified\n", @@ -133,26 +139,32 @@ static int svc_after(void *user, char *arg, rdline_t *rd) if (svc->after == NULL) return -1; - svc->num_after = try_pack_argv(svc->after, rd); - return (svc->num_after < 0) ? -1 : 0; + ret = try_pack_argv(svc->after, rd); + if (ret < 0) + return -1; + + svc->num_after = ret; + return 0; } static int svc_type(void *user, char *arg, rdline_t *rd) { service_t *svc = user; - int count = try_pack_argv(arg, rd); + int ret, count; + count = try_pack_argv(arg, rd); if (count < 1) return -1; - svc->type = svc_type_from_string(arg); - - if (svc->type == -1) { + ret = svc_type_from_string(arg); + if (ret < 0) { fprintf(stderr, "%s: %zu: unknown service type '%s'\n", rd->filename, rd->lineno, arg); return -1; } + svc->type = ret; + if (count > 1) { arg += strlen(arg) + 1; diff --git a/lib/init/svc_tsort.c b/lib/init/svc_tsort.c index 37f3eb8..99feac8 100644 --- a/lib/init/svc_tsort.c +++ b/lib/init/svc_tsort.c @@ -9,7 +9,7 @@ static bool has_dependencies(service_t *list, service_t *svc) { const char *ptr; - int i; + uint32_t i; while (list != NULL) { for (ptr = svc->after, i = 0; i < svc->num_after; ++i) { -- cgit v1.2.3