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