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