|  | // Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file | 
|  | // for details. All rights reserved. Use of this source code is governed by a | 
|  | // BSD-style license that can be found in the LICENSE file. | 
|  |  | 
|  | #include "vm/thread_barrier.h" | 
|  | #include "platform/assert.h" | 
|  | #include "vm/random.h" | 
|  | #include "vm/thread_pool.h" | 
|  | #include "vm/unit_test.h" | 
|  |  | 
|  | namespace dart { | 
|  |  | 
|  | class FuzzTask : public ThreadPool::Task { | 
|  | public: | 
|  | FuzzTask(intptr_t num_rounds, ThreadBarrier* barrier, uint64_t seed) | 
|  | : num_rounds_(num_rounds), barrier_(barrier), rng_(seed) {} | 
|  |  | 
|  | virtual void Run() { | 
|  | for (intptr_t i = 0; i < num_rounds_; ++i) { | 
|  | RandomSleep(); | 
|  | barrier_->Sync(); | 
|  | } | 
|  | barrier_->Release(); | 
|  | } | 
|  |  | 
|  | private: | 
|  | void RandomSleep() { | 
|  | int64_t ms = rng_.NextUInt32() % 4; | 
|  | if (ms > 0) { | 
|  | OS::Sleep(ms); | 
|  | } | 
|  | } | 
|  |  | 
|  | const intptr_t num_rounds_; | 
|  | ThreadBarrier* barrier_; | 
|  | Random rng_; | 
|  | }; | 
|  |  | 
|  | VM_UNIT_TEST_CASE(ThreadBarrier) { | 
|  | static const intptr_t kNumTasks = 5; | 
|  | static const intptr_t kNumRounds = 500; | 
|  |  | 
|  | ThreadBarrier* barrier = new ThreadBarrier(kNumTasks + 1, kNumTasks + 1); | 
|  | for (intptr_t i = 0; i < kNumTasks; ++i) { | 
|  | Dart::thread_pool()->Run<FuzzTask>(kNumRounds, barrier, i + 1); | 
|  | } | 
|  | for (intptr_t i = 0; i < kNumRounds; ++i) { | 
|  | barrier->Sync(); | 
|  | } | 
|  | barrier->Release(); | 
|  | } | 
|  |  | 
|  | }  // namespace dart |