Break out the portion of run() that forks processes into create_processes() and move the remainder of run() back into main().
This increases readability by 1) reducing the indentation of almost all of the code in create_processes() 2) Removing the arbitrary split between run() and main(). It was originally envisaged that run() would be the inner-loop of main(), but the split never worked that way. --- src/haproxy.c | 214 ++++++++++++++++++++++++++++----------------------------- 1 files changed, 105 insertions(+), 109 deletions(-) diff --git a/src/haproxy.c b/src/haproxy.c index caa2a29..35ee06e 100644 --- a/src/haproxy.c +++ b/src/haproxy.c @@ -1325,134 +1325,114 @@ static FILE *prepare(int argc, char **argv) return pidfile; } -static void run(int argc, char **argv, FILE *pidfile) +static void create_processes(int argc, char **argv, FILE *pidfile) { + struct proxy *px; + int ret = 0; + int proc; - if (global.mode & (MODE_DAEMON|MODE_MASTER_WORKER)) { - struct proxy *px; - int ret = 0; - int proc; - - /* Create master if it doesn't already exist, - * is needed and is to be detached - */ - if (!is_master && global.mode & MODE_MASTER_WORKER) { - if (global.mode & MODE_DAEMON) { - ret = fork(); - if (ret < 0) { - Alert("[%s.run()] Cannot fork.\n", - argv[0]); - protocol_unbind_all(); - exit(1); /* there has been an error */ - } - if (ret > 0) - exit(0); /* Exit original process */ - - /* Child */ - setsid(); - close_log(); - pid = getpid(); - } - if (!(global.mode & MODE_QUIET)) - send_log(NULL, LOG_INFO, "Master started\n"); - } - - rewind(pidfile); - ftruncate(fileno(pidfile), 0); - if (global.mode & MODE_MASTER_WORKER) { - fprintf(pidfile, "%d\n", pid); - fflush(pidfile); - } - - /* Store PIDs of worker processes in oldpid so - * they can be signaled later */ - nb_oldpids = global.nbproc; - free(oldpids); - oldpids = malloc(nb_oldpids * sizeof(*oldpids)); - if (!oldpids) { - send_log(NULL, LOG_ERR, "Cannot allocate memory " - "for oldpids.\n"); - protocol_unbind_all(); - exit(1); /* there has been an error */ - } + if (!(global.mode & (MODE_DAEMON|MODE_MASTER_WORKER))) + return; - /* the father launches the required number of processes */ - for (proc = 0; proc < global.nbproc; proc++) { + /* Create master if it doesn't already exist, + * is needed and is to be detached + */ + if (!is_master && global.mode & MODE_MASTER_WORKER) { + if (global.mode & MODE_DAEMON) { ret = fork(); if (ret < 0) { - send_log(NULL, LOG_ERR, "Cannot fork.\n"); + Alert("[%s.run()] Cannot fork.\n", + argv[0]); protocol_unbind_all(); exit(1); /* there has been an error */ } - else if (ret == 0) { /* child breaks here */ - if (!(global.mode & MODE_MASTER_WORKER)) - setsid(); - is_master = 0; - close_log(); - pid = getpid(); - if (!(global.mode & MODE_QUIET)) - send_log(NULL, LOG_INFO, - "Worker #%d started\n", proc); - break; - } - fprintf(pidfile, "%d\n", ret); - fflush(pidfile); - oldpids[proc] = ret; - relative_pid++; /* each child will get a different one */ + if (ret > 0) + exit(0); /* Exit original process */ + + /* Child */ + setsid(); + close_log(); + pid = getpid(); } - /* close the pidfile both in children and father */ - if (pidfile != NULL) - fclose(pidfile); + if (!(global.mode & MODE_QUIET)) + send_log(NULL, LOG_INFO, "Master started\n"); + } - /* We won't ever use this anymore */ - free(oldpids); oldpids = NULL; + rewind(pidfile); + ftruncate(fileno(pidfile), 0); + if (global.mode & MODE_MASTER_WORKER) { + fprintf(pidfile, "%d\n", pid); + fflush(pidfile); + } - if (proc == global.nbproc) { - if (!(global.mode & MODE_MASTER_WORKER)) - /* The parent process is no longer needed */ - exit(0); - else - is_master = 1; - } + /* Store PIDs of worker processes in oldpid so + * they can be signaled later */ + nb_oldpids = global.nbproc; + free(oldpids); + oldpids = malloc(nb_oldpids * sizeof(*oldpids)); + if (!oldpids) { + send_log(NULL, LOG_ERR, "Cannot allocate memory " + "for oldpids.\n"); + protocol_unbind_all(); + exit(1); /* there has been an error */ + } - /* we might have to unbind some proxies from some processes */ - px = proxy; - while (px != NULL) { - if (px->bind_proc && px->state != PR_STSTOPPED) { - if (px->bind_proc & (1 << proc)) - stop_proxy(px); - } - px = px->next; + /* the father launches the required number of processes */ + for (proc = 0; proc < global.nbproc; proc++) { + ret = fork(); + if (ret < 0) { + send_log(NULL, LOG_ERR, "Cannot fork.\n"); + protocol_unbind_all(); + exit(1); /* there has been an error */ } - - /* if we're NOT in QUIET mode, we should now close the 3 first FDs to ensure - * that we can detach from the TTY. We MUST NOT do it in other cases since - * it would have already be done, and 0-2 would have been affected to listening - * sockets - */ - if (!(global.mode & MODE_QUIET) || (global.mode & MODE_VERBOSE)) { - /* detach from the tty */ - fclose(stdin); fclose(stdout); fclose(stderr); - global.mode &= ~MODE_VERBOSE; - global.mode |= MODE_QUIET; /* ensure that we won't say anything from now */ + else if (ret == 0) { /* child breaks here */ + if (!(global.mode & MODE_MASTER_WORKER)) + setsid(); + is_master = 0; + close_log(); + pid = getpid(); + if (!(global.mode & MODE_QUIET)) + send_log(NULL, LOG_INFO, + "Worker #%d started\n", proc); + break; } + fprintf(pidfile, "%d\n", ret); + fflush(pidfile); + oldpids[proc] = ret; + relative_pid++; /* each child will get a different one */ + } - fork_poller(); + if (proc == global.nbproc) { + if (!(global.mode & MODE_MASTER_WORKER)) + /* The parent process is no longer needed */ + exit(0); + else + is_master = 1; } - if (!is_master) - drop_capabilities(); + /* we might have to unbind some proxies from some processes */ + px = proxy; + while (px != NULL) { + if (px->bind_proc && px->state != PR_STSTOPPED) { + if (px->bind_proc & (1 << proc)) + stop_proxy(px); + } + px = px->next; + } - protocol_enable_all(); - /* - * That's it : the central polling loop. Run until we stop. + /* if we're NOT in QUIET mode, we should now close the 3 first FDs to ensure + * that we can detach from the TTY. We MUST NOT do it in other cases since + * it would have already be done, and 0-2 would have been affected to listening + * sockets */ - run_poll_loop(); + if (!(global.mode & MODE_QUIET) || (global.mode & MODE_VERBOSE)) { + /* detach from the tty */ + fclose(stdin); fclose(stdout); fclose(stderr); + global.mode &= ~MODE_VERBOSE; + global.mode |= MODE_QUIET; /* ensure that we won't say anything from now */ + } - /* Free all Hash Keys and all Hash elements */ - appsession_cleanup(); - /* Do some cleanup */ - deinit(); + fork_poller(); } int main(int argc, char **argv) @@ -1464,7 +1444,23 @@ int main(int argc, char **argv) if (!is_master) pidfile = newpidfile; - run(argc, argv, pidfile); + create_processes(argc, argv, pidfile); + + if (!is_master) + drop_capabilities(); + + protocol_enable_all(); + + /* + * That's it : the central polling loop. Run until we stop. + */ + run_poll_loop(); + + /* Free all Hash Keys and all Hash elements */ + appsession_cleanup(); + /* Do some cleanup */ + deinit(); + if (!restarting) break; } -- 1.7.2.3