* cygheap.h (mini_cygheap): New struct.
(init_cygheap): Inherit locale field via mini_cygheap. * cygheap.cc (cygheap_at_start): Define new variable. (cygheap): Initialize as cygheap_at_start so that locale information is always available. (cygheap_init): Initialize cygheap iff it is set to cygheap_at_start. * shared_info.h (memory_init): Accommodate argument change. * memory.cc (memory_init): Accept an argument indicating whether cygheap should be initialized or not. * dcrt0.cc (child_info_fork::handle_fork): Pass false to memory_init(). (child_info_spawn::handle_spawn): Ditto. (dll_crt0_0): Pass true to memory_init when not forking or execing. * cygheap.h (cygheap_types::HEAP_2_DLL): New enum. * dll_init.h (dll): Remove unused namelen field. (dll_list::load_after_fork): Accommodate change in arguments. * dll_init.cc (dll_list::alloc): Allocate dll information in the cygwin heap. (dll_list::detach): Free dll information from the cygwin heap. (dll_list::load_after_fork): Use dll information in the cygwin heap directly rather than querying parent. * fork.cc (frok::first_dll): Delete. (frok::child): Don't report on first_dll. Don't pass it to load_on_fork. (frok::parent): Don't set first_dll. (fork): Ditto.
This commit is contained in:
@@ -34,7 +34,6 @@ details. */
|
||||
|
||||
class frok
|
||||
{
|
||||
dll *first_dll;
|
||||
bool load_dlls;
|
||||
child_info_fork ch;
|
||||
const char *error;
|
||||
@@ -174,8 +173,7 @@ frok::child (volatile char * volatile here)
|
||||
myself->pid, myself->ppid, __builtin_frame_address (0));
|
||||
|
||||
sync_with_parent ("after longjmp", true);
|
||||
sigproc_printf ("hParent %p, child 1 first_dll %p, load_dlls %d", hParent,
|
||||
first_dll, load_dlls);
|
||||
sigproc_printf ("hParent %p, load_dlls %d", hParent, load_dlls);
|
||||
|
||||
/* If we've played with the stack, stacksize != 0. That means that
|
||||
fork() was invoked from other than the main thread. Make sure that
|
||||
@@ -230,7 +228,7 @@ frok::child (volatile char * volatile here)
|
||||
}
|
||||
else
|
||||
{
|
||||
dlls.load_after_fork (hParent, first_dll);
|
||||
dlls.load_after_fork (hParent);
|
||||
cygheap->fdtab.fixup_after_fork (hParent);
|
||||
sync_with_parent ("loaded dlls", true);
|
||||
}
|
||||
@@ -304,14 +302,13 @@ frok::parent (volatile char * volatile stack_here)
|
||||
else
|
||||
c_flags |= DETACHED_PROCESS;
|
||||
|
||||
/* Remember the address of the first loaded dll and decide
|
||||
if we need to load dlls. We do this here so that this
|
||||
information will be available in the parent and, when
|
||||
the stack is copied, in the child. */
|
||||
first_dll = dlls.start.next;
|
||||
/* Remember if we need to load dynamically linked dlls.
|
||||
We do this here so that this information will be available
|
||||
in the parent and, when the stack is copied, in the child. */
|
||||
load_dlls = dlls.reload_on_fork && dlls.loaded_dlls;
|
||||
|
||||
/* This will help some of the confusion. */
|
||||
/* FIXME: Is this really appropriate? What if stdout is closed? */
|
||||
fflush (stdout);
|
||||
|
||||
forker_finished = CreateEvent (&sec_all, FALSE, FALSE, NULL);
|
||||
@@ -570,7 +567,6 @@ fork ()
|
||||
frok grouped;
|
||||
|
||||
debug_printf ("entering");
|
||||
grouped.first_dll = NULL;
|
||||
grouped.load_dlls = 0;
|
||||
|
||||
int res;
|
||||
|
Reference in New Issue
Block a user