* dll_init.cc (reserve_upto): Remove.

(release_upto): Ditto.
(dll_list::reserve_space): New function to reserve space needed by DLL_LOAD
dlls early in the fork process.
(dll_list::load_after_fork): Rewrite to use recursion to track reservations it
makes while trying to make dlls land where they belong.
(dll_list::load_after_fork_impl): New function used by load_after_fork.
(dll_list::alloc): Initialize image base field.
* dll_init.h (dll_list::prefered_base): New field.
(dll_list::reserve_space): Declare new function.
(dll_list::load_after_fork): Declare new function.
* fork.cc (frok::child): call dll_list::reserve_space early, so we can retry if
it fails.
This commit is contained in:
Christopher Faylor
2011-05-30 16:09:29 +00:00
parent 7123c8b1fd
commit 6642f7daa3
4 changed files with 148 additions and 113 deletions

View File

@ -196,6 +196,12 @@ frok::child (volatile char * volatile here)
debug_printf ("child is running. pid %d, ppid %d, stack here %p",
myself->pid, myself->ppid, __builtin_frame_address (0));
/* NOTE: Logically this belongs in dll_list::load_after_fork, but by
doing it here, before the first sync_with_parent, we can exploit
the existing retry mechanism in hopes of getting a more favorable
address space layout next time. */
dlls.reserve_space ();
sync_with_parent ("after longjmp", true);
sigproc_printf ("hParent %p, load_dlls %d", hParent, load_dlls);