X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/2ccfebab0925dd4bd5ad1671ad290ebc3141d782..4ec2eca1e8c2829b34bfc95a10cc3c6ab4798314:/include/wx/unix/private/wakeuppipe.h diff --git a/include/wx/unix/private/wakeuppipe.h b/include/wx/unix/private/wakeuppipe.h index 2a942d05d7..23bcf12912 100644 --- a/include/wx/unix/private/wakeuppipe.h +++ b/include/wx/unix/private/wakeuppipe.h @@ -11,15 +11,17 @@ #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 // ---------------------------------------------------------------------------- -class wxWakeUpPipe : public wxFDIOHandler +// This class is not MT-safe, see wxWakeUpPipeMT below for a wake up pipe +// usable from other threads. + +class wxWakeUpPipe : public wxEventLoopSourceHandler { public: // Create and initialize the pipe. @@ -32,15 +34,17 @@ public: // // It simply writes to the write end of the pipe. // - // Notice that this method can be, and often is, called from another - // thread. - void WakeUp(); + // As indicated by its name, this method does no locking and so can be + // called only from the main thread. + void WakeUpNoLock(); + + // Same as WakeUp() but without locking. // Return the read end of the pipe. 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() { } @@ -48,9 +52,6 @@ public: private: wxPipe m_pipe; - // Protects access to m_pipeIsEmpty. - wxCriticalSection m_pipeLock; - // This flag is set to true after writing to the pipe and reset to false // after reading from it in the main thread. Having it allows us to avoid // overflowing the pipe with too many writes if the main thread can't keep @@ -58,4 +59,44 @@ private: bool m_pipeIsEmpty; }; +// ---------------------------------------------------------------------------- +// wxWakeUpPipeMT: thread-safe version of wxWakeUpPipe +// ---------------------------------------------------------------------------- + +// This class can be used from multiple threads, i.e. its WakeUp() can be +// called concurrently. +#if wxUSE_THREADS + +class wxWakeUpPipeMT : public wxWakeUpPipe +{ +public: + wxWakeUpPipeMT() { } + + // Thread-safe wrapper around WakeUpNoLock(): can be called from another + // thread to wake up the main one. + void WakeUp() + { + wxCriticalSectionLocker lock(m_pipeLock); + + WakeUpNoLock(); + } + + virtual void OnReadWaiting() + { + wxCriticalSectionLocker lock(m_pipeLock); + + wxWakeUpPipe::OnReadWaiting(); + } + +private: + // Protects access to m_pipeIsEmpty. + wxCriticalSection m_pipeLock; +}; + +#else // !wxUSE_THREADS + +typedef wxWakeUpPipe wxWakeUpPipeMT; + +#endif // wxUSE_THREADS/!wxUSE_THREADS + #endif // _WX_UNIX_PRIVATE_WAKEUPPIPE_H_