* 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

@@ -925,7 +925,7 @@ proc_waiter (void *arg)
return 0;
}
bool
HANDLE
_pinfo::dup_proc_pipe (HANDLE hProcess)
{
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,
0, FALSE, flags);
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
{
wr_proc_pipe_owner = dwProcessId;
@@ -947,7 +950,7 @@ _pinfo::dup_proc_pipe (HANDLE hProcess)
pid, dwProcessId);
res = true;
}
return res;
return orig_wr_proc_pipe;
}
/* function to set up the process pipe and kick off proc_waiter */