diff options
author | Christopher Faylor <me@cgf.cx> | 2009-06-08 07:53:40 +0400 |
---|---|---|
committer | Christopher Faylor <me@cgf.cx> | 2009-06-08 07:53:40 +0400 |
commit | 71f53a2f6254e4f47891cd58ab562220547d01a2 (patch) | |
tree | 871e046c427914f0adc28b6d42e02a8caebc3243 /winsup/cygwin/fork.cc | |
parent | 1866410bb88b2d2733185e2a9aaaf48bd5134dd1 (diff) |
* 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.
Diffstat (limited to 'winsup/cygwin/fork.cc')
-rw-r--r-- | winsup/cygwin/fork.cc | 16 |
1 files changed, 6 insertions, 10 deletions
diff --git a/winsup/cygwin/fork.cc b/winsup/cygwin/fork.cc index 6887448df..3692a7a54 100644 --- a/winsup/cygwin/fork.cc +++ b/winsup/cygwin/fork.cc @@ -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; |