thread.h revision 116680a4aac90f2aa7413d9095a592090648e557
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef BASE_THREADING_THREAD_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define BASE_THREADING_THREAD_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/base_export.h" 11f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/callback.h" 12f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/memory/scoped_ptr.h" 13ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/message_loop/message_loop.h" 14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/message_loop/message_loop_proxy.h" 15116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/message_loop/timer_slack.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/platform_thread.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base { 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class MessagePump; 21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A simple thread abstraction that establishes a MessageLoop on a new thread. 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The consumer uses the MessageLoop of the thread to cause code to execute on 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the thread. When this object is destroyed the thread is terminated. All 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// pending tasks queued on the thread's message loop will run to completion 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// before the thread is terminated. 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WARNING! SUBCLASSES MUST CALL Stop() IN THEIR DESTRUCTORS! See ~Thread(). 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// After the thread is stopped, the destruction sequence is: 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// (1) Thread::CleanUp() 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// (2) MessageLoop::~MessageLoop 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// (3.b) MessageLoop::DestructionObserver::WillDestroyCurrentMessageLoop 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BASE_EXPORT Thread : PlatformThread::Delegate { 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) struct BASE_EXPORT Options { 38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) typedef Callback<scoped_ptr<MessagePump>()> MessagePumpFactory; 39f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 40f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Options(); 41f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Options(MessageLoop::Type type, size_t size); 42f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ~Options(); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Specifies the type of message loop that will be allocated on the thread. 45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // This is ignored if message_pump_factory.is_null() is false. 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MessageLoop::Type message_loop_type; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Specify timer slack for thread message loop. 49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch TimerSlack timer_slack; 50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 51f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Used to create the MessagePump for the MessageLoop. The callback is Run() 52f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // on the thread. If message_pump_factory.is_null(), then a MessagePump 53f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // appropriate for |message_loop_type| is created. Setting this forces the 54f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // MessageLoop::Type to TYPE_CUSTOM. 55f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) MessagePumpFactory message_pump_factory; 56f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Specifies the maximum stack size that the thread is allowed to use. 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This does not necessarily correspond to the thread's initial stack size. 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A value of 0 indicates that the default maximum should be used. 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t stack_size; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Constructor. 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // name is a display string to identify the thread. 650529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch explicit Thread(const std::string& name); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Destroys the thread, stopping it if necessary. 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NOTE: ALL SUBCLASSES OF Thread MUST CALL Stop() IN THEIR DESTRUCTORS (or 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // guarantee Stop() is explicitly called before the subclass is destroyed). 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This is required to avoid a data race between the destructor modifying the 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // vtable, and the thread's ThreadMain calling the virtual method Run(). It 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // also ensures that the CleanUp() virtual method is called on the subclass 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // before it is destructed. 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~Thread(); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Causes the thread to initialize COM. This must be called before calling 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Start() or StartWithOptions(). If |use_mta| is false, the thread is also 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // started with a TYPE_UI message loop. It is an error to call 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // init_com_with_mta(false) and then StartWithOptions() with any message loop 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // type other than TYPE_UI. 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void init_com_with_mta(bool use_mta) { 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!started_); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) com_status_ = use_mta ? MTA : STA; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Starts the thread. Returns true if the thread was successfully started; 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // otherwise, returns false. Upon successful return, the message_loop() 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // getter will return non-null. 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note: This function can't be called on Windows with the loader lock held; 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // i.e. during a DllMain, global object construction or destruction, atexit() 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // callback. 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool Start(); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Starts the thread. Behaves exactly like Start in addition to allow to 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // override the default options. 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note: This function can't be called on Windows with the loader lock held; 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // i.e. during a DllMain, global object construction or destruction, atexit() 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // callback. 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool StartWithOptions(const Options& options); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Signals the thread to exit and returns once the thread has exited. After 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // this method returns, the Thread object is completely reset and may be used 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // as if it were newly constructed (i.e., Start may be called again). 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Stop may be called multiple times and is simply ignored if the thread is 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // already stopped. 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NOTE: If you are a consumer of Thread, it is not necessary to call this 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // before deleting your Thread objects, as the destructor will do it. 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // IF YOU ARE A SUBCLASS OF Thread, YOU MUST CALL THIS IN YOUR DESTRUCTOR. 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Stop(); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Signals the thread to exit in the near future. 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // WARNING: This function is not meant to be commonly used. Use at your own 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // risk. Calling this function will cause message_loop() to become invalid in 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the near future. This function was created to workaround a specific 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // deadlock on Windows with printer worker thread. In any other case, Stop() 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // should be used. 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // StopSoon should not be called multiple times as it is risky to do so. It 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // could cause a timing issue in message_loop() access. Call Stop() to reset 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the thread object once it is known that the thread has quit. 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void StopSoon(); 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the message loop for this thread. Use the MessageLoop's 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // PostTask methods to execute code on the thread. This only returns 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // non-null after a successful call to Start. After Stop has been called, 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // this will return NULL. 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NOTE: You must not call this MessageLoop's Quit method directly. Use 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the Thread's Stop method instead. 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MessageLoop* message_loop() const { return message_loop_; } 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 141116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Returns a MessageLoopProxy for this thread. Use the MessageLoopProxy's 142116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // PostTask methods to execute code on the thread. Returns NULL if the thread 143116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // is not running (e.g. before Start or after Stop have been called). Callers 144116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // can hold on to this even after the thread is gone; in this situation, 145116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // attempts to PostTask() will fail. 146116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // 147116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Note: This method is deprecated. Callers should call task_runner() instead 148116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // and use the TaskRunner interfaces for safely interfacing with the Thread. 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<MessageLoopProxy> message_loop_proxy() const { 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return message_loop_ ? message_loop_->message_loop_proxy() : NULL; 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 153116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Returns a TaskRunner for this thread. Use the TaskRunner's PostTask 154116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // methods to execute code on the thread. Returns NULL if the thread is not 155116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // running (e.g. before Start or after Stop have been called). Callers can 156116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // hold on to this even after the thread is gone; in this situation, attempts 157116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // to PostTask() will fail. 158116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_refptr<SingleThreadTaskRunner> task_runner() const { 159116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return message_loop_proxy(); 160116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 161116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the name of this thread (for display in debugger too). 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& thread_name() const { return name_; } 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The native thread handle. 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PlatformThreadHandle thread_handle() { return thread_; } 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The thread ID. 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PlatformThreadId thread_id() const { return thread_id_; } 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true if the thread has been started, and not yet stopped. 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool IsRunning() const; 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Sets the thread priority. The thread must already be started. 17590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) void SetPriority(ThreadPriority priority); 17690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called just prior to starting the message loop 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Init() {} 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called to start the message loop 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Run(MessageLoop* message_loop); 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called just after the message loop ends 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void CleanUp() {} 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void SetThreadWasQuitProperly(bool flag); 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool GetThreadWasQuitProperly(); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_message_loop(MessageLoop* message_loop) { 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop_ = message_loop; 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum ComStatus { 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NONE, 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) STA, 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MTA, 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // PlatformThread::Delegate methods: 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ThreadMain() OVERRIDE; 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Whether this thread needs to initialize COM, and if so, in what mode. 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ComStatus com_status_; 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Whether we successfully started the thread. 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool started_; 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If true, we're in the middle of stopping, and shouldn't access 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |message_loop_|. It may non-NULL and invalid. 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool stopping_; 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // True while inside of Run(). 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool running_; 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Used to pass data to ThreadMain. 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct StartupData; 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StartupData* startup_data_; 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The thread's handle. 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PlatformThreadHandle thread_; 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The thread's message loop. Valid only while the thread is alive. Set 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // by the created thread. 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MessageLoop* message_loop_; 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Our thread's ID. 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PlatformThreadId thread_id_; 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The name of the thread. Used for debugging purposes. 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string name_; 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend void ThreadQuitHelper(); 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(Thread); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace base 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // BASE_THREADING_THREAD_H_ 246