* 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

@ -56,6 +56,7 @@ struct dll
dll** deps;
PWCHAR modname;
DWORD image_size;
void* preferred_base;
WCHAR name[1];
void detach ();
int init ();
@ -88,6 +89,8 @@ public:
void detach (void *);
void init ();
void load_after_fork (HANDLE);
void reserve_space ();
void load_after_fork_impl (HANDLE, dll* which, int retries);
dll *find_by_modname (const PWCHAR name);
void populate_all_deps ();
void populate_deps (dll* d);