// Copyright 2015 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CHROMIUMOS_WIDE_PROFILING_COMPAT_THREAD_H_
#define CHROMIUMOS_WIDE_PROFILING_COMPAT_THREAD_H_

namespace quipper {
namespace compat {

// The Thread implementation used by quipper implements this interface.
class ThreadInterface {
 public:
  // Constructor signature should match this:
  // Thread(const string& name_prefix);

  virtual ~ThreadInterface() {}

  // Start the thread.
  virtual void Start() = 0;
  // quipper threads must be joined exactly once.
  virtual void Join() = 0;

  virtual pid_t tid() = 0;

 protected:
  // Thread body. Override this.
  virtual void Run() = 0;
};

// Synchronization tool that blocks waiting threads until notified to proceed by
// another.
class NotificationInterface {
 public:
  // Constructor signature should match this:
  // Notification();

  virtual ~NotificationInterface() {}

  // Wait for Notify() to be called.
  virtual void Wait() = 0;
  // Wait for up to |timeout_ms| for a notification. Returns true if the
  // event was signaled. Returning false does not necessarily mean |timout_ms|
  // has passed.
  virtual bool WaitWithTimeout(int timeout_ms) = 0;

  // Trigger the notification, and wake up any waiting threads.
  virtual void Notify() = 0;
};

}  // namespace compat
}  // namespace quipper

#include "detail/thread.h"

#endif  // CHROMIUMOS_WIDE_PROFILING_COMPAT_THREAD_H_