refactored common code from XXX_EndProcessDetect in wxGTK[12] and wxMac/wxCocoa into wxHandleProcessTermination itself; also removed code dealing with negative pids as we don't use them any more
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@52696 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -213,46 +213,18 @@ const gchar *wx_pango_version_check (int major, int minor, int micro)
|
||||
extern "C" {
|
||||
static
|
||||
void GTK_EndProcessDetector(gpointer data, gint source,
|
||||
GdkInputCondition WXUNUSED(condition) )
|
||||
GdkInputCondition WXUNUSED(condition))
|
||||
{
|
||||
wxEndProcessData *proc_data = (wxEndProcessData *)data;
|
||||
wxEndProcessData * const
|
||||
proc_data = wx_static_cast(wxEndProcessData *, data);
|
||||
|
||||
// has the process really terminated? unfortunately GDK (or GLib) seem to
|
||||
// generate G_IO_HUP notification even when it simply tries to read from a
|
||||
// closed fd and hasn't terminated at all
|
||||
int pid = (proc_data->pid > 0) ? proc_data->pid : -(proc_data->pid);
|
||||
int status = 0;
|
||||
int rc = waitpid(pid, &status, WNOHANG);
|
||||
// child exited, end waiting
|
||||
close(source);
|
||||
|
||||
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"));
|
||||
}
|
||||
// don't call us again!
|
||||
gdk_input_remove(proc_data->tag);
|
||||
|
||||
// set exit code to -1 if something bad happened
|
||||
proc_data->exitcode = (rc > 0 && WIFEXITED(status))
|
||||
? WEXITSTATUS(status)
|
||||
: -1;
|
||||
|
||||
// child exited, end waiting
|
||||
close(source);
|
||||
|
||||
// don't call us again!
|
||||
gdk_input_remove(proc_data->tag);
|
||||
|
||||
wxHandleProcessTermination(proc_data);
|
||||
wxHandleProcessTermination(proc_data);
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user