Before this fix, startup logs ring was duplicated before the fork(), so master
and worker had both the original startup_logs ring and the duplicated one. In
the worker context we freed the original ring and used a duplicated one. In
the master context we did nothing, but we still create a duplicated copy again
and again during the reload.
So, let's duplicate startup logs ring only in the worker context. Master
continues to use the original ring initialized in init() before its fork().
struct mworker_proc *child;
struct ring *tmp_startup_logs = NULL;
- /* at this point the worker must have his own startup_logs buffer */
- tmp_startup_logs = startup_logs_dup(startup_logs);
worker_pid = fork();
switch (worker_pid) {
case -1:
exit(EXIT_FAILURE);
case 0:
- /* in child */
+ /* in child: at this point the worker must have his own startup_logs buffer */
+ tmp_startup_logs = startup_logs_dup(startup_logs);
+ if (tmp_startup_logs == NULL)
+ exit(EXIT_FAILURE);
+
startup_logs_free(startup_logs);
startup_logs = tmp_startup_logs;
/* This one must not be exported, it's internal! */