| // 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_ |