15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// found in the LICENSE file.
45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#ifndef MOJO_PUBLIC_CPP_UTILITY_THREAD_H_
6effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#define MOJO_PUBLIC_CPP_UTILITY_THREAD_H_
75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#ifdef _WIN32
95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#error "Not implemented: See crbug.com/342893."
105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif
115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <pthread.h>
135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <stddef.h>
145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
15effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "mojo/public/cpp/system/macros.h"
165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace mojo {
185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// This class is thread-friendly, not thread-safe (e.g., you mustn't call
205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// |Join()| from multiple threads and/or simultaneously try to destroy the
215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// object).
225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class Thread {
235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public:
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // TODO(vtl): Support non-joinable? priority?
255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  class Options {
265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   public:
275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    Options() : stack_size_(0) {}
285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // A stack size of 0 means the default.
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    size_t stack_size() const { return stack_size_; }
315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    void set_stack_size(size_t stack_size) { stack_size_ = stack_size; }
325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   private:
345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    size_t stack_size_;
355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Copy and assign allowed.
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  };
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // TODO(vtl): Add name or name prefix?
405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Thread();
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  explicit Thread(const Options& options);
425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual ~Thread();
435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void Start();
455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void Join();
465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void Run() = 0;
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private:
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  static void* ThreadRunTrampoline(void* arg);
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const Options options_;
535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  pthread_t thread_;
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool started_;
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool joined_;
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  MOJO_DISALLOW_COPY_AND_ASSIGN(Thread);
585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}  // namespace mojo
615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
62effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#endif  // MOJO_PUBLIC_CPP_UTILITY_THREAD_H_
63