From ab79e06445190ce13c5adccf5124f62f343bb9a6 Mon Sep 17 00:00:00 2001 From: Christopher Faylor Date: Wed, 7 Mar 2012 17:09:37 +0000 Subject: [PATCH] * pinfo.cc (_pinfo::dup_proc_pipe): Reorganize to provide more information for failing condition. (pinfo::wait): Pass name of function to dup_proc_pipe. Eliminate error check for dup_proc_pipe since it never actually returned an error. * pinfo.h (_pinfo::dup_proc_pipe): Add an argument. * spawn.cc (child_info_spawn::worker): Pass name of function to dup_proc_pipe. --- winsup/cygwin/ChangeLog | 10 ++++++++++ winsup/cygwin/pinfo.cc | 30 +++++++++++++++++------------- winsup/cygwin/pinfo.h | 2 +- winsup/cygwin/spawn.cc | 2 +- 4 files changed, 29 insertions(+), 15 deletions(-) diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 392f6f07c..66d389dac 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,13 @@ +2012-03-07 Christopher Faylor + + * pinfo.cc (_pinfo::dup_proc_pipe): Reorganize to provide more + information for failing condition. + (pinfo::wait): Pass name of function to dup_proc_pipe. Eliminate error + check for dup_proc_pipe since it never actually returned an error. + * pinfo.h (_pinfo::dup_proc_pipe): Add an argument. + * spawn.cc (child_info_spawn::worker): Pass name of function to + dup_proc_pipe. + 2012-03-07 Corinna Vinschen * glob.cc (MAXPATHLEN): Reinstantiate with a value of 8192. diff --git a/winsup/cygwin/pinfo.cc b/winsup/cygwin/pinfo.cc index 8a00bd0a6..d7e147ae5 100644 --- a/winsup/cygwin/pinfo.cc +++ b/winsup/cygwin/pinfo.cc @@ -986,7 +986,7 @@ proc_waiter (void *arg) #define warn_printf system_printf #endif HANDLE -_pinfo::dup_proc_pipe (HANDLE hProcess) +_pinfo::dup_proc_pipe (HANDLE hProcess, const char *func) { DWORD flags = DUPLICATE_SAME_ACCESS; HANDLE orig_wr_proc_pipe = wr_proc_pipe; @@ -997,17 +997,25 @@ _pinfo::dup_proc_pipe (HANDLE hProcess) flags |= DUPLICATE_CLOSE_SOURCE; bool res = DuplicateHandle (GetCurrentProcess (), wr_proc_pipe, hProcess, &wr_proc_pipe, 0, FALSE, flags); - if (!res && WaitForSingleObject (hProcess, 0) != WAIT_OBJECT_0) + if (res) { - wr_proc_pipe = orig_wr_proc_pipe; - warn_printf ("something failed for pid %d: res %d, hProcess %p, wr_proc_pipe %p vs. %p, %E", - pid, res, hProcess, wr_proc_pipe, orig_wr_proc_pipe); + wr_proc_pipe_owner = dwProcessId; + sigproc_printf ("(%s) duped wr_proc_pipe %p for pid %d(%u)", func, + wr_proc_pipe, pid, dwProcessId); } else { - wr_proc_pipe_owner = dwProcessId; - sigproc_printf ("duped wr_proc_pipe %p for pid %d(%u)", wr_proc_pipe, - pid, dwProcessId); + DWORD duperr = GetLastError (); + DWORD wfsores = WaitForSingleObject (hProcess, 0); + if (wfsores != WAIT_OBJECT_0) + { + warn_printf ("(%s) process synchronization failed for pid %u/%p, " + "wr_proc_pipe %p vs. %p: DuplicateHandle winerr %d, " + "WFSO returned %u, %E", + func, pid, hProcess, wr_proc_pipe, orig_wr_proc_pipe, duperr, + wfsores); + } + wr_proc_pipe = orig_wr_proc_pipe; } return orig_wr_proc_pipe; } @@ -1030,11 +1038,7 @@ pinfo::wait () return false; } - if (!(*this)->dup_proc_pipe (hProcess)) - { - system_printf ("Couldn't duplicate pipe topid %d(%p), %E", (*this)->pid, hProcess); - return false; - } + (*this)->dup_proc_pipe (hProcess, "pinfo::wait"); } preserve (); /* Preserve the shared memory associated with the pinfo */ diff --git a/winsup/cygwin/pinfo.h b/winsup/cygwin/pinfo.h index 62ddcb79e..551f3f29c 100644 --- a/winsup/cygwin/pinfo.h +++ b/winsup/cygwin/pinfo.h @@ -111,7 +111,7 @@ public: char *cwd (size_t &); char *cmdline (size_t &); bool set_ctty (class fhandler_termios *, int); - HANDLE dup_proc_pipe (HANDLE) __attribute__ ((regparm(2))); + HANDLE dup_proc_pipe (HANDLE, const char *) __attribute__ ((regparm(3))); void sync_proc_pipe (); bool alert_parent (char); int __stdcall kill (siginfo_t&) __attribute__ ((regparm (2))); diff --git a/winsup/cygwin/spawn.cc b/winsup/cygwin/spawn.cc index f052d350b..c2412305a 100644 --- a/winsup/cygwin/spawn.cc +++ b/winsup/cygwin/spawn.cc @@ -785,7 +785,7 @@ loop: myself->sync_proc_pipe (); /* Make sure that we own wr_proc_pipe just in case we've been previously execed. */ - orig_wr_proc_pipe = myself->dup_proc_pipe (pi.hProcess); + orig_wr_proc_pipe = myself->dup_proc_pipe (pi.hProcess, "child_info_spawn::worker"); } pid = myself->pid; if (!iscygwin ())