]> git.saurik.com Git - wxWidgets.git/commitdiff
updated wxExecute checks in wxGTK to be same as in other Unix ports after recent...
authorVáclav Slavík <vslavik@fastmail.fm>
Mon, 21 Jan 2008 14:51:49 +0000 (14:51 +0000)
committerVáclav Slavík <vslavik@fastmail.fm>
Mon, 21 Jan 2008 14:51:49 +0000 (14:51 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@51310 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

src/gtk/utilsgtk.cpp

index dde2a7bff9203cf2b12e5fbf29fbdc5465f8e3dd..a87e1c321efa2866f2eb2c2d4d8312daa4260de5 100644 (file)
@@ -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);