Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(36)

Side by Side Diff: base/threading/thread_perftest.cc

Issue 2033433002: Migrate WaitableEvent enum-based constructor in templated EventPerfTest (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@base
Patch Set: Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 #include <stddef.h> 5 #include <stddef.h>
6 6
7 #include "base/base_switches.h" 7 #include "base/base_switches.h"
8 #include "base/bind.h" 8 #include "base/bind.h"
9 #include "base/command_line.h" 9 #include "base/command_line.h"
10 #include "base/location.h" 10 #include "base/location.h"
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after
173 RunPingPongTest("1_Task_Threads_With_Observer", 1); 173 RunPingPongTest("1_Task_Threads_With_Observer", 1);
174 RunPingPongTest("4_Task_Threads_With_Observer", 4); 174 RunPingPongTest("4_Task_Threads_With_Observer", 4);
175 } 175 }
176 176
177 // Class to test our WaitableEvent performance by signaling back and fort. 177 // Class to test our WaitableEvent performance by signaling back and fort.
178 // WaitableEvent is templated so we can also compare with other versions. 178 // WaitableEvent is templated so we can also compare with other versions.
179 template <typename WaitableEventType> 179 template <typename WaitableEventType>
180 class EventPerfTest : public ThreadPerfTest { 180 class EventPerfTest : public ThreadPerfTest {
181 public: 181 public:
182 void Init() override { 182 void Init() override {
183 for (size_t i = 0; i < threads_.size(); i++) 183 for (size_t i = 0; i < threads_.size(); i++) {
184 events_.push_back(new WaitableEventType(false, false)); 184 events_.push_back(
185 new WaitableEventType(WaitableEvent::ResetPolicy::AUTOMATIC,
186 WaitableEvent::InitialState::NOT_SIGNALED));
187 }
185 } 188 }
186 189
187 void Reset() override { events_.clear(); } 190 void Reset() override { events_.clear(); }
188 191
189 void WaitAndSignalOnThread(size_t event) { 192 void WaitAndSignalOnThread(size_t event) {
190 size_t next_event = (event + 1) % events_.size(); 193 size_t next_event = (event + 1) % events_.size();
191 int my_hops = 0; 194 int my_hops = 0;
192 do { 195 do {
193 events_[event]->Wait(); 196 events_[event]->Wait();
194 my_hops = --remaining_hops_; // We own 'hops' between Wait and Signal. 197 my_hops = --remaining_hops_; // We own 'hops' between Wait and Signal.
(...skipping 26 matching lines...) Expand all
221 // might want to craft a way to test the best-case (where the thread doesn't 224 // might want to craft a way to test the best-case (where the thread doesn't
222 // end up blocking because the event is already signalled). 225 // end up blocking because the event is already signalled).
223 typedef EventPerfTest<base::WaitableEvent> WaitableEventPerfTest; 226 typedef EventPerfTest<base::WaitableEvent> WaitableEventPerfTest;
224 TEST_F(WaitableEventPerfTest, EventPingPong) { 227 TEST_F(WaitableEventPerfTest, EventPingPong) {
225 RunPingPongTest("4_WaitableEvent_Threads", 4); 228 RunPingPongTest("4_WaitableEvent_Threads", 4);
226 } 229 }
227 230
228 // Build a minimal event using ConditionVariable. 231 // Build a minimal event using ConditionVariable.
229 class ConditionVariableEvent { 232 class ConditionVariableEvent {
230 public: 233 public:
231 ConditionVariableEvent(bool manual_reset, bool initially_signaled) 234 ConditionVariableEvent(WaitableEvent::ResetPolicy reset_policy,
235 WaitableEvent::InitialState initial_state)
232 : cond_(&lock_), signaled_(false) { 236 : cond_(&lock_), signaled_(false) {
233 DCHECK(!manual_reset); 237 DCHECK_EQ(WaitableEvent::ResetPolicy::AUTOMATIC, reset_policy);
234 DCHECK(!initially_signaled); 238 DCHECK_EQ(WaitableEvent::InitialState::NOT_SIGNALED, initial_state);
235 } 239 }
236 240
237 void Signal() { 241 void Signal() {
238 { 242 {
239 base::AutoLock scoped_lock(lock_); 243 base::AutoLock scoped_lock(lock_);
240 signaled_ = true; 244 signaled_ = true;
241 } 245 }
242 cond_.Signal(); 246 cond_.Signal();
243 } 247 }
244 248
(...skipping 15 matching lines...) Expand all
260 typedef EventPerfTest<ConditionVariableEvent> ConditionVariablePerfTest; 264 typedef EventPerfTest<ConditionVariableEvent> ConditionVariablePerfTest;
261 TEST_F(ConditionVariablePerfTest, EventPingPong) { 265 TEST_F(ConditionVariablePerfTest, EventPingPong) {
262 RunPingPongTest("4_ConditionVariable_Threads", 4); 266 RunPingPongTest("4_ConditionVariable_Threads", 4);
263 } 267 }
264 #if defined(OS_POSIX) 268 #if defined(OS_POSIX)
265 269
266 // Absolutely 100% minimal posix waitable event. If there is a better/faster 270 // Absolutely 100% minimal posix waitable event. If there is a better/faster
267 // way to force a context switch, we should use that instead. 271 // way to force a context switch, we should use that instead.
268 class PthreadEvent { 272 class PthreadEvent {
269 public: 273 public:
270 PthreadEvent(bool manual_reset, bool initially_signaled) { 274 PthreadEvent(WaitableEvent::ResetPolicy reset_policy,
271 DCHECK(!manual_reset); 275 WaitableEvent::InitialState initial_state) {
272 DCHECK(!initially_signaled); 276 DCHECK_EQ(WaitableEvent::ResetPolicy::AUTOMATIC, reset_policy);
277 DCHECK_EQ(WaitableEvent::InitialState::NOT_SIGNALED, initial_state);
273 pthread_mutex_init(&mutex_, 0); 278 pthread_mutex_init(&mutex_, 0);
274 pthread_cond_init(&cond_, 0); 279 pthread_cond_init(&cond_, 0);
275 signaled_ = false; 280 signaled_ = false;
276 } 281 }
277 282
278 ~PthreadEvent() { 283 ~PthreadEvent() {
279 pthread_cond_destroy(&cond_); 284 pthread_cond_destroy(&cond_);
280 pthread_mutex_destroy(&mutex_); 285 pthread_mutex_destroy(&mutex_);
281 } 286 }
282 287
(...skipping 23 matching lines...) Expand all
306 typedef EventPerfTest<PthreadEvent> PthreadEventPerfTest; 311 typedef EventPerfTest<PthreadEvent> PthreadEventPerfTest;
307 TEST_F(PthreadEventPerfTest, EventPingPong) { 312 TEST_F(PthreadEventPerfTest, EventPingPong) {
308 RunPingPongTest("4_PthreadCondVar_Threads", 4); 313 RunPingPongTest("4_PthreadCondVar_Threads", 4);
309 } 314 }
310 315
311 #endif 316 #endif
312 317
313 } // namespace 318 } // namespace
314 319
315 } // namespace base 320 } // namespace base
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698