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