]> git.saurik.com Git - wxWidgets.git/commitdiff
add support for asynchronous execution in wxBase (patch 1906889)
authorVadim Zeitlin <vadim@wxwidgets.org>
Sat, 15 Mar 2008 16:46:38 +0000 (16:46 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Sat, 15 Mar 2008 16:46:38 +0000 (16:46 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@52550 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

docs/changes.txt
include/wx/unix/apptbase.h
include/wx/unix/apptrait.h
include/wx/unix/execute.h
src/unix/baseunix.cpp
src/unix/utilsunx.cpp

index 75c85fa13617824eac908f39aae48847a1c947c8..3020e542fa0c0331ceb6c2843a426128fee3eff9 100644 (file)
@@ -193,6 +193,7 @@ Major new features in this release
 All:
 
 - Added (experimental) IPv6 support to wxSocket (Arcen)
+- Add support for wxExecute(wxEXEC_ASYNC) in wxBase (Lukasz Michalski)
 - Added wxXLocale class and xlocale-like functions using it
 - Allow loading message catalogs from wxFileSystem (Axel Gembe)
 - Added wxMessageQueue class for inter-thread communications
index 50f30040f8e3cd594cdac5e1a6ef6ce261751384..afb666364345ebbbee42b48ef51ae68a36dec86f 100644 (file)
@@ -30,14 +30,14 @@ public:
     // wxBase
     //
     // if it returns false, we should return from wxExecute() with an error
-    virtual bool CreateEndProcessPipe(wxExecuteData& execData) = 0;
+    virtual bool CreateEndProcessPipe(wxExecuteData& execData);
 
     // test if the given descriptor is the end of the pipe create by the
     // function above
-    virtual bool IsWriteFDOfEndProcessPipe(wxExecuteData& execData, int fd) = 0;
+    virtual bool IsWriteFDOfEndProcessPipe(wxExecuteData& execData, int fd);
 
     // ensure that the write end of the pipe is not closed by wxPipe dtor
-    virtual void DetachWriteFDOfEndProcessPipe(wxExecuteData& execData) = 0;
+    virtual void DetachWriteFDOfEndProcessPipe(wxExecuteData& execData);
 
     // wait for the process termination, return whatever wxExecute() must
     // return
index fe5639731ad3024b1b0095e0de15a875c9e94b24..3c172d803b7400c08ab1b3908a5cfa4eeedd8386 100644 (file)
@@ -22,9 +22,6 @@ public:
 #if wxUSE_CONSOLE_EVENTLOOP
     virtual wxEventLoopBase *CreateEventLoop();
 #endif // wxUSE_CONSOLE_EVENTLOOP
-    virtual bool CreateEndProcessPipe(wxExecuteData& execData);
-    virtual bool IsWriteFDOfEndProcessPipe(wxExecuteData& execData, int fd);
-    virtual void DetachWriteFDOfEndProcessPipe(wxExecuteData& execData);
     virtual int WaitForChild(wxExecuteData& execData);
 #if wxUSE_TIMER
     virtual wxTimerImpl *CreateTimerImpl(wxTimer *timer);
@@ -37,9 +34,6 @@ class WXDLLEXPORT wxGUIAppTraits : public wxGUIAppTraitsBase
 {
 public:
     virtual wxEventLoopBase *CreateEventLoop();
-    virtual bool CreateEndProcessPipe(wxExecuteData& execData);
-    virtual bool IsWriteFDOfEndProcessPipe(wxExecuteData& execData, int fd);
-    virtual void DetachWriteFDOfEndProcessPipe(wxExecuteData& execData);
     virtual int WaitForChild(wxExecuteData& execData);
 #if wxUSE_TIMER
     virtual wxTimerImpl *CreateTimerImpl(wxTimer *timer);
index 25376c0cddf04e68aad3a2168f452d20d73c7b53..e8baeec132609e33b72613f90f36f22eae412da6 100644 (file)
@@ -15,7 +15,7 @@
 class WXDLLIMPEXP_FWD_BASE wxProcess;
 class wxStreamTempInputBuffer;
 
-#if defined(__WXDFB__) || defined(__WXX11__)
+#if defined(__UNIX__)
     #define wxHAS_GENERIC_PROCESS_CALLBACK 1
 #endif
 
index 01d4281e9d278650afb4ad67a6f0cbe188b5763b..c5e3ddcee1b2436200f609699b37b266d0818930 100644 (file)
 // wxConsoleAppTraits implementation
 // ============================================================================
 
-// ----------------------------------------------------------------------------
-// wxExecute support
-// ----------------------------------------------------------------------------
-
-bool wxConsoleAppTraits::CreateEndProcessPipe(wxExecuteData& WXUNUSED(data))
-{
-    // nothing to do, so always ok
-    return true;
-}
-
-bool
-wxConsoleAppTraits::IsWriteFDOfEndProcessPipe(wxExecuteData& WXUNUSED(data),
-                                              int WXUNUSED(fd))
-{
-    // we don't have any pipe
-    return false;
-}
-
-void
-wxConsoleAppTraits::DetachWriteFDOfEndProcessPipe(wxExecuteData& WXUNUSED(data))
-{
-    // nothing to do
-}
-
-
 int
 wxConsoleAppTraits::WaitForChild(wxExecuteData& execData)
 {
-    wxASSERT_MSG( execData.flags & wxEXEC_SYNC,
-                  wxT("async execution not supported yet") );
-
     int exitcode = 0;
-    if ( waitpid(execData.pid, &exitcode, 0) == -1 || !WIFEXITED(exitcode) )
+    if ( execData.flags & wxEXEC_SYNC )
+    {
+        if ( waitpid(execData.pid, &exitcode, 0) == -1 || !WIFEXITED(exitcode) )
+        {
+            wxLogSysError(_("Waiting for subprocess termination failed"));
+        }
+    }
+    else // asynchronous execution
     {
-        wxLogSysError(_("Waiting for subprocess termination failed"));
+        wxEndProcessData *endProcData = new wxEndProcessData;
+        endProcData->process  = execData.process;
+        endProcData->pid      = execData.pid;
+        endProcData->tag = wxAddProcessCallback
+                           (
+                             endProcData,
+                             execData.pipeEndProcDetect.Detach(wxPipe::Read)
+                           );
+
+        execData.pipeEndProcDetect.Close();
+        exitcode = execData.pid;
+
     }
 
     return exitcode;
index 12d1e9eb06794d58c146313355cb5a191b26dc1b..2b5056af5f3b226ff3f6d5b89f8888a8ad3c4239 100644 (file)
@@ -1222,8 +1222,6 @@ bool wxHandleFatalExceptions(bool doit)
 
 #endif // wxUSE_BASE
 
-#if wxUSE_GUI
-
 #ifdef __DARWIN__
     #include <sys/errno.h>
 #endif
@@ -1246,17 +1244,17 @@ bool wxHandleFatalExceptions(bool doit)
 // need wxExecute-related helpers for them
 #if !USE_OLD_DARWIN_END_PROCESS_DETECT
 
-bool wxGUIAppTraits::CreateEndProcessPipe(wxExecuteData& execData)
+bool wxAppTraits::CreateEndProcessPipe(wxExecuteData& execData)
 {
     return execData.pipeEndProcDetect.Create();
 }
 
-bool wxGUIAppTraits::IsWriteFDOfEndProcessPipe(wxExecuteData& execData, int fd)
+bool wxAppTraits::IsWriteFDOfEndProcessPipe(wxExecuteData& execData, int fd)
 {
     return fd == (execData.pipeEndProcDetect)[wxPipe::Write];
 }
 
-void wxGUIAppTraits::DetachWriteFDOfEndProcessPipe(wxExecuteData& execData)
+void wxAppTraits::DetachWriteFDOfEndProcessPipe(wxExecuteData& execData)
 {
     execData.pipeEndProcDetect.Detach(wxPipe::Write);
     execData.pipeEndProcDetect.Close();
@@ -1264,26 +1262,28 @@ void wxGUIAppTraits::DetachWriteFDOfEndProcessPipe(wxExecuteData& execData)
 
 #else // !Darwin
 
-bool wxGUIAppTraits::CreateEndProcessPipe(wxExecuteData& WXUNUSED(execData))
+bool wxAppTraits::CreateEndProcessPipe(wxExecuteData& WXUNUSED(execData))
 {
     return true;
 }
 
 bool
-wxGUIAppTraits::IsWriteFDOfEndProcessPipe(wxExecuteData& WXUNUSED(execData),
+wxAppTraits::IsWriteFDOfEndProcessPipe(wxExecuteData& WXUNUSED(execData),
                                           int WXUNUSED(fd))
 {
     return false;
 }
 
 void
-wxGUIAppTraits::DetachWriteFDOfEndProcessPipe(wxExecuteData& WXUNUSED(execData))
+wxAppTraits::DetachWriteFDOfEndProcessPipe(wxExecuteData& WXUNUSED(execData))
 {
     // nothing to do here, we don't use the pipe
 }
 
 #endif // !Darwin/Darwin
 
+#if wxUSE_GUI
+
 int wxGUIAppTraits::WaitForChild(wxExecuteData& execData)
 {
     wxEndProcessData *endProcData = new wxEndProcessData;
@@ -1440,6 +1440,10 @@ int wxGUIAppTraits::WaitForChild(wxExecuteData& execData)
     }
 }
 
+#endif //wxUSE_GUI
+
+#if wxUSE_BASE
+
 #ifdef wxHAS_GENERIC_PROCESS_CALLBACK
 struct wxEndProcessFDIOHandler : public wxFDIOHandler
 {
@@ -1512,9 +1516,6 @@ int wxAddProcessCallback(wxEndProcessData *proc_data, int fd)
 }
 #endif // wxHAS_GENERIC_PROCESS_CALLBACK
 
-#endif // wxUSE_GUI
-#if wxUSE_BASE
-
 void wxHandleProcessTermination(wxEndProcessData *proc_data)
 {
     // notify user about termination if required