From: Vadim Zeitlin Date: Sat, 22 Mar 2008 15:37:16 +0000 (+0000) Subject: don't use negative PID hack in GUI neither, add a separate flag to wxEndProcessData... X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/e528a71bf167f68b19a5cac0f1f63180d7509987 don't use negative PID hack in GUI neither, add a separate flag to wxEndProcessData for this git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@52701 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/include/wx/unix/execute.h b/include/wx/unix/execute.h index f641e2e08f..9ef14902c5 100644 --- a/include/wx/unix/execute.h +++ b/include/wx/unix/execute.h @@ -15,15 +15,22 @@ class WXDLLIMPEXP_FWD_BASE wxProcess; class wxStreamTempInputBuffer; -// if pid > 0, the execution is async and the data is freed in the callback -// executed when the process terminates, if pid < 0, the execution is -// synchronous and the caller (wxExecute) frees the data struct wxEndProcessData { + wxEndProcessData() + { + pid = + tag = + exitcode = -1; + process = NULL; + async = false; + } + int pid; // pid of the process int tag; // port dependent value wxProcess *process; // if !NULL: notified on process termination - int exitcode; // the exit code + int exitcode; // the exit code + bool async; // if true, delete us on process termination }; // struct in which information is passed from wxExecute() to wxAppTraits diff --git a/src/unix/apptraits.cpp b/src/unix/apptraits.cpp index 97c3437307..a19b8e0e87 100644 --- a/src/unix/apptraits.cpp +++ b/src/unix/apptraits.cpp @@ -47,19 +47,13 @@ int wxGUIAppTraits::WaitForChild(wxExecuteData& execData) // to process the GUI events while waiting for the child termination wxEndProcessData endProcData; - - // we may have process for capturing the program output, but it's - // not used in wxEndProcessData in the case of sync execution - endProcData.process = NULL; - - // sync execution: indicate it by negating the pid - endProcData.pid = -execData.pid; - + endProcData.pid = execData.pid; endProcData.tag = AddProcessCallback ( &endProcData, execData.GetEndProcReadFD() ); + endProcData.async = false; // prepare to wait for the child termination: show to the user that we're diff --git a/src/unix/utilsunx.cpp b/src/unix/utilsunx.cpp index 3616d4ae5a..086f538d06 100644 --- a/src/unix/utilsunx.cpp +++ b/src/unix/utilsunx.cpp @@ -1412,18 +1412,24 @@ int wxAppTraits::WaitForChild(wxExecuteData& execData) { if ( !(execData.flags & wxEXEC_SYNC) ) { - // asynchronous execution: just launch the process and return + // asynchronous execution: just launch the process and return, + // endProcData will be destroyed when it terminates (currently we leak + // it if the process doesn't terminate before we do and this should be + // fixed but it's not a real leak so it's not really very high + // priority) wxEndProcessData *endProcData = new wxEndProcessData; - endProcData->process = execData.process; - endProcData->pid = execData.pid; + endProcData->process = execData.process; + endProcData->pid = execData.pid; endProcData->tag = AddProcessCallback ( endProcData, execData.GetEndProcReadFD() ); + endProcData->async = true; return execData.pid; } + //else: synchronous execution case #if wxUSE_STREAMS wxProcess * const process = execData.process; @@ -1464,9 +1470,16 @@ void wxHandleProcessTermination(wxEndProcessData *data) data->process->OnTerminate(data->pid, data->exitcode); } - // this function is only called for asynchronously executing children, now - // that we have received the notification about their termination there is - // no need to keep it around any longer - delete data; + if ( data->async ) + { + // in case of asynchronous execution we don't need this data any more + // after the child terminates + delete data; + } + else // sync execution + { + // let wxExecute() know that the process has terminated + data->pid = 0; + } }