From: William Lallemand Date: Mon, 1 Apr 2019 09:29:53 +0000 (+0200) Subject: REORG: mworker: move serializing functions to mworker.c X-Git-Tag: v2.0-dev3~353 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=48dfbbdea9e119090b827b3326c82675729dae4c;p=thirdparty%2Fhaproxy.git REORG: mworker: move serializing functions to mworker.c Move the 2 following functions to mworker.c: void mworker_proc_list_to_env() void mworker_env_to_proc_list() --- diff --git a/Makefile b/Makefile index 297d97c206..3bf540c1ec 100644 --- a/Makefile +++ b/Makefile @@ -790,7 +790,8 @@ OBJS = src/proto_http.o src/cfgparse-listen.o src/proto_htx.o src/stream.o \ src/http.o src/hpack-dec.o src/action.o src/proto_udp.o src/http_acl.o \ src/xxhash.o src/hpack-enc.o src/h2.o src/freq_ctr.o src/lru.o \ src/protocol.o src/arg.o src/hpack-huff.o src/hdr_idx.o src/base64.o \ - src/hash.o src/mailers.o src/activity.o src/http_msg.o src/version.o + src/hash.o src/mailers.o src/activity.o src/http_msg.o src/version.o \ + src/mworker.o EBTREE_OBJS = $(EBTREE_DIR)/ebtree.o $(EBTREE_DIR)/eb32sctree.o \ $(EBTREE_DIR)/eb32tree.o $(EBTREE_DIR)/eb64tree.o \ diff --git a/include/proto/mworker.h b/include/proto/mworker.h new file mode 100644 index 0000000000..13e5c273d1 --- /dev/null +++ b/include/proto/mworker.h @@ -0,0 +1,19 @@ +/* + * Master Worker + * + * Copyright HAProxy Technologies 2019 - William Lallemand + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version + * 2 of the License, or (at your option) any later version. + * + */ + +#ifndef PROTO_MWORKER_H_ +#define PROTO_MWORKER_H_ + +void mworker_proc_list_to_env(); +void mworker_env_to_proc_list(); + +#endif /* PROTO_MWORKER_H_ */ diff --git a/src/haproxy.c b/src/haproxy.c index f0cb2baae3..85234720b2 100644 --- a/src/haproxy.c +++ b/src/haproxy.c @@ -108,6 +108,7 @@ #include #include #include +#include #include #include #include @@ -542,71 +543,6 @@ static void mworker_kill(int sig) } } -/* - * serialize the proc list and put it in the environment - */ -static void mworker_proc_list_to_env() -{ - char *msg = NULL; - struct mworker_proc *child; - - list_for_each_entry(child, &proc_list, list) { - if (child->pid > -1) - memprintf(&msg, "%s|type=%c;fd=%d;pid=%d;rpid=%d;reloads=%d;timestamp=%d", msg ? msg : "", child->type, child->ipc_fd[0], child->pid, child->relative_pid, child->reloads, child->timestamp); - } - if (msg) - setenv("HAPROXY_PROCESSES", msg, 1); -} - -/* - * unserialize the proc list from the environment - */ -static void mworker_env_to_proc_list() -{ - char *msg, *token = NULL, *s1; - - msg = getenv("HAPROXY_PROCESSES"); - if (!msg) - return; - - while ((token = strtok_r(msg, "|", &s1))) { - struct mworker_proc *child; - char *subtoken = NULL; - char *s2; - - msg = NULL; - - child = calloc(1, sizeof(*child)); - - while ((subtoken = strtok_r(token, ";", &s2))) { - - token = NULL; - - if (strncmp(subtoken, "type=", 5) == 0) { - child->type = *(subtoken+5); - if (child->type == 'm') /* we are in the master, assign it */ - proc_self = child; - } else if (strncmp(subtoken, "fd=", 3) == 0) { - child->ipc_fd[0] = atoi(subtoken+3); - } else if (strncmp(subtoken, "pid=", 4) == 0) { - child->pid = atoi(subtoken+4); - } else if (strncmp(subtoken, "rpid=", 5) == 0) { - child->relative_pid = atoi(subtoken+5); - } else if (strncmp(subtoken, "reloads=", 8) == 0) { - /* we reloaded this process once more */ - child->reloads = atoi(subtoken+8) + 1; - } else if (strncmp(subtoken, "timestamp=", 10) == 0) { - child->timestamp = atoi(subtoken+10); - } - } - if (child->pid) - LIST_ADDQ(&proc_list, &child->list); - else - free(child); - } - - unsetenv("HAPROXY_PROCESSES"); -} /* * Upon a reload, the master worker needs to close all listeners FDs but the mworker_pipe diff --git a/src/mworker.c b/src/mworker.c new file mode 100644 index 0000000000..2f0f09bf26 --- /dev/null +++ b/src/mworker.c @@ -0,0 +1,88 @@ +/* + * Master Worker + * + * Copyright HAProxy Technologies 2019 - William Lallemand + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version + * 2 of the License, or (at your option) any later version. + * + */ + +#include +#include + +#include + +#include + +#include + + + +/* + * serialize the proc list and put it in the environment + */ +void mworker_proc_list_to_env() +{ + char *msg = NULL; + struct mworker_proc *child; + + list_for_each_entry(child, &proc_list, list) { + if (child->pid > -1) + memprintf(&msg, "%s|type=%c;fd=%d;pid=%d;rpid=%d;reloads=%d;timestamp=%d", msg ? msg : "", child->type, child->ipc_fd[0], child->pid, child->relative_pid, child->reloads, child->timestamp); + } + if (msg) + setenv("HAPROXY_PROCESSES", msg, 1); +} + +/* + * unserialize the proc list from the environment + */ +void mworker_env_to_proc_list() +{ + char *msg, *token = NULL, *s1; + + msg = getenv("HAPROXY_PROCESSES"); + if (!msg) + return; + + while ((token = strtok_r(msg, "|", &s1))) { + struct mworker_proc *child; + char *subtoken = NULL; + char *s2; + + msg = NULL; + + child = calloc(1, sizeof(*child)); + + while ((subtoken = strtok_r(token, ";", &s2))) { + + token = NULL; + + if (strncmp(subtoken, "type=", 5) == 0) { + child->type = *(subtoken+5); + if (child->type == 'm') /* we are in the master, assign it */ + proc_self = child; + } else if (strncmp(subtoken, "fd=", 3) == 0) { + child->ipc_fd[0] = atoi(subtoken+3); + } else if (strncmp(subtoken, "pid=", 4) == 0) { + child->pid = atoi(subtoken+4); + } else if (strncmp(subtoken, "rpid=", 5) == 0) { + child->relative_pid = atoi(subtoken+5); + } else if (strncmp(subtoken, "reloads=", 8) == 0) { + /* we reloaded this process once more */ + child->reloads = atoi(subtoken+8) + 1; + } else if (strncmp(subtoken, "timestamp=", 10) == 0) { + child->timestamp = atoi(subtoken+10); + } + } + if (child->pid) + LIST_ADDQ(&proc_list, &child->list); + else + free(child); + } + + unsetenv("HAPROXY_PROCESSES"); +}