summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristopher Faylor <me@cgf.cx>2012-03-07 17:09:37 +0000
committerChristopher Faylor <me@cgf.cx>2012-03-07 17:09:37 +0000
commitab79e06445190ce13c5adccf5124f62f343bb9a6 (patch)
tree353e471163e52f0c3151e0489f8f3350663d660e
parent1d928241e113b4e0b8ea939ad6656aa01e71c829 (diff)
downloadcygnal-ab79e06445190ce13c5adccf5124f62f343bb9a6.tar.gz
cygnal-ab79e06445190ce13c5adccf5124f62f343bb9a6.tar.bz2
cygnal-ab79e06445190ce13c5adccf5124f62f343bb9a6.zip
* 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.
-rw-r--r--winsup/cygwin/ChangeLog10
-rw-r--r--winsup/cygwin/pinfo.cc30
-rw-r--r--winsup/cygwin/pinfo.h2
-rw-r--r--winsup/cygwin/spawn.cc2
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 <me.cygwin2012@cgf.cx>
+
+ * 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 <corinna@vinschen.de>
* 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 ())