]> git.saurik.com Git - wxWidgets.git/commitdiff
Change wxWakeUpPipe to be a wxEventLoopSourceHandler.
authorVadim Zeitlin <vadim@wxwidgets.org>
Wed, 3 Jul 2013 00:30:39 +0000 (00:30 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Wed, 3 Jul 2013 00:30:39 +0000 (00:30 +0000)
No real changes but use wxEventLoopSource::AddSourceForFD() instead of
wxFDIODispatcher::RegisterFD() for this pipe because this is the preferred way
and because it will allow reusing this class for wxExecute() purposes later.

See #10258.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@74346 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/unix/evtloop.h
include/wx/unix/private/wakeuppipe.h
src/unix/evtloopunix.cpp
src/unix/wakeuppipe.cpp

index 0b717660683f43e3c21f64dc34086f9818559cac..2e02cf358ac3d7b9cb1fe9746475a752de7fa15b 100644 (file)
@@ -17,8 +17,8 @@
 // wxConsoleEventLoop
 // ----------------------------------------------------------------------------
 
 // wxConsoleEventLoop
 // ----------------------------------------------------------------------------
 
+class wxEventLoopSource;
 class wxFDIODispatcher;
 class wxFDIODispatcher;
-class wxUnixEventLoopSource;
 class wxWakeUpPipeMT;
 
 class WXDLLIMPEXP_BASE wxConsoleEventLoop
 class wxWakeUpPipeMT;
 
 class WXDLLIMPEXP_BASE wxConsoleEventLoop
@@ -49,6 +49,9 @@ private:
     // the event loop in the main thread it writes to this pipe
     wxWakeUpPipeMT *m_wakeupPipe;
 
     // the event loop in the main thread it writes to this pipe
     wxWakeUpPipeMT *m_wakeupPipe;
 
+    // the event loop source used to monitor this pipe
+    wxEventLoopSource* m_wakeupSource;
+
     // either wxSelectDispatcher or wxEpollDispatcher
     wxFDIODispatcher *m_dispatcher;
 
     // either wxSelectDispatcher or wxEpollDispatcher
     wxFDIODispatcher *m_dispatcher;
 
index b2dda1635ca44e4aa62dc14476f14a6eafaa196f..df90d52025b7c306289883bd694b5d1e489160af 100644 (file)
@@ -11,9 +11,8 @@
 #ifndef _WX_UNIX_PRIVATE_WAKEUPPIPE_H_
 #define _WX_UNIX_PRIVATE_WAKEUPPIPE_H_
 
 #ifndef _WX_UNIX_PRIVATE_WAKEUPPIPE_H_
 #define _WX_UNIX_PRIVATE_WAKEUPPIPE_H_
 
-#include "wx/private/fdiohandler.h"
-
 #include "wx/unix/pipe.h"
 #include "wx/unix/pipe.h"
+#include "wx/evtloopsrc.h"
 
 // ----------------------------------------------------------------------------
 // wxWakeUpPipe: allows to wake up the event loop by writing to it
 
 // ----------------------------------------------------------------------------
 // wxWakeUpPipe: allows to wake up the event loop by writing to it
@@ -22,7 +21,7 @@
 // This class is not MT-safe, see wxWakeUpPipeMT below for a wake up pipe
 // usable from other threads.
 
 // This class is not MT-safe, see wxWakeUpPipeMT below for a wake up pipe
 // usable from other threads.
 
-class wxWakeUpPipe : public wxFDIOHandler
+class wxWakeUpPipe : public wxEventLoopSourceHandler
 {
 public:
     // Create and initialize the pipe.
 {
 public:
     // Create and initialize the pipe.
@@ -45,7 +44,7 @@ public:
     int GetReadFd() { return m_pipe[wxPipe::Read]; }
 
 
     int GetReadFd() { return m_pipe[wxPipe::Read]; }
 
 
-    // implement wxFDIOHandler pure virtual methods
+    // Implement wxEventLoopSourceHandler pure virtual methods
     virtual void OnReadWaiting();
     virtual void OnWriteWaiting() { }
     virtual void OnExceptionWaiting() { }
     virtual void OnReadWaiting();
     virtual void OnWriteWaiting() { }
     virtual void OnExceptionWaiting() { }
index 763b73ef73b38480d177314e3b205261c983b82a..70279d9368451f68a87367343f3148e9d5863c05 100644 (file)
 
 wxConsoleEventLoop::wxConsoleEventLoop()
 {
 
 wxConsoleEventLoop::wxConsoleEventLoop()
 {
-    m_wakeupPipe = new wxWakeUpPipeMT;
-    const int pipeFD = m_wakeupPipe->GetReadFd();
+    // Be pessimistic initially and assume that we failed to initialize.
+    m_dispatcher = NULL;
+    m_wakeupPipe = NULL;
+    m_wakeupSource = NULL;
+
+    // Create the pipe.
+    wxScopedPtr<wxWakeUpPipeMT> wakeupPipe(new wxWakeUpPipeMT);
+    const int pipeFD = wakeupPipe->GetReadFd();
     if ( pipeFD == wxPipe::INVALID_FD )
     if ( pipeFD == wxPipe::INVALID_FD )
-    {
-        wxDELETE(m_wakeupPipe);
-        m_dispatcher = NULL;
         return;
         return;
-    }
 
 
-    m_dispatcher = wxFDIODispatcher::Get();
-    if ( !m_dispatcher )
+    // And start monitoring it in our event loop.
+    m_wakeupSource = wxEventLoopBase::AddSourceForFD
+                                      (
+                                        pipeFD,
+                                        wakeupPipe.get(),
+                                        wxFDIO_INPUT
+                                      );
+
+    if ( !m_wakeupSource )
         return;
 
         return;
 
-    m_dispatcher->RegisterFD(pipeFD, m_wakeupPipe, wxFDIO_INPUT);
+    // This is a bit ugly but we know that AddSourceForFD() used the currently
+    // active dispatcher to register this source, so use the same one for our
+    // other operations. Of course, currently the dispatcher returned by
+    // wxFDIODispatcher::Get() is always the same one anyhow so it doesn't
+    // really matter, but if we started returning different things later, it
+    // would.
+    m_dispatcher = wxFDIODispatcher::Get();
+
+    m_wakeupPipe = wakeupPipe.release();
 }
 
 wxConsoleEventLoop::~wxConsoleEventLoop()
 {
     if ( m_wakeupPipe )
     {
 }
 
 wxConsoleEventLoop::~wxConsoleEventLoop()
 {
     if ( m_wakeupPipe )
     {
-        if ( m_dispatcher )
-        {
-            m_dispatcher->UnregisterFD(m_wakeupPipe->GetReadFd());
-        }
+        delete m_wakeupSource;
 
         delete m_wakeupPipe;
     }
 
         delete m_wakeupPipe;
     }
index 0b40a2535718ec1b6f6bb6414e1655c344654e8e..18dbb7c466176844aeb7599f6bb5487ca1452ce5 100644 (file)
@@ -126,8 +126,4 @@ void wxWakeUpPipe::OnReadWaiting()
     // The pipe is empty now, so future calls to WakeUp() would need to write
     // to it again.
     m_pipeIsEmpty = true;
     // The pipe is empty now, so future calls to WakeUp() would need to write
     // to it again.
     m_pipeIsEmpty = true;
-
-    // writing to the wake up pipe will make wxConsoleEventLoop return from
-    // wxFDIODispatcher::Dispatch() it might be currently blocking in, nothing
-    // else needs to be done
 }
 }