Checkout
Yann Ylavic
committed
on 13 Jul 18
event, worker: runtime pool.

MPMs event and worker both need a dedicated pool to handle the creation of
the threads (listener, workers) and… Show more
event, worker: runtime pool.

MPMs event and worker both need a dedicated pool to handle the creation of

the threads (listener, workers) and synchronization objects (queues, pollset,

mutexes...) in the start_threads() thread, with at least the lifetime of

the connections they handle, and thus survive pchild destruction (notably

in ONE_PROCCESS mode, but SIG_UNGRACEFUL is concerned too).

For instance, without this fix, the below backtrace can happen in ONE_PROCCESS

mode and a signal/^C is received (with active connections):

Thread 1 "httpd" received signal SIGSEGV, Segmentation fault.

(gdb) bt

#0  <BOOM>

#1  0x00007ffff7c7e016 in apr_file_write (thefile=0x0, ...)

                                         ^ NULL (cleared)

                      at file_io/unix/readwrite.c:230

#2  0x00007ffff7c7e4a7 in apr_file_putc (ch=1 '\001', thefile=0x0)

                                                     ^ NULL (cleared)

                      at file_io/unix/readwrite.c:377

#3  0x00007ffff7c8da4a in apr_pollset_wakeup (pollset=0x55555568b870)

                                             ^ already destroyed by pchild

                      at poll/unix/pollset.c:224

#4  0x00007ffff7fc16c7 in decrement_connection_count (cs_=0x7fff08000ea0)

                      at event.c:811

#5  0x00007ffff7c83e15 in run_cleanups (cref=0x7fffe4002b78)

                      at memory/unix/apr_pools.c:2672

#6  0x00007ffff7c82c2f in apr_pool_destroy (pool=0x7fffe4002b58)

                                           ^ master_conn

                      at memory/unix/apr_pools.c:1007

#7  0x00007ffff7c82c12 in apr_pool_destroy (pool=0x7fff08000c28)

                                           ^ ptrans

                      at memory/unix/apr_pools.c:1004

#8  0x00007ffff7c82c12 in apr_pool_destroy (pool=0x555555638698)

                                           ^ pconf

                      at memory/unix/apr_pools.c:1004

#9  0x00007ffff7c82c12 in apr_pool_destroy (pool=0x555555636688)

                                           ^ pglobal

                      at memory/unix/apr_pools.c:1004

#10 0x00005555555f4709 in ap_terminate ()

                      at unixd.c:522

#11 0x00007ffff6dbc8f1 in __run_exit_handlers (...)

                      at exit.c:108

#12 0x00007ffff6dbc9ea in __GI_exit (status=<optimized out>)

                      at exit.c:139

#13 0x00007ffff7fc1616 in clean_child_exit (code=0)

                      at event.c:774

                                 ^ pchild already destroyed here

#14 0x00007ffff7fc5ae4 in child_main (child_num_arg=0, child_bucket=0)

                      at event.c:2869

...

While at it, add comments about the lifetimes of MPMs pools and their objects,

and give each pool a tag (e.g. "pchild" accordingly to other MPMs).

(follow up for event_pollset in r1835846).

Show less