| // 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 |