aboutsummaryrefslogtreecommitdiff
path: root/winsup/cygwin
diff options
context:
space:
mode:
Diffstat (limited to 'winsup/cygwin')
-rw-r--r--winsup/cygwin/cygheap.cc5
-rw-r--r--winsup/cygwin/dcrt0.cc3
-rw-r--r--winsup/cygwin/exceptions.cc9
-rw-r--r--winsup/cygwin/fork.cc13
-rw-r--r--winsup/cygwin/heap.cc6
-rw-r--r--winsup/cygwin/init.cc1
-rw-r--r--winsup/cygwin/pinfo.cc5
-rw-r--r--winsup/cygwin/sigproc.cc9
-rw-r--r--winsup/cygwin/sigproc.h3
9 files changed, 34 insertions, 20 deletions
diff --git a/winsup/cygwin/cygheap.cc b/winsup/cygwin/cygheap.cc
index 7db84cc..6cbdf6e 100644
--- a/winsup/cygwin/cygheap.cc
+++ b/winsup/cygwin/cygheap.cc
@@ -158,12 +158,7 @@ cygheap_init ()
cygheap_protect.init ("cygheap_protect");
if (!cygheap)
{
-#if 1
cygheap = (init_cygheap *) memset (_cygheap_start, 0, _cygheap_mid - _cygheap_start);
-#else
- cygheap = (init_cygheap *) _cygheap_start;
-#endif
-
cygheap_max = cygheap;
_csbrk (sizeof (*cygheap));
}
diff --git a/winsup/cygwin/dcrt0.cc b/winsup/cygwin/dcrt0.cc
index e88f64a..1783d55 100644
--- a/winsup/cygwin/dcrt0.cc
+++ b/winsup/cygwin/dcrt0.cc
@@ -547,7 +547,7 @@ initial_env ()
len = GetModuleFileName (NULL, buf, CYG_MAX_PATH);
console_printf ("Sleeping %d, pid %u %s\n", ms, GetCurrentProcessId (), buf);
Sleep (ms);
- if (!strace.active)
+ if (!strace.active && !dynamically_loaded)
{
strace.inited = 0;
strace.hello ();
@@ -634,7 +634,6 @@ dll_crt0_0 ()
wincap.init ();
initial_env ();
- init_console_handler (TRUE);
init_global_security ();
if (!DuplicateHandle (GetCurrentProcess (), GetCurrentProcess (),
GetCurrentProcess (), &hMainProc, 0, FALSE,
diff --git a/winsup/cygwin/exceptions.cc b/winsup/cygwin/exceptions.cc
index 852b501..71a8b75 100644
--- a/winsup/cygwin/exceptions.cc
+++ b/winsup/cygwin/exceptions.cc
@@ -123,7 +123,8 @@ void
init_console_handler (BOOL install_handler)
{
BOOL res;
- SetConsoleCtrlHandler (ctrl_c_handler, FALSE);
+ while (SetConsoleCtrlHandler (ctrl_c_handler, FALSE))
+ continue;
if (install_handler)
res = SetConsoleCtrlHandler (ctrl_c_handler, TRUE);
else if (wincap.has_null_console_handler_routine ())
@@ -833,6 +834,7 @@ has_visible_window_station ()
static BOOL WINAPI
ctrl_c_handler (DWORD type)
{
+console_printf ("%u OUCH!\n", GetCurrentProcessId ());
static bool saw_close;
if (!cygwin_finished_initializing)
@@ -845,6 +847,11 @@ ctrl_c_handler (DWORD type)
_my_tls.remove (INFINITE);
+#if 0
+ if (type == CTRL_C_EVENT || type == CTRL_BREAK_EVENT)
+ proc_subproc (PROC_KILLFORKED, 0);
+#endif
+
/* Return FALSE to prevent an "End task" dialog box from appearing
for each Cygwin process window that's open when the computer
is shut down or console window is closed. */
diff --git a/winsup/cygwin/fork.cc b/winsup/cygwin/fork.cc
index 785aabd..f16eabc 100644
--- a/winsup/cygwin/fork.cc
+++ b/winsup/cygwin/fork.cc
@@ -283,8 +283,7 @@ fork_parent (HANDLE&, dll *&first_dll, bool& load_dlls, void *stack_here, child_
pthread::atforkprepare ();
- int c_flags = GetPriorityClass (hMainProc) /*|
- CREATE_NEW_PROCESS_GROUP*/;
+ int c_flags = GetPriorityClass (hMainProc);
STARTUPINFO si = {0, NULL, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL};
/* If we don't have a console, then don't create a console for the
@@ -336,7 +335,7 @@ fork_parent (HANDLE&, dll *&first_dll, bool& load_dlls, void *stack_here, child_
/* Remove impersonation */
cygheap->user.deimpersonate ();
- syscall_printf ("CreateProcess (%s, %s, 0, 0, 1, %x, 0, 0, %p, %p)",
+ syscall_printf ("CreateProcess (%s, %s, 0, 0, 1, %p, 0, 0, %p, %p)",
myself->progname, myself->progname, c_flags, &si, &pi);
bool locked = __malloc_lock ();
rc = CreateProcess (myself->progname, /* image to run */
@@ -418,7 +417,8 @@ fork_parent (HANDLE&, dll *&first_dll, bool& load_dlls, void *stack_here, child_
/* Wait for subproc to initialize itself. */
if (!ch.sync (child->pid, pi.hProcess, FORK_WAIT_TIMEOUT))
{
- system_printf ("child %d died waiting for longjmp before initialization", child_pid);
+ if (NOTSTATE (child, PID_EXITED))
+ system_printf ("child %d died waiting for longjmp before initialization", child_pid);
goto cleanup;
}
@@ -469,7 +469,8 @@ fork_parent (HANDLE&, dll *&first_dll, bool& load_dlls, void *stack_here, child_
goto cleanup;
else if (!ch.sync (child->pid, pi.hProcess, FORK_WAIT_TIMEOUT))
{
- system_printf ("child %d died waiting for dll loading", child_pid);
+ if (NOTSTATE (child, PID_EXITED))
+ system_printf ("child %d died waiting for dll loading", child_pid);
goto cleanup;
}
@@ -506,7 +507,7 @@ fork_parent (HANDLE&, dll *&first_dll, bool& load_dlls, void *stack_here, child_
__malloc_unlock ();
/* Remember to de-allocate the fd table. */
- if (pi.hProcess)
+ if (pi.hProcess && !child.hProcess)
ForceCloseHandle1 (pi.hProcess, childhProc);
if (pi.hThread)
ForceCloseHandle (pi.hThread);
diff --git a/winsup/cygwin/heap.cc b/winsup/cygwin/heap.cc
index 9f86f99..bd1b2e3 100644
--- a/winsup/cygwin/heap.cc
+++ b/winsup/cygwin/heap.cc
@@ -34,9 +34,11 @@ extern "C" size_t getpagesize ();
void
heap_init ()
{
+static int seen = 0;
/* If we're the forkee, we must allocate the heap at exactly the same place
as our parent. If not, we don't care where it ends up. */
+seen++;
page_const = system_info.dwPageSize;
if (!cygheap->user_heap.base)
{
@@ -73,11 +75,11 @@ heap_init ()
MEM_RESERVE, PAGE_READWRITE);
if (p)
break;
- if ((reserve_size -= page_const) <= allocsize)
+ if ((reserve_size -= page_const) < allocsize)
break;
}
if (!p)
- api_fatal ("couldn't allocate cygwin heap, %E, base %p, top %p, "
+ api_fatal ("couldn't allocate heap, %E, base %p, top %p, "
"reserve_size %d, allocsize %d, page_const %d",
cygheap->user_heap.base, cygheap->user_heap.top,
reserve_size, allocsize, page_const);
diff --git a/winsup/cygwin/init.cc b/winsup/cygwin/init.cc
index 491a9d2..cad51cc 100644
--- a/winsup/cygwin/init.cc
+++ b/winsup/cygwin/init.cc
@@ -147,6 +147,7 @@ dll_entry (HANDLE h, DWORD reason, void *static_load)
case DLL_PROCESS_ATTACH:
cygwin_hmodule = (HMODULE) h;
dynamically_loaded = (static_load == NULL);
+ init_console_handler (TRUE);
/* Is the stack at an unusual address? This is, an address which
is in the usual space occupied by the process image, but below
diff --git a/winsup/cygwin/pinfo.cc b/winsup/cygwin/pinfo.cc
index 1a08f57..0e89ca0 100644
--- a/winsup/cygwin/pinfo.cc
+++ b/winsup/cygwin/pinfo.cc
@@ -1196,8 +1196,7 @@ winpids::add (DWORD& nelem, bool winpid, DWORD pid)
pinfolist = (pinfo *) realloc (pinfolist, size_pinfolist (npidlist + 1));
}
- pinfolist[nelem].init (cygpid, PID_NOREDIR | (winpid ? PID_ALLPIDS : 0)
- | pinfo_access, NULL);
+ pinfolist[nelem].init (cygpid, PID_NOREDIR | pinfo_access, NULL);
if (winpid)
goto out;
@@ -1205,7 +1204,7 @@ winpids::add (DWORD& nelem, bool winpid, DWORD pid)
{
if (!pinfo_access)
return;
- pinfolist[nelem].init (cygpid, PID_NOREDIR | (winpid ? PID_ALLPIDS : 0), NULL);
+ pinfolist[nelem].init (cygpid, PID_NOREDIR, NULL);
if (!pinfolist[nelem])
return;
}
diff --git a/winsup/cygwin/sigproc.cc b/winsup/cygwin/sigproc.cc
index 74ffed1..c7752b8 100644
--- a/winsup/cygwin/sigproc.cc
+++ b/winsup/cygwin/sigproc.cc
@@ -346,6 +346,15 @@ proc_subproc (DWORD what, DWORD val)
if (global_sigs[SIGCHLD].sa_handler == (void *) SIG_IGN)
for (int i = 0; i < nprocs; i += remove_proc (i))
continue;
+ break;
+ case PROC_KILLFORKED:
+ for (int i = 0; i < nprocs; i++)
+ if (ISSTATE (procs[i], PID_INITIALIZING))
+ {
+ TerminateProcess (procs[i].hProcess, 1);
+ procs[i]->process_state = PID_EXITED;
+ }
+ break;
}
out:
diff --git a/winsup/cygwin/sigproc.h b/winsup/cygwin/sigproc.h
index 74d8d3b..2112d79 100644
--- a/winsup/cygwin/sigproc.h
+++ b/winsup/cygwin/sigproc.h
@@ -34,7 +34,8 @@ enum procstuff
PROC_DETACHED_CHILD = 2, // set up a detached child
PROC_CLEARWAIT = 3, // clear all waits - signal arrived
PROC_WAIT = 4, // setup for wait() for subproc
- PROC_NOTHING = 5 // nothing, really
+ PROC_KILLFORKED = 5, // kill forked children on CTRL-C.
+ PROC_NOTHING = 6 // nothing, really
};
struct sigpacket