// Copyright 2014 The Chromium 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 MOJO_PUBLIC_CPP_UTILITY_THREAD_H_
#define MOJO_PUBLIC_CPP_UTILITY_THREAD_H_

#ifdef _WIN32
#error "Not implemented: See crbug.com/342893."
#endif

#include <pthread.h>
#include <stddef.h>

#include "mojo/public/cpp/system/macros.h"

namespace mojo {

// This class is thread-friendly, not thread-safe (e.g., you mustn't call
// |Join()| from multiple threads and/or simultaneously try to destroy the
// object).
class Thread {
 public:
  // TODO(vtl): Support non-joinable? priority?
  class Options {
   public:
    Options() : stack_size_(0) {}

    // A stack size of 0 means the default.
    size_t stack_size() const { return stack_size_; }
    void set_stack_size(size_t stack_size) { stack_size_ = stack_size; }

   private:
    size_t stack_size_;

    // Copy and assign allowed.
  };

  // TODO(vtl): Add name or name prefix?
  Thread();
  explicit Thread(const Options& options);
  virtual ~Thread();

  void Start();
  void Join();

  virtual void Run() = 0;

 private:
  static void* ThreadRunTrampoline(void* arg);

  const Options options_;
  pthread_t thread_;
  bool started_;
  bool joined_;

  MOJO_DISALLOW_COPY_AND_ASSIGN(Thread);
};

}  // namespace mojo

#endif  // MOJO_PUBLIC_CPP_UTILITY_THREAD_H_