fork: Don't copy _main_tls->local_clib from *_impure_ptr

So far we copy *_impure_ptr into _main_tls->local_clib if the child
process has been forked from a pthread.  But that's not required.
The local_clib area of the new thread is on the stack and the stack
gets copied from the parent anyway (in frok::parent).  So we only
have to make sure _main_tls is pointing to the right address and
do the simple post-fork thread init.

Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
This commit is contained in:
Corinna Vinschen 2017-03-10 20:44:53 +01:00
parent 35d344babe
commit 48755fb9bc

View File

@ -143,15 +143,11 @@ frok::child (volatile char * volatile here)
myself->pid, myself->ppid, __builtin_frame_address (0)); myself->pid, myself->ppid, __builtin_frame_address (0));
sigproc_printf ("hParent %p, load_dlls %d", hParent, load_dlls); sigproc_printf ("hParent %p, load_dlls %d", hParent, load_dlls);
/* If we've played with the stack, stacksize != 0. That means that /* Make sure threadinfo information is properly set up. */
fork() was invoked from other than the main thread. Make sure that if (&_my_tls != _main_tls)
the threadinfo information is properly set up. */
if (!fork_info->from_main)
{ {
_main_tls = &_my_tls; _main_tls = &_my_tls;
_main_tls->init_thread (NULL, NULL); _main_tls->init_thread (NULL, NULL);
_main_tls->local_clib = *_impure_ptr;
_impure_ptr = &_main_tls->local_clib;
} }
set_cygwin_privileges (hProcToken); set_cygwin_privileges (hProcToken);
@ -300,7 +296,6 @@ frok::parent (volatile char * volatile stack_here)
ch.forker_finished = forker_finished; ch.forker_finished = forker_finished;
ch.from_main = &_my_tls == _main_tls;
ch.stackbase = NtCurrentTeb ()->Tib.StackBase; ch.stackbase = NtCurrentTeb ()->Tib.StackBase;
ch.stackaddr = NtCurrentTeb ()->DeallocationStack; ch.stackaddr = NtCurrentTeb ()->DeallocationStack;
if (!ch.stackaddr) if (!ch.stackaddr)