summaryrefslogtreecommitdiff
path: root/src/gw_backend.c
diff options
context:
space:
mode:
authorGlenn Strauss <gstrauss@gluelogic.com>2021-08-30 20:45:14 -0400
committerGlenn Strauss <gstrauss@gluelogic.com>2021-09-08 15:06:07 -0400
commit9c7ef4f064ea08665cfa7de4a41130044a646910 (patch)
tree8ceee94c6007b9c514048aebd503f19944c4c9f3 /src/gw_backend.c
parent33ffec35ad1a95c65b12970aca9ebf033422fa9e (diff)
downloadlighttpd-git-9c7ef4f064ea08665cfa7de4a41130044a646910.tar.gz
[core] consolidate more gw_host, gw_proc init code
clearer code: host->num_procs as num gw_proc in host->first linked list
Diffstat (limited to 'src/gw_backend.c')
-rw-r--r--src/gw_backend.c133
1 files changed, 60 insertions, 73 deletions
diff --git a/src/gw_backend.c b/src/gw_backend.c
index b656baa0..f096eb86 100644
--- a/src/gw_backend.c
+++ b/src/gw_backend.c
@@ -100,7 +100,7 @@ static void gw_host_reset(gw_host *host) {
*host->stats_load = --host->load; /* "gw.backend...load" */
}
-static int gw_status_init(gw_host *host, gw_proc *proc) {
+static void gw_status_init_proc(gw_host *host, gw_proc *proc) {
*gw_status_get_counter(host, proc, CONST_STR_LEN(".disabled")) = 0;
*gw_status_get_counter(host, proc, CONST_STR_LEN(".died")) = 0;
*gw_status_get_counter(host, proc, CONST_STR_LEN(".overloaded")) = 0;
@@ -110,14 +110,14 @@ static int gw_status_init(gw_host *host, gw_proc *proc) {
proc->stats_load =
gw_status_get_counter(host, proc, CONST_STR_LEN(".load"));
*proc->stats_load = 0;
+}
+static void gw_status_init_host(gw_host *host) {
host->stats_load =
gw_status_get_counter(host, NULL, CONST_STR_LEN(".load"));
*host->stats_load = 0;
host->stats_global_active =
status_counter_get_counter(CONST_STR_LEN("gw.active-requests"));
-
- return 0;
}
@@ -134,30 +134,57 @@ static void gw_proc_set_state(gw_host *host, gw_proc *proc, int state) {
}
-static gw_proc *gw_proc_init(void) {
- gw_proc *f = calloc(1, sizeof(*f));
- force_assert(f);
+__attribute_cold__
+__attribute_noinline__
+static void gw_proc_init_portpath(gw_host *host, gw_proc *proc) {
+ if (!host->unixsocket) {
+ proc->port = host->port + proc->id;
+ return;
+ }
+
+ if (!proc->unixsocket)
+ proc->unixsocket = buffer_init();
+
+ if (!host->bin_path)
+ buffer_copy_buffer(proc->unixsocket, host->unixsocket);
+ else {
+ buffer_clear(proc->unixsocket);
+ buffer_append_str2(proc->unixsocket, BUF_PTR_LEN(host->unixsocket),
+ CONST_STR_LEN("-"));
+ buffer_append_int(proc->unixsocket, proc->id);
+ }
+}
+
+__attribute_cold__
+__attribute_noinline__
+static gw_proc *gw_proc_init(gw_host *host) {
+ gw_proc *proc = calloc(1, sizeof(*proc));
+ force_assert(proc);
+
+ /*proc->unixsocket = buffer_init();*//*(init on demand)*/
+ proc->connection_name = buffer_init();
- /*f->unixsocket = buffer_init();*//*(init on demand)*/
- f->connection_name = buffer_init();
+ proc->prev = NULL;
+ proc->next = NULL;
+ proc->state = PROC_STATE_DIED;
- f->prev = NULL;
- f->next = NULL;
- f->state = PROC_STATE_DIED;
+ proc->id = host->max_id++;
+ gw_status_init_proc(host, proc); /*(proc->id must be set)*/
+ gw_proc_init_portpath(host, proc);
- return f;
+ return proc;
}
-static void gw_proc_free(gw_proc *f) {
- if (!f) return;
+static void gw_proc_free(gw_proc *proc) {
+ if (!proc) return;
- gw_proc_free(f->next);
+ gw_proc_free(proc->next);
- buffer_free(f->unixsocket);
- buffer_free(f->connection_name);
- free(f->saddr);
+ buffer_free(proc->unixsocket);
+ buffer_free(proc->connection_name);
+ free(proc->saddr);
- free(f);
+ free(proc);
}
static gw_host *gw_host_init(void) {
@@ -466,6 +493,7 @@ static int env_add(char_array *env, const char *key, size_t key_len, const char
return 0;
}
+__attribute_cold__
static int gw_spawn_connection(gw_host * const host, gw_proc * const proc, log_error_st * const errh, int debug) {
int gw_fd;
int status;
@@ -637,6 +665,7 @@ static int gw_spawn_connection(gw_host * const host, gw_proc * const proc, log_e
return 0;
}
+__attribute_cold__
static void gw_proc_spawn(gw_host * const host, log_error_st * const errh, const int debug) {
gw_proc *proc;
for (proc = host->unused_procs; proc; proc = proc->next) {
@@ -658,22 +687,9 @@ static void gw_proc_spawn(gw_host * const host, log_error_st * const errh, const
}
proc->prev = NULL;
+ gw_proc_init_portpath(host, proc);
} else {
- proc = gw_proc_init();
- proc->id = host->max_id++;
- if (host->unixsocket)
- proc->unixsocket = buffer_init();
- }
-
- ++host->num_procs;
-
- if (!host->unixsocket) {
- proc->port = host->port + proc->id;
- } else {
- buffer_clear(proc->unixsocket);
- buffer_append_str2(proc->unixsocket, BUF_PTR_LEN(host->unixsocket),
- CONST_STR_LEN("-"));
- buffer_append_int(proc->unixsocket, proc->id);
+ proc = gw_proc_init(host);
}
if (0 != gw_proc_sockaddr_init(host, proc, errh)) {
@@ -681,7 +697,6 @@ static void gw_proc_spawn(gw_host * const host, log_error_st * const errh, const
* and translated from name to IP address at startup)*/
log_error(errh, __FILE__, __LINE__,
"ERROR: spawning backend failed.");
- --host->num_procs;
if (proc->id == host->max_id-1) --host->max_id;
gw_proc_free(proc);
} else if (gw_spawn_connection(host, proc, errh, debug)) {
@@ -696,14 +711,15 @@ static void gw_proc_spawn(gw_host * const host, log_error_st * const errh, const
if (host->first)
host->first->prev = proc;
host->first = proc;
+ ++host->num_procs;
}
}
static void gw_proc_kill(gw_host *host, gw_proc *proc) {
if (proc->next) proc->next->prev = proc->prev;
if (proc->prev) proc->prev->next = proc->next;
-
- if (proc->prev == NULL) host->first = proc->next;
+ else host->first = proc->next;
+ --host->num_procs;
proc->prev = NULL;
proc->next = host->unused_procs;
@@ -716,8 +732,6 @@ static void gw_proc_kill(gw_host *host, gw_proc *proc) {
kill(proc->pid, host->kill_signal);
gw_proc_set_state(host, proc, PROC_STATE_KILLED);
-
- --host->num_procs;
}
__attribute_pure__
@@ -1565,6 +1579,8 @@ int gw_set_defaults_backend(server *srv, gw_plugin_data *p, const array *a, gw_p
? AF_INET6
: AF_INET;
}
+ if (!host->refcount)
+ gw_status_init_host(host);
if (host->refcount) {
/* already init'd; skip spawning */
@@ -1635,19 +1651,7 @@ int gw_set_defaults_backend(server *srv, gw_plugin_data *p, const array *a, gw_p
}
for (uint32_t pno = 0; pno < host->min_procs; ++pno) {
- gw_proc *proc = gw_proc_init();
- proc->id = host->num_procs++;
- host->max_id++;
-
- if (!host->unixsocket) {
- proc->port = host->port + pno;
- } else {
- proc->unixsocket = buffer_init();
- buffer_append_str2(proc->unixsocket,
- BUF_PTR_LEN(host->unixsocket),
- CONST_STR_LEN("-"));
- buffer_append_int(proc->unixsocket, pno);
- }
+ gw_proc * const proc = gw_proc_init(host);
if (s->debug) {
log_error(srv->errh, __FILE__, __LINE__,
@@ -1673,36 +1677,19 @@ int gw_set_defaults_backend(server *srv, gw_plugin_data *p, const array *a, gw_p
goto error;
}
- gw_status_init(host, proc);
-
proc->next = host->first;
if (host->first) host->first->prev = proc;
-
host->first = proc;
+ ++host->num_procs;
}
} else {
- gw_proc *proc;
-
- proc = gw_proc_init();
- proc->id = host->num_procs++;
- host->max_id++;
- gw_proc_set_state(host, proc, PROC_STATE_RUNNING);
-
- if (!host->unixsocket) {
- proc->port = host->port;
- } else {
- proc->unixsocket = buffer_init();
- buffer_copy_buffer(proc->unixsocket, host->unixsocket);
- }
-
- gw_status_init(host, proc);
-
+ gw_proc * const proc = gw_proc_init(host);
host->first = proc;
-
+ ++host->num_procs;
host->min_procs = 1;
host->max_procs = 1;
-
if (0 != gw_proc_sockaddr_init(host, proc, srv->errh)) goto error;
+ gw_proc_set_state(host, proc, PROC_STATE_RUNNING);
}
const buffer * const h = host->host ? host->host : host->unixsocket;