// 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_->Exit();
  }

 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;

  Monitor* monitor = new Monitor();
  Monitor* monitor_done = new Monitor();
  {
    ThreadBarrier barrier(kNumTasks + 1, monitor, monitor_done);
    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.Exit();
  }

  delete monitor_done;
  delete monitor;
}

}  // namespace dart
