* dcrt0.cc (dll_crt0_0): Call SetErrorMode earlier.

* pinfo.cc (_pinfo::dup_proc_pipe): Reset wr_proc_pipe on failure.  Return
previous pipe handle.
* pinfo.h (_pinfo::dup_proc_pipe): Reflect change to return value.
* spawn.cc (spawn_guts): Restore previous proc pipe on retry or if process
exits before synchronization.
This commit is contained in:
Christopher Faylor 2006-03-21 01:37:25 +00:00
parent 3078fb4f36
commit d4d63ebf22
5 changed files with 28 additions and 9 deletions

View File

@ -1,3 +1,12 @@
2006-03-20 Christopher Faylor <cgf@timesys.com>
* dcrt0.cc (dll_crt0_0): Call SetErrorMode earlier.
* pinfo.cc (_pinfo::dup_proc_pipe): Reset wr_proc_pipe on failure.
Return previous pipe handle.
* pinfo.h (_pinfo::dup_proc_pipe): Reflect change to return value.
* spawn.cc (spawn_guts): Restore previous proc pipe on retry or if
process exits before synchronization.
2006-03-20 Christopher Faylor <cgf@timesys.com> 2006-03-20 Christopher Faylor <cgf@timesys.com>
* child_info.h (child_status): New enum. * child_info.h (child_status): New enum.

View File

@ -702,6 +702,8 @@ dll_crt0_0 ()
init_global_security (); init_global_security ();
initial_env (); initial_env ();
SetErrorMode (SEM_FAILCRITICALERRORS);
/* Initialize signal processing here, early, in the hopes that the creation /* Initialize signal processing here, early, in the hopes that the creation
of a thread early in the process will cause more predictability in memory of a thread early in the process will cause more predictability in memory
layout for the main thread. */ layout for the main thread. */
@ -727,7 +729,6 @@ dll_crt0_0 ()
if (wincap.has_security ()) if (wincap.has_security ())
OpenProcessToken (hMainProc, MAXIMUM_ALLOWED, &hProcToken); OpenProcessToken (hMainProc, MAXIMUM_ALLOWED, &hProcToken);
SetErrorMode (SEM_FAILCRITICALERRORS);
device::init (); device::init ();
do_global_ctors (&__CTOR_LIST__, 1); do_global_ctors (&__CTOR_LIST__, 1);
cygthread::init (); cygthread::init ();

View File

@ -925,7 +925,7 @@ proc_waiter (void *arg)
return 0; return 0;
} }
bool HANDLE
_pinfo::dup_proc_pipe (HANDLE hProcess) _pinfo::dup_proc_pipe (HANDLE hProcess)
{ {
DWORD flags = DUPLICATE_SAME_ACCESS; DWORD flags = DUPLICATE_SAME_ACCESS;
@ -938,8 +938,11 @@ _pinfo::dup_proc_pipe (HANDLE hProcess)
bool res = DuplicateHandle (hMainProc, wr_proc_pipe, hProcess, &wr_proc_pipe, bool res = DuplicateHandle (hMainProc, wr_proc_pipe, hProcess, &wr_proc_pipe,
0, FALSE, flags); 0, FALSE, flags);
if (!res && WaitForSingleObject (hProcess, 0) != WAIT_OBJECT_0) if (!res && WaitForSingleObject (hProcess, 0) != WAIT_OBJECT_0)
system_printf ("DuplicateHandle failed, pid %d, hProcess %p, wr_proc_pipe %p, %E", {
pid, hProcess, orig_wr_proc_pipe); wr_proc_pipe = orig_wr_proc_pipe;
system_printf ("DuplicateHandle failed, pid %d, hProcess %p, wr_proc_pipe %p, %E",
pid, hProcess, wr_proc_pipe);
}
else else
{ {
wr_proc_pipe_owner = dwProcessId; wr_proc_pipe_owner = dwProcessId;
@ -947,7 +950,7 @@ _pinfo::dup_proc_pipe (HANDLE hProcess)
pid, dwProcessId); pid, dwProcessId);
res = true; res = true;
} }
return res; return orig_wr_proc_pipe;
} }
/* function to set up the process pipe and kick off proc_waiter */ /* function to set up the process pipe and kick off proc_waiter */

View File

@ -116,7 +116,7 @@ public:
char *cwd (size_t &); char *cwd (size_t &);
char *cmdline (size_t &); char *cmdline (size_t &);
void set_ctty (class tty_min *, int, class fhandler_tty_slave *); void set_ctty (class tty_min *, int, class fhandler_tty_slave *);
bool dup_proc_pipe (HANDLE) __attribute__ ((regparm(2))); HANDLE dup_proc_pipe (HANDLE) __attribute__ ((regparm(2)));
void sync_proc_pipe (); void sync_proc_pipe ();
bool alert_parent (char); bool alert_parent (char);
int __stdcall kill (siginfo_t&) __attribute__ ((regparm (2))); int __stdcall kill (siginfo_t&) __attribute__ ((regparm (2)));

View File

@ -445,6 +445,7 @@ spawn_guts (const char * prog_arg, const char *const *argv,
bool null_app_name = false; bool null_app_name = false;
STARTUPINFO si = {0, NULL, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL}; STARTUPINFO si = {0, NULL, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL};
int looped = 0; int looped = 0;
HANDLE orig_wr_proc_pipe = NULL;
myfault efault; myfault efault;
if (efault.faulted ()) if (efault.faulted ())
@ -795,11 +796,11 @@ loop:
if (!looped) if (!looped)
{ {
myself->sync_proc_pipe (); /* Make sure that we own wr_proc_pipe myself->sync_proc_pipe (); /* Make sure that we own wr_proc_pipe
just in case we've been previously just in case we've been previously
execed. */ execed. */
myself.zap_cwd (); myself.zap_cwd ();
} }
myself->dup_proc_pipe (pi.hProcess); orig_wr_proc_pipe = myself->dup_proc_pipe (pi.hProcess);
} }
pid = myself->pid; pid = myself->pid;
} }
@ -858,6 +859,11 @@ loop:
myself.hProcess = pi.hProcess; myself.hProcess = pi.hProcess;
if (!synced) if (!synced)
{ {
if (orig_wr_proc_pipe)
{
myself->wr_proc_pipe_owner = GetCurrentProcessId ();
myself->wr_proc_pipe = orig_wr_proc_pipe;
}
if (ch.proc_retry (pi.hProcess) == 0) if (ch.proc_retry (pi.hProcess) == 0)
{ {
looped++; looped++;