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
This commit is contained in:
parent
64b4a35954
commit
39bc0168c3
@ -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;
|
||||
|
||||
|
@ -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() { }
|
||||
|
@ -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<wxWakeUpPipeMT> wakeupPipe(new wxWakeUpPipeMT);
|
||||
const int pipeFD = wakeupPipe->GetReadFd();
|
||||
if ( pipeFD == wxPipe::INVALID_FD )
|
||||
{
|
||||
wxDELETE(m_wakeupPipe);
|
||||
m_dispatcher = NULL;
|
||||
return;
|
||||
}
|
||||
|
||||
// And start monitoring it in our event loop.
|
||||
m_wakeupSource = wxEventLoopBase::AddSourceForFD
|
||||
(
|
||||
pipeFD,
|
||||
wakeupPipe.get(),
|
||||
wxFDIO_INPUT
|
||||
);
|
||||
|
||||
if ( !m_wakeupSource )
|
||||
return;
|
||||
|
||||
// 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();
|
||||
if ( !m_dispatcher )
|
||||
return;
|
||||
|
||||
m_dispatcher->RegisterFD(pipeFD, m_wakeupPipe, wxFDIO_INPUT);
|
||||
m_wakeupPipe = wakeupPipe.release();
|
||||
}
|
||||
|
||||
wxConsoleEventLoop::~wxConsoleEventLoop()
|
||||
{
|
||||
if ( m_wakeupPipe )
|
||||
{
|
||||
if ( m_dispatcher )
|
||||
{
|
||||
m_dispatcher->UnregisterFD(m_wakeupPipe->GetReadFd());
|
||||
}
|
||||
delete m_wakeupSource;
|
||||
|
||||
delete m_wakeupPipe;
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user