/*
 * Copyright 2018 The Cobalt Authors. All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef STARBOARD_COMMON_THREAD_H_
#define STARBOARD_COMMON_THREAD_H_

#include <functional>
#include <memory>
#include <string>

#include "starboard/common/scoped_ptr.h"
#include "starboard/configuration.h"
#include "starboard/thread.h"
#include "starboard/types.h"

namespace starboard {

class Semaphore;
class atomic_bool;

class Thread {
 public:
  explicit Thread(const std::string& name);
  template <size_t N>
  explicit Thread(char const (&name)[N]) : Thread(std::string(name)) {
    // Common to all user code, limited by Linux pthreads default
    static_assert(N <= 16, "Thread name too long, max 16");
  }
  virtual ~Thread();

  // Subclasses should override the Run method.
  // Example:
  //  void Run() {
  //    while (!WaitForJoin(kWaitTime)) {
  //      ... do work ...
  //    }
  //  }
  virtual void Run() = 0;

  // Called by the main thread, this will cause Run() to be invoked
  // on another thread.
  virtual void Start();
  virtual void Join();
  bool join_called() const;

 protected:
  static void* ThreadEntryPoint(void* context);
  static void Sleep(int64_t microseconds);
  static void SleepMilliseconds(int value);

  // Waits at most |timeout| microseconds for Join() to be called. If
  // Join() was called then return |true|, else |false|.
  bool WaitForJoin(int64_t timeout);
  Semaphore* join_sema();
  atomic_bool* joined_bool();

  struct Data;
  std::unique_ptr<Data> d_;

  Thread(const Thread&) = delete;
  void operator=(const Thread&) = delete;
};

}  // namespace starboard

#endif  // STARBOARD_COMMON_THREAD_H_
