OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef BASE_SYNCHRONIZATION_WAITABLE_EVENT_H_ | 5 #ifndef BASE_SYNCHRONIZATION_WAITABLE_EVENT_H_ |
6 #define BASE_SYNCHRONIZATION_WAITABLE_EVENT_H_ | 6 #define BASE_SYNCHRONIZATION_WAITABLE_EVENT_H_ |
7 | 7 |
8 #include <stddef.h> | 8 #include <stddef.h> |
9 | 9 |
10 #include "base/base_export.h" | 10 #include "base/base_export.h" |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
49 enum class ResetPolicy { MANUAL, AUTOMATIC }; | 49 enum class ResetPolicy { MANUAL, AUTOMATIC }; |
50 | 50 |
51 // Indicates whether a new WaitableEvent should start in a signaled state or | 51 // Indicates whether a new WaitableEvent should start in a signaled state or |
52 // not. | 52 // not. |
53 enum class InitialState { SIGNALED, NOT_SIGNALED }; | 53 enum class InitialState { SIGNALED, NOT_SIGNALED }; |
54 | 54 |
55 // Constructs a WaitableEvent with policy and initial state as detailed in | 55 // Constructs a WaitableEvent with policy and initial state as detailed in |
56 // the above enums. | 56 // the above enums. |
57 WaitableEvent(ResetPolicy reset_policy, InitialState initial_state); | 57 WaitableEvent(ResetPolicy reset_policy, InitialState initial_state); |
58 | 58 |
59 // If manual_reset is true, then to set the event state to non-signaled, a | |
60 // consumer must call the Reset method. If this parameter is false, then the | |
61 // system automatically resets the event state to non-signaled after a single | |
62 // waiting thread has been released. | |
63 // DEPRECATED: Use the enum-based constructor instead (full removal tracked in | |
64 // http://crbug.com/612843). | |
65 WaitableEvent(bool manual_reset, bool initially_signaled); | |
66 | |
67 #if defined(OS_WIN) | 59 #if defined(OS_WIN) |
68 // Create a WaitableEvent from an Event HANDLE which has already been | 60 // Create a WaitableEvent from an Event HANDLE which has already been |
69 // created. This objects takes ownership of the HANDLE and will close it when | 61 // created. This objects takes ownership of the HANDLE and will close it when |
70 // deleted. | 62 // deleted. |
71 explicit WaitableEvent(win::ScopedHandle event_handle); | 63 explicit WaitableEvent(win::ScopedHandle event_handle); |
72 #endif | 64 #endif |
73 | 65 |
74 ~WaitableEvent(); | 66 ~WaitableEvent(); |
75 | 67 |
76 // Put the event in the un-signaled state. | 68 // Put the event in the un-signaled state. |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
158 // MSDN documentation says that the resulting behaviour is 'undefined', but | 150 // MSDN documentation says that the resulting behaviour is 'undefined', but |
159 // it doesn't crash. However, if we were to include the following members | 151 // it doesn't crash. However, if we were to include the following members |
160 // directly then, on POSIX, one couldn't use WaitableEventWatcher to watch an | 152 // directly then, on POSIX, one couldn't use WaitableEventWatcher to watch an |
161 // event which gets deleted. This mismatch has bitten us several times now, | 153 // event which gets deleted. This mismatch has bitten us several times now, |
162 // so we have a kernel of the WaitableEvent, which is reference counted. | 154 // so we have a kernel of the WaitableEvent, which is reference counted. |
163 // WaitableEventWatchers may then take a reference and thus match the Windows | 155 // WaitableEventWatchers may then take a reference and thus match the Windows |
164 // behaviour. | 156 // behaviour. |
165 struct WaitableEventKernel : | 157 struct WaitableEventKernel : |
166 public RefCountedThreadSafe<WaitableEventKernel> { | 158 public RefCountedThreadSafe<WaitableEventKernel> { |
167 public: | 159 public: |
168 WaitableEventKernel(bool manual_reset, bool initially_signaled); | 160 WaitableEventKernel(ResetPolicy reset_policy, InitialState initial_state); |
169 | 161 |
170 bool Dequeue(Waiter* waiter, void* tag); | 162 bool Dequeue(Waiter* waiter, void* tag); |
171 | 163 |
172 base::Lock lock_; | 164 base::Lock lock_; |
173 const bool manual_reset_; | 165 const bool manual_reset_; |
174 bool signaled_; | 166 bool signaled_; |
175 std::list<Waiter*> waiters_; | 167 std::list<Waiter*> waiters_; |
176 | 168 |
177 private: | 169 private: |
178 friend class RefCountedThreadSafe<WaitableEventKernel>; | 170 friend class RefCountedThreadSafe<WaitableEventKernel>; |
(...skipping 16 matching lines...) Expand all Loading... |
195 | 187 |
196 scoped_refptr<WaitableEventKernel> kernel_; | 188 scoped_refptr<WaitableEventKernel> kernel_; |
197 #endif | 189 #endif |
198 | 190 |
199 DISALLOW_COPY_AND_ASSIGN(WaitableEvent); | 191 DISALLOW_COPY_AND_ASSIGN(WaitableEvent); |
200 }; | 192 }; |
201 | 193 |
202 } // namespace base | 194 } // namespace base |
203 | 195 |
204 #endif // BASE_SYNCHRONIZATION_WAITABLE_EVENT_H_ | 196 #endif // BASE_SYNCHRONIZATION_WAITABLE_EVENT_H_ |
OLD | NEW |