]>
Commit | Line | Data |
---|---|---|
2ccfebab VZ |
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 | // RCS-ID: $Id$ | |
7 | // Copyright: (c) 2013 Vadim Zeitlin <vadim@wxwidgets.org> | |
8 | // Licence: wxWindows licence | |
9 | /////////////////////////////////////////////////////////////////////////////// | |
10 | ||
11 | #ifndef _WX_UNIX_PRIVATE_WAKEUPPIPE_H_ | |
12 | #define _WX_UNIX_PRIVATE_WAKEUPPIPE_H_ | |
13 | ||
2ccfebab | 14 | #include "wx/unix/pipe.h" |
39bc0168 | 15 | #include "wx/evtloopsrc.h" |
2ccfebab VZ |
16 | |
17 | // ---------------------------------------------------------------------------- | |
18 | // wxWakeUpPipe: allows to wake up the event loop by writing to it | |
19 | // ---------------------------------------------------------------------------- | |
20 | ||
bd7cea0e VZ |
21 | // This class is not MT-safe, see wxWakeUpPipeMT below for a wake up pipe |
22 | // usable from other threads. | |
23 | ||
39bc0168 | 24 | class wxWakeUpPipe : public wxEventLoopSourceHandler |
2ccfebab VZ |
25 | { |
26 | public: | |
27 | // Create and initialize the pipe. | |
28 | // | |
29 | // It's the callers responsibility to add the read end of this pipe, | |
30 | // returned by GetReadFd(), to the code blocking on input. | |
31 | wxWakeUpPipe(); | |
32 | ||
33 | // Wake up the blocking operation involving this pipe. | |
34 | // | |
35 | // It simply writes to the write end of the pipe. | |
36 | // | |
bd7cea0e VZ |
37 | // As indicated by its name, this method does no locking and so can be |
38 | // called only from the main thread. | |
39 | void WakeUpNoLock(); | |
40 | ||
41 | // Same as WakeUp() but without locking. | |
2ccfebab VZ |
42 | |
43 | // Return the read end of the pipe. | |
44 | int GetReadFd() { return m_pipe[wxPipe::Read]; } | |
45 | ||
46 | ||
39bc0168 | 47 | // Implement wxEventLoopSourceHandler pure virtual methods |
2ccfebab VZ |
48 | virtual void OnReadWaiting(); |
49 | virtual void OnWriteWaiting() { } | |
50 | virtual void OnExceptionWaiting() { } | |
51 | ||
52 | private: | |
53 | wxPipe m_pipe; | |
54 | ||
2ccfebab VZ |
55 | // This flag is set to true after writing to the pipe and reset to false |
56 | // after reading from it in the main thread. Having it allows us to avoid | |
57 | // overflowing the pipe with too many writes if the main thread can't keep | |
58 | // up with reading from it. | |
59 | bool m_pipeIsEmpty; | |
60 | }; | |
61 | ||
bd7cea0e VZ |
62 | // ---------------------------------------------------------------------------- |
63 | // wxWakeUpPipeMT: thread-safe version of wxWakeUpPipe | |
64 | // ---------------------------------------------------------------------------- | |
65 | ||
66 | // This class can be used from multiple threads, i.e. its WakeUp() can be | |
67 | // called concurrently. | |
68 | ||
69 | class wxWakeUpPipeMT : public wxWakeUpPipe | |
70 | { | |
71 | public: | |
72 | wxWakeUpPipeMT() { } | |
73 | ||
74 | // Thread-safe wrapper around WakeUpNoLock(): can be called from another | |
75 | // thread to wake up the main one. | |
76 | void WakeUp() | |
77 | { | |
78 | wxCriticalSectionLocker lock(m_pipeLock); | |
79 | ||
80 | WakeUpNoLock(); | |
81 | } | |
82 | ||
83 | virtual void OnReadWaiting() | |
84 | { | |
85 | wxCriticalSectionLocker lock(m_pipeLock); | |
86 | ||
87 | wxWakeUpPipe::OnReadWaiting(); | |
88 | } | |
89 | ||
90 | private: | |
91 | // Protects access to m_pipeIsEmpty. | |
92 | wxCriticalSection m_pipeLock; | |
93 | }; | |
94 | ||
2ccfebab | 95 | #endif // _WX_UNIX_PRIVATE_WAKEUPPIPE_H_ |