From 9893739d49d7ec301e00fb3ff6ba71272b1ea1a2 Mon Sep 17 00:00:00 2001 From: cgf Date: Sat, 14 Feb 2004 04:38:37 +0000 Subject: [PATCH] * dcrt0.cc (alloc_stack_hard_way): Revert to previous implementation. (alloc_stack): Ditto. * exceptions.cc (ctrl_c_handler): Add debugging output. --- winsup/cygwin/ChangeLog | 6 ++++++ winsup/cygwin/dcrt0.cc | 23 ++++++++++++----------- winsup/cygwin/exceptions.cc | 5 ++++- winsup/cygwin/fork.cc | 1 - winsup/cygwin/gendef | 1 - 5 files changed, 22 insertions(+), 14 deletions(-) diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 20c8c3ebba..5a298bf713 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,5 +1,11 @@ 2004-02-13 Christopher Faylor + * dcrt0.cc (alloc_stack_hard_way): Revert to previous implementation. + (alloc_stack): Ditto. + * exceptions.cc (ctrl_c_handler): Add debugging output. + +2004-02-13 Christopher Faylor + * Makefile.in (clean): Remove sigfe.s. (sigfe.s): Ensure that sigfe.s will be regenerated if it does not exist. * dll_init.cc (dll_dllcrt0): Simplify initializing tests. diff --git a/winsup/cygwin/dcrt0.cc b/winsup/cygwin/dcrt0.cc index b824e3a515..79d84c47d4 100644 --- a/winsup/cygwin/dcrt0.cc +++ b/winsup/cygwin/dcrt0.cc @@ -459,9 +459,8 @@ static MEMORY_BASIC_INFORMATION NO_COPY sm; #define CYGWIN_GUARD ((wincap.has_page_guard ()) ? \ PAGE_EXECUTE_READWRITE|PAGE_GUARD : PAGE_NOACCESS) -// __inline__ void -extern void -alloc_stack_hard_way (child_info_fork *ci) +static void +alloc_stack_hard_way (child_info_fork *ci, volatile char *b) { void *new_stack_pointer; MEMORY_BASIC_INFORMATION m; @@ -496,7 +495,7 @@ alloc_stack_hard_way (child_info_fork *ci) api_fatal ("fork: couldn't get new stack info, %E"); if (!noguard) { - m.BaseAddress = (LPVOID)((DWORD)m.BaseAddress - 1); + m.BaseAddress = (LPVOID) ((DWORD) m.BaseAddress - 1); if (!VirtualAlloc ((LPVOID) m.BaseAddress, 1, MEM_COMMIT, CYGWIN_GUARD)) api_fatal ("fork: couldn't allocate new stack guard page %p, %E", @@ -505,6 +504,7 @@ alloc_stack_hard_way (child_info_fork *ci) if (!VirtualQuery ((LPCVOID) m.BaseAddress, &m, sizeof m)) api_fatal ("fork: couldn't get new stack info, %E"); ci->stacktop = m.BaseAddress; + b[0] = '\0'; } /* extend the stack prior to fork longjmp */ @@ -512,16 +512,18 @@ alloc_stack_hard_way (child_info_fork *ci) static void alloc_stack (child_info_fork *ci) { - if (!VirtualQuery ((LPCVOID) _tlstop, &sm, sizeof sm)) + /* FIXME: adding 16384 seems to avoid a stack copy problem during + fork on Win95, but I don't know exactly why yet. DJ */ + volatile char b[ci->stacksize + 16384]; + + if (!VirtualQuery ((LPCVOID) &b, &sm, sizeof sm)) api_fatal ("fork: couldn't get stack info, %E"); if (sm.AllocationBase == ci->stacktop) - { - ci->stacksize = 0; - return; - } + ci->stacksize = 0; + else + alloc_stack_hard_way (ci, b + sizeof (b) - 1); - alloc_stack_hard_way (ci); return; } @@ -785,7 +787,6 @@ dll_crt0_1 (char *) _tlsbase = (char *) fork_info->stackbottom; _tlstop = (char *) fork_info->stacktop; } - longjmp (fork_info->jmp, fork_info->cygpid); } diff --git a/winsup/cygwin/exceptions.cc b/winsup/cygwin/exceptions.cc index 118223e03e..7bc7c77754 100644 --- a/winsup/cygwin/exceptions.cc +++ b/winsup/cygwin/exceptions.cc @@ -829,7 +829,10 @@ ctrl_c_handler (DWORD type) static bool saw_close; if (!cygwin_finished_initializing) - ExitProcess (STATUS_CONTROL_C_EXIT); + { + debug_printf ("exiting with status %p", STATUS_CONTROL_C_EXIT); + ExitProcess (STATUS_CONTROL_C_EXIT); + } _my_tls.remove (INFINITE); diff --git a/winsup/cygwin/fork.cc b/winsup/cygwin/fork.cc index 01b9dbc231..5b5f66d97c 100644 --- a/winsup/cygwin/fork.cc +++ b/winsup/cygwin/fork.cc @@ -664,7 +664,6 @@ fork () child_info_fork ch; int res = setjmp (ch.jmp); - if (res) res = fork_child (grouped.hParent, grouped.first_dll, grouped.load_dlls); else diff --git a/winsup/cygwin/gendef b/winsup/cygwin/gendef index 22acf87dff..009c27db14 100755 --- a/winsup/cygwin/gendef +++ b/winsup/cygwin/gendef @@ -281,6 +281,5 @@ _longjmp: movl 20(%edi),%edi popfl ret - EOF } -- 2.11.0