From 56465170cc4b3ba3a12d70ab51f0256cc1d02525 Mon Sep 17 00:00:00 2001 From: =?utf8?q?V=C3=A1clav=20Slav=C3=ADk?= Date: Mon, 21 Jan 2008 14:51:49 +0000 Subject: [PATCH] updated wxExecute checks in wxGTK to be same as in other Unix ports after recent changes git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@51310 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- src/gtk/utilsgtk.cpp | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/src/gtk/utilsgtk.cpp b/src/gtk/utilsgtk.cpp index dde2a7bff9..a87e1c321e 100644 --- a/src/gtk/utilsgtk.cpp +++ b/src/gtk/utilsgtk.cpp @@ -224,15 +224,27 @@ void GTK_EndProcessDetector(gpointer data, gint source, int status = 0; int rc = waitpid(pid, &status, WNOHANG); - if ( rc == 0 ) - { - // no, it didn't exit yet, continue waiting - return; - } + if ( rc == 0 ) + { + // This can only happen if the child application closes our dummy + // pipe that is used to monitor its lifetime; in that case, our + // best bet is to pretend the process did terminate, because + // otherwise wxExecute() would hang indefinitely + // (OnExceptionWaiting() won't be called again, the descriptor + // is closed now). + wxLogDebug("Child process (PID %i) still alive, even though notification was received that it terminated.", pid); + } + else if ( rc == -1 ) + { + // As above, if waitpid() fails, the best we can do is to log the + // error and pretend the child terminated: + wxLogSysError(_("Failed to check child process' status")); + } // set exit code to -1 if something bad happened - proc_data->exitcode = rc != -1 && WIFEXITED(status) ? WEXITSTATUS(status) - : -1; + proc_data->exitcode = (rc > 0 && WIFEXITED(status)) + ? WEXITSTATUS(status) + : -1; // child exited, end waiting close(source); -- 2.47.2