summaryrefslogtreecommitdiffstats
path: root/winsup/cygwin/dcrt0.cc
diff options
context:
space:
mode:
Diffstat (limited to 'winsup/cygwin/dcrt0.cc')
-rw-r--r--winsup/cygwin/dcrt0.cc40
1 files changed, 35 insertions, 5 deletions
diff --git a/winsup/cygwin/dcrt0.cc b/winsup/cygwin/dcrt0.cc
index 8df5e6e4f..fcff2c324 100644
--- a/winsup/cygwin/dcrt0.cc
+++ b/winsup/cygwin/dcrt0.cc
@@ -635,6 +635,35 @@ get_cygwin_startup_info ()
return res;
}
+#define dll_data_start &_data_start__
+#define dll_data_end &_data_end__
+#define dll_bss_start &_bss_start__
+#define dll_bss_end &_bss_end__
+
+void
+handle_fork ()
+{
+ alloc_stack (fork_info);
+ cygheap_fixup_in_child (false);
+ memory_init ();
+ set_myself (NULL);
+ HANDLE hp = fork_info->parent;
+ child_copy (hp, false,
+ "dll data", dll_data_start, dll_data_end,
+ "dll bss", dll_bss_start, dll_bss_end,
+ "user heap", cygheap->user_heap.base, cygheap->user_heap.ptr,
+ NULL);
+ /* step 2 now that the dll has its heap filled in, we can fill in the
+ user's data and bss since user_data is now filled out. */
+ child_copy (hp, false,
+ "data", user_data->data_start, user_data->data_end,
+ "bss", user_data->bss_start, user_data->bss_end,
+ NULL);
+
+ if (fixup_mmaps_after_fork (hp))
+ api_fatal ("recreate_mmaps_after_fork_failed");
+}
+
void __stdcall
dll_crt0_0 ()
{
@@ -675,10 +704,7 @@ dll_crt0_0 ()
switch (child_proc_info->type)
{
case _PROC_FORK:
- alloc_stack (fork_info);
- cygheap_fixup_in_child (false);
- memory_init ();
- set_myself (NULL);
+ handle_fork ();
break;
case _PROC_SPAWN:
case _PROC_EXEC:
@@ -937,7 +963,9 @@ _dll_crt0 ()
system_printf ("internal error: couldn't determine location of thread function on stack. Expect signal problems.");
main_environ = user_data->envptr;
+#if 0
*main_environ = NULL;
+#endif
char padding[CYGTLS_PADSIZE];
@@ -954,7 +982,7 @@ void
dll_crt0 (per_process *uptr)
{
/* Set the local copy of the pointer into the user space. */
- if (uptr && uptr != user_data)
+ if (!user_data->forkee && uptr && uptr != user_data)
{
memcpy (user_data, uptr, per_process_overwrite);
*(user_data->impure_ptr_ptr) = _GLOBAL_REENT;
@@ -989,7 +1017,9 @@ cygwin_dll_init ()
user_data->fmode_ptr = &_fmode;
main_environ = user_data->envptr;
+#if 0
*main_environ = NULL;
+#endif
initialize_main_tls((char *)&_my_tls);
dll_crt0_1 (NULL);
}