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
// wxConsoleEventLoop
// ----------------------------------------------------------------------------
// wxConsoleEventLoop
// ----------------------------------------------------------------------------
+class wxEventLoopSource;
-class wxUnixEventLoopSource;
class wxWakeUpPipeMT;
class WXDLLIMPEXP_BASE wxConsoleEventLoop
class wxWakeUpPipeMT;
class WXDLLIMPEXP_BASE wxConsoleEventLoop
// 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;
#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
// 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.
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() { }
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;
- 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 )
- 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());
- }
// 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