1 ///////////////////////////////////////////////////////////////////////////////
2 // Name: wx/unix/private/wakeuppipe.h
3 // Purpose: Helper class allowing to wake up the main thread.
4 // Author: Vadim Zeitlin
5 // Created: 2013-06-09 (extracted from src/unix/evtloopunix.cpp)
6 // Copyright: (c) 2013 Vadim Zeitlin <vadim@wxwidgets.org>
7 // Licence: wxWindows licence
8 ///////////////////////////////////////////////////////////////////////////////
10 #ifndef _WX_UNIX_PRIVATE_WAKEUPPIPE_H_
11 #define _WX_UNIX_PRIVATE_WAKEUPPIPE_H_
13 #include "wx/unix/pipe.h"
14 #include "wx/evtloopsrc.h"
16 // ----------------------------------------------------------------------------
17 // wxWakeUpPipe: allows to wake up the event loop by writing to it
18 // ----------------------------------------------------------------------------
20 // This class is not MT-safe, see wxWakeUpPipeMT below for a wake up pipe
21 // usable from other threads.
23 class wxWakeUpPipe
: public wxEventLoopSourceHandler
26 // Create and initialize the pipe.
28 // It's the callers responsibility to add the read end of this pipe,
29 // returned by GetReadFd(), to the code blocking on input.
32 // Wake up the blocking operation involving this pipe.
34 // It simply writes to the write end of the pipe.
36 // As indicated by its name, this method does no locking and so can be
37 // called only from the main thread.
40 // Same as WakeUp() but without locking.
42 // Return the read end of the pipe.
43 int GetReadFd() { return m_pipe
[wxPipe::Read
]; }
46 // Implement wxEventLoopSourceHandler pure virtual methods
47 virtual void OnReadWaiting();
48 virtual void OnWriteWaiting() { }
49 virtual void OnExceptionWaiting() { }
54 // This flag is set to true after writing to the pipe and reset to false
55 // after reading from it in the main thread. Having it allows us to avoid
56 // overflowing the pipe with too many writes if the main thread can't keep
57 // up with reading from it.
61 // ----------------------------------------------------------------------------
62 // wxWakeUpPipeMT: thread-safe version of wxWakeUpPipe
63 // ----------------------------------------------------------------------------
65 // This class can be used from multiple threads, i.e. its WakeUp() can be
66 // called concurrently.
69 class wxWakeUpPipeMT
: public wxWakeUpPipe
74 // Thread-safe wrapper around WakeUpNoLock(): can be called from another
75 // thread to wake up the main one.
78 wxCriticalSectionLocker
lock(m_pipeLock
);
83 virtual void OnReadWaiting()
85 wxCriticalSectionLocker
lock(m_pipeLock
);
87 wxWakeUpPipe::OnReadWaiting();
91 // Protects access to m_pipeIsEmpty.
92 wxCriticalSection m_pipeLock
;
95 #else // !wxUSE_THREADS
97 typedef wxWakeUpPipe wxWakeUpPipeMT
;
99 #endif // wxUSE_THREADS/!wxUSE_THREADS
101 #endif // _WX_UNIX_PRIVATE_WAKEUPPIPE_H_