]> git.saurik.com Git - wxWidgets.git/commitdiff
don't use negative PID hack in GUI neither, add a separate flag to wxEndProcessData...
authorVadim Zeitlin <vadim@wxwidgets.org>
Sat, 22 Mar 2008 15:37:16 +0000 (15:37 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Sat, 22 Mar 2008 15:37:16 +0000 (15:37 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@52701 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/unix/execute.h
src/unix/apptraits.cpp
src/unix/utilsunx.cpp

index f641e2e08fc0f8b56c0bb1fd3f6dc0326668835a..9ef14902c569b4e715b8a19b6b8e5e2aff0fb9b7 100644 (file)
 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
index 97c34373078c9a3da50c2cfbfe744838d3337ae6..a19b8e0e8758007538d014c86a3d591923e23fa6 100644 (file)
@@ -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
index 3616d4ae5acc9edfc375db30581cac19c5a83b0c..086f538d064a7a45fb602d94a423c51210669dcc 100644 (file)
@@ -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;
+    }
 }