| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- ///////////////////////////////////////////////////////////////////////////////
- // Name: wx/unix/private/wakeuppipe.h
- // Purpose: Helper class allowing to wake up the main thread.
- // Author: Vadim Zeitlin
- // Created: 2013-06-09 (extracted from src/unix/evtloopunix.cpp)
- // Copyright: (c) 2013 Vadim Zeitlin <vadim@wxwidgets.org>
- // Licence: wxWindows licence
- ///////////////////////////////////////////////////////////////////////////////
- #ifndef _WX_UNIX_PRIVATE_WAKEUPPIPE_H_
- #define _WX_UNIX_PRIVATE_WAKEUPPIPE_H_
- #include "wx/unix/pipe.h"
- #include "wx/evtloopsrc.h"
- // ----------------------------------------------------------------------------
- // 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.
- class wxWakeUpPipe : public wxEventLoopSourceHandler
- {
- public:
- // Create and initialize the pipe.
- //
- // It's the callers responsibility to add the read end of this pipe,
- // returned by GetReadFd(), to the code blocking on input.
- wxWakeUpPipe();
- // Wake up the blocking operation involving this pipe.
- //
- // It simply writes to the write end of the pipe.
- //
- // 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 wxEventLoopSourceHandler pure virtual methods
- virtual void OnReadWaiting();
- virtual void OnWriteWaiting() { }
- virtual void OnExceptionWaiting() { }
- private:
- wxPipe m_pipe;
- // 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
- // up with reading from it.
- 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.
- class wxWakeUpPipeMT : public wxWakeUpPipe
- {
- #if wxUSE_THREADS
- 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;
- #endif // wxUSE_THREADS
- };
- #endif // _WX_UNIX_PRIVATE_WAKEUPPIPE_H_
|