15d24e0b95af51d6d4fc3fc2c20ed54193fbcd4b9lakshmana// Copyright 2016 The Chromium OS Authors. All rights reserved.
25d24e0b95af51d6d4fc3fc2c20ed54193fbcd4b9lakshmana// Use of this source code is governed by a BSD-style license that can be
35d24e0b95af51d6d4fc3fc2c20ed54193fbcd4b9lakshmana// found in the LICENSE file.
45d24e0b95af51d6d4fc3fc2c20ed54193fbcd4b9lakshmana
55d24e0b95af51d6d4fc3fc2c20ed54193fbcd4b9lakshmana#ifndef CHROMIUMOS_WIDE_PROFILING_COMPAT_CROS_DETAIL_THREAD_H_
65d24e0b95af51d6d4fc3fc2c20ed54193fbcd4b9lakshmana#define CHROMIUMOS_WIDE_PROFILING_COMPAT_CROS_DETAIL_THREAD_H_
75d24e0b95af51d6d4fc3fc2c20ed54193fbcd4b9lakshmana
85d24e0b95af51d6d4fc3fc2c20ed54193fbcd4b9lakshmana#include "base/synchronization/waitable_event.h"
95d24e0b95af51d6d4fc3fc2c20ed54193fbcd4b9lakshmana#include "base/threading/simple_thread.h"
105d24e0b95af51d6d4fc3fc2c20ed54193fbcd4b9lakshmana
115d24e0b95af51d6d4fc3fc2c20ed54193fbcd4b9lakshmananamespace quipper {
125d24e0b95af51d6d4fc3fc2c20ed54193fbcd4b9lakshmana
135d24e0b95af51d6d4fc3fc2c20ed54193fbcd4b9lakshmanaclass Thread : public quipper::compat::ThreadInterface,
145d24e0b95af51d6d4fc3fc2c20ed54193fbcd4b9lakshmana               public base::DelegateSimpleThread::Delegate {
155d24e0b95af51d6d4fc3fc2c20ed54193fbcd4b9lakshmana public:
165d24e0b95af51d6d4fc3fc2c20ed54193fbcd4b9lakshmana  explicit Thread(const string& name_prefix) : thread_(this, name_prefix) {}
175d24e0b95af51d6d4fc3fc2c20ed54193fbcd4b9lakshmana
183fa0a5f4b88119fac65f86971738ea0202797b6elakshmana  void Start() override { thread_.Start(); }
195d24e0b95af51d6d4fc3fc2c20ed54193fbcd4b9lakshmana
203fa0a5f4b88119fac65f86971738ea0202797b6elakshmana  void Join() override { thread_.Join(); }
215d24e0b95af51d6d4fc3fc2c20ed54193fbcd4b9lakshmana
223fa0a5f4b88119fac65f86971738ea0202797b6elakshmana  pid_t tid() override { return thread_.tid(); }
235d24e0b95af51d6d4fc3fc2c20ed54193fbcd4b9lakshmana
245d24e0b95af51d6d4fc3fc2c20ed54193fbcd4b9lakshmana protected:
255d24e0b95af51d6d4fc3fc2c20ed54193fbcd4b9lakshmana  void Run() override = 0;
265d24e0b95af51d6d4fc3fc2c20ed54193fbcd4b9lakshmana
275d24e0b95af51d6d4fc3fc2c20ed54193fbcd4b9lakshmana private:
285d24e0b95af51d6d4fc3fc2c20ed54193fbcd4b9lakshmana  base::DelegateSimpleThread thread_;
295d24e0b95af51d6d4fc3fc2c20ed54193fbcd4b9lakshmana};
305d24e0b95af51d6d4fc3fc2c20ed54193fbcd4b9lakshmana
315d24e0b95af51d6d4fc3fc2c20ed54193fbcd4b9lakshmanaclass Notification : public quipper::compat::NotificationInterface {
325d24e0b95af51d6d4fc3fc2c20ed54193fbcd4b9lakshmana public:
333fa0a5f4b88119fac65f86971738ea0202797b6elakshmana  Notification()
343fa0a5f4b88119fac65f86971738ea0202797b6elakshmana      : event_(true /* manual_reset */, false /* initially_signaled */) {}
355d24e0b95af51d6d4fc3fc2c20ed54193fbcd4b9lakshmana
363fa0a5f4b88119fac65f86971738ea0202797b6elakshmana  void Wait() override { event_.Wait(); }
375d24e0b95af51d6d4fc3fc2c20ed54193fbcd4b9lakshmana
385d24e0b95af51d6d4fc3fc2c20ed54193fbcd4b9lakshmana  bool WaitWithTimeout(int timeout_ms) override {
395d24e0b95af51d6d4fc3fc2c20ed54193fbcd4b9lakshmana    return event_.TimedWait(base::TimeDelta::FromMilliseconds(timeout_ms));
405d24e0b95af51d6d4fc3fc2c20ed54193fbcd4b9lakshmana  }
415d24e0b95af51d6d4fc3fc2c20ed54193fbcd4b9lakshmana
423fa0a5f4b88119fac65f86971738ea0202797b6elakshmana  void Notify() override { event_.Signal(); }
435d24e0b95af51d6d4fc3fc2c20ed54193fbcd4b9lakshmana
445d24e0b95af51d6d4fc3fc2c20ed54193fbcd4b9lakshmana private:
455d24e0b95af51d6d4fc3fc2c20ed54193fbcd4b9lakshmana  base::WaitableEvent event_;
465d24e0b95af51d6d4fc3fc2c20ed54193fbcd4b9lakshmana};
475d24e0b95af51d6d4fc3fc2c20ed54193fbcd4b9lakshmana
485d24e0b95af51d6d4fc3fc2c20ed54193fbcd4b9lakshmana}  // namespace quipper
495d24e0b95af51d6d4fc3fc2c20ed54193fbcd4b9lakshmana
505d24e0b95af51d6d4fc3fc2c20ed54193fbcd4b9lakshmana#endif  // CHROMIUMOS_WIDE_PROFILING_COMPAT_CROS_DETAIL_THREAD_H_
51