From: Valentine Krasnobaeva Date: Fri, 22 Nov 2024 22:15:39 +0000 (+0100) Subject: REORG: startup: move mworker_run_master and mworker_loop in mworker.c X-Git-Tag: v3.1.0~16 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=0c7b93eb1dab962052943672a120f2dc221b2a44;p=thirdparty%2Fhaproxy.git REORG: startup: move mworker_run_master and mworker_loop in mworker.c mworker_run_master() is called only in master mode. mworker_loop() is static and called only in mworker_run_master(). So let's move these both functions in mworker.c. We also need here to make run_thread_poll_loop() accessible from other units, as it's used in mworker_loop(). --- diff --git a/include/haproxy/global.h b/include/haproxy/global.h index 40ec67af95..dcd724a30a 100644 --- a/include/haproxy/global.h +++ b/include/haproxy/global.h @@ -58,6 +58,7 @@ int main(int argc, char **argv); void deinit(void); __attribute__((noreturn)) void deinit_and_exit(int); void run_poll_loop(void); +void *run_thread_poll_loop(void *data); /* takes the thread config in argument or NULL for any thread */ int tell_old_pids(int sig); int delete_oldpid(int pid); void hap_register_build_opts(const char *str, int must_free); diff --git a/include/haproxy/mworker.h b/include/haproxy/mworker.h index f2c60a333d..29c05d6d0a 100644 --- a/include/haproxy/mworker.h +++ b/include/haproxy/mworker.h @@ -52,5 +52,6 @@ void mworker_cleanup_proc(); void mworker_create_master_cli(void); void mworker_prepare_master(void); +void mworker_run_master(void); #endif /* _HAPROXY_MWORKER_H_ */ diff --git a/src/haproxy.c b/src/haproxy.c index e673158043..37917c0878 100644 --- a/src/haproxy.c +++ b/src/haproxy.c @@ -262,9 +262,6 @@ int master = 0; /* 1 if in master, 0 if in child */ /* per-boot randomness */ unsigned char boot_seed[20]; /* per-boot random seed (160 bits initially) */ -/* takes the thread config in argument or NULL for any thread */ -static void *run_thread_poll_loop(void *data); - /* bitfield of a few warnings to emit just once (WARN_*) */ unsigned int warned = 0; @@ -878,42 +875,6 @@ void mworker_reload(int hardreload) mworker_reexec(hardreload); } -static void mworker_loop() -{ - - /* Busy polling makes no sense in the master :-) */ - global.tune.options &= ~GTUNE_BUSY_POLLING; - - - signal_unregister(SIGTTIN); - signal_unregister(SIGTTOU); - signal_unregister(SIGUSR1); - signal_unregister(SIGHUP); - signal_unregister(SIGQUIT); - - signal_register_fct(SIGTERM, mworker_catch_sigterm, SIGTERM); - signal_register_fct(SIGUSR1, mworker_catch_sigterm, SIGUSR1); - signal_register_fct(SIGTTIN, mworker_broadcast_signal, SIGTTIN); - signal_register_fct(SIGTTOU, mworker_broadcast_signal, SIGTTOU); - signal_register_fct(SIGINT, mworker_catch_sigterm, SIGINT); - signal_register_fct(SIGHUP, mworker_catch_sighup, SIGHUP); - signal_register_fct(SIGUSR2, mworker_catch_sighup, SIGUSR2); - signal_register_fct(SIGCHLD, mworker_catch_sigchld, SIGCHLD); - - mworker_unblock_signals(); - mworker_cleantasks(); - - mworker_catch_sigchld(NULL); /* ensure we clean the children in case - some SIGCHLD were lost */ - - jobs++; /* this is the "master" job, we want to take care of the - signals even if there is no listener so the poll loop don't - leave */ - - fork_poller(); - run_thread_poll_loop(NULL); -} - /* * Exit with an error message upon a master recovery mode failure. */ @@ -1960,37 +1921,6 @@ static void generate_random_cluster_secret() cluster_secret_isset = 1; } -static void mworker_run_master() -{ - struct mworker_proc *child, *it; - - proc_self->failedreloads = 0; /* reset the number of failure */ - mworker_loop(); -#if defined(USE_OPENSSL) && !defined(OPENSSL_NO_DH) - ssl_free_dh(); -#endif - master = 0; - /* close useless master sockets */ - mworker_cli_proxy_stop(); - - /* free proc struct of other processes */ - list_for_each_entry_safe(child, it, &proc_list, list) { - /* close the FD of the master side for all - * workers, we don't need to close the worker - * side of other workers since it's done with - * the bind_proc */ - if (child->ipc_fd[0] >= 0) { - close(child->ipc_fd[0]); - child->ipc_fd[0] = -1; - } - LIST_DELETE(&child->list); - mworker_free_child(child); - child = NULL; - } - /* master must leave */ - exit(0); -} - /* * This function does daemonization fork. It only returns if everything is OK. * If something fails, it exits. @@ -3405,7 +3335,7 @@ void run_poll_loop() _HA_ATOMIC_AND(&th_ctx->flags, ~TH_FL_IN_LOOP); } -static void *run_thread_poll_loop(void *data) +void *run_thread_poll_loop(void *data) { struct per_thread_alloc_fct *ptaf; struct per_thread_init_fct *ptif; diff --git a/src/mworker.c b/src/mworker.c index 8fd0c02a6c..8d7d84b93b 100644 --- a/src/mworker.c +++ b/src/mworker.c @@ -36,6 +36,7 @@ #include #include #include +#include #include #include #include @@ -988,6 +989,73 @@ void mworker_prepare_master(void) LIST_APPEND(&proc_list, &tmproc->list); } +static void mworker_loop() +{ + + /* Busy polling makes no sense in the master :-) */ + global.tune.options &= ~GTUNE_BUSY_POLLING; + + + signal_unregister(SIGTTIN); + signal_unregister(SIGTTOU); + signal_unregister(SIGUSR1); + signal_unregister(SIGHUP); + signal_unregister(SIGQUIT); + + signal_register_fct(SIGTERM, mworker_catch_sigterm, SIGTERM); + signal_register_fct(SIGUSR1, mworker_catch_sigterm, SIGUSR1); + signal_register_fct(SIGTTIN, mworker_broadcast_signal, SIGTTIN); + signal_register_fct(SIGTTOU, mworker_broadcast_signal, SIGTTOU); + signal_register_fct(SIGINT, mworker_catch_sigterm, SIGINT); + signal_register_fct(SIGHUP, mworker_catch_sighup, SIGHUP); + signal_register_fct(SIGUSR2, mworker_catch_sighup, SIGUSR2); + signal_register_fct(SIGCHLD, mworker_catch_sigchld, SIGCHLD); + + mworker_unblock_signals(); + mworker_cleantasks(); + + mworker_catch_sigchld(NULL); /* ensure we clean the children in case + some SIGCHLD were lost */ + + jobs++; /* this is the "master" job, we want to take care of the + signals even if there is no listener so the poll loop don't + leave */ + + fork_poller(); + run_thread_poll_loop(NULL); +} + +void mworker_run_master(void) +{ + struct mworker_proc *child, *it; + + proc_self->failedreloads = 0; /* reset the number of failure */ + mworker_loop(); +#if defined(USE_OPENSSL) && !defined(OPENSSL_NO_DH) + ssl_free_dh(); +#endif + master = 0; + /* close useless master sockets */ + mworker_cli_proxy_stop(); + + /* free proc struct of other processes */ + list_for_each_entry_safe(child, it, &proc_list, list) { + /* close the FD of the master side for all + * workers, we don't need to close the worker + * side of other workers since it's done with + * the bind_proc */ + if (child->ipc_fd[0] >= 0) { + close(child->ipc_fd[0]); + child->ipc_fd[0] = -1; + } + LIST_DELETE(&child->list); + mworker_free_child(child); + child = NULL; + } + /* master must leave */ + exit(0); +} + static struct cfg_kw_list mworker_kws = {{ }, { { CFG_GLOBAL, "mworker-max-reloads", mworker_parse_global_max_reloads, KWF_DISCOVERY }, { 0, NULL, NULL },