From 39bc0168c3eb5809468ae677999902b3478494a0 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Wed, 3 Jul 2013 00:30:39 +0000 Subject: [PATCH] Change wxWakeUpPipe to be a wxEventLoopSourceHandler. 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 | 5 +++- include/wx/unix/private/wakeuppipe.h | 7 +++-- src/unix/evtloopunix.cpp | 40 +++++++++++++++++++--------- src/unix/wakeuppipe.cpp | 4 --- 4 files changed, 34 insertions(+), 22 deletions(-) diff --git a/include/wx/unix/evtloop.h b/include/wx/unix/evtloop.h index 0b71766068..2e02cf358a 100644 --- a/include/wx/unix/evtloop.h +++ b/include/wx/unix/evtloop.h @@ -17,8 +17,8 @@ // wxConsoleEventLoop // ---------------------------------------------------------------------------- +class wxEventLoopSource; class wxFDIODispatcher; -class wxUnixEventLoopSource; 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 source used to monitor this pipe + wxEventLoopSource* m_wakeupSource; + // either wxSelectDispatcher or wxEpollDispatcher wxFDIODispatcher *m_dispatcher; diff --git a/include/wx/unix/private/wakeuppipe.h b/include/wx/unix/private/wakeuppipe.h index b2dda1635c..df90d52025 100644 --- a/include/wx/unix/private/wakeuppipe.h +++ b/include/wx/unix/private/wakeuppipe.h @@ -11,9 +11,8 @@ #ifndef _WX_UNIX_PRIVATE_WAKEUPPIPE_H_ #define _WX_UNIX_PRIVATE_WAKEUPPIPE_H_ -#include "wx/private/fdiohandler.h" - #include "wx/unix/pipe.h" +#include "wx/evtloopsrc.h" // ---------------------------------------------------------------------------- // 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. -class wxWakeUpPipe : public wxFDIOHandler +class wxWakeUpPipe : public wxEventLoopSourceHandler { public: // Create and initialize the pipe. @@ -45,7 +44,7 @@ public: 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() { } diff --git a/src/unix/evtloopunix.cpp b/src/unix/evtloopunix.cpp index 763b73ef73..70279d9368 100644 --- a/src/unix/evtloopunix.cpp +++ b/src/unix/evtloopunix.cpp @@ -54,30 +54,44 @@ 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 wakeupPipe(new wxWakeUpPipeMT); + const int pipeFD = wakeupPipe->GetReadFd(); if ( pipeFD == wxPipe::INVALID_FD ) - { - wxDELETE(m_wakeupPipe); - m_dispatcher = NULL; 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; - 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 ) { - if ( m_dispatcher ) - { - m_dispatcher->UnregisterFD(m_wakeupPipe->GetReadFd()); - } + delete m_wakeupSource; delete m_wakeupPipe; } diff --git a/src/unix/wakeuppipe.cpp b/src/unix/wakeuppipe.cpp index 0b40a25357..18dbb7c466 100644 --- a/src/unix/wakeuppipe.cpp +++ b/src/unix/wakeuppipe.cpp @@ -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; - - // 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 } -- 2.47.2