* 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:
@ -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);
|
||||
|
||||
|
Reference in New Issue
Block a user