1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #ifndef REMOTING_BASE_AUTO_THREAD_H_
6 #define REMOTING_BASE_AUTO_THREAD_H_
10 #include "base/message_loop/message_loop.h"
11 #include "base/threading/platform_thread.h"
12 #include "remoting/base/auto_thread_task_runner.h"
16 // Thread implementation that runs a MessageLoop on a new thread, and manages
17 // the lifetime of the MessageLoop and thread by tracking references to the
18 // thread's TaskRunner. The caller passes the thread's TaskRunner to each
19 // object that needs to run code on the thread, and when no references to the
20 // TaskRunner remain, the thread will exit. When the caller destroys this
21 // object they will be blocked until the thread exits.
22 // All pending tasks queued on the thread's message loop will run to completion
23 // before the thread is terminated.
25 // After the thread is stopped, the destruction sequence is:
27 // (1) Thread::CleanUp()
28 // (2) MessageLoop::~MessageLoop
29 // (3.b) MessageLoop::DestructionObserver::WillDestroyCurrentMessageLoop
30 class AutoThread
: base::PlatformThread::Delegate
{
32 // Create an AutoThread with the specified message-loop |type| and |name|.
33 // The supplied AutoThreadTaskRunner will be used to join and delete the
34 // new thread when no references to it remain.
35 static scoped_refptr
<AutoThreadTaskRunner
> CreateWithType(
37 scoped_refptr
<AutoThreadTaskRunner
> joiner
,
38 base::MessageLoop::Type type
);
39 static scoped_refptr
<AutoThreadTaskRunner
> Create(
41 scoped_refptr
<AutoThreadTaskRunner
> joiner
);
44 // Create an AutoThread initialized for COM. |com_init_type| specifies the
45 // type of COM apartment to initialize.
46 enum ComInitType
{ COM_INIT_NONE
, COM_INIT_STA
, COM_INIT_MTA
};
47 static scoped_refptr
<AutoThreadTaskRunner
> CreateWithLoopAndComInitTypes(
49 scoped_refptr
<AutoThreadTaskRunner
> joiner
,
50 base::MessageLoop::Type loop_type
,
51 ComInitType com_init_type
);
54 // Construct the AutoThread. |name| identifies the thread for debugging.
55 explicit AutoThread(const char* name
);
57 // Waits for the thread to exit, and then destroys it.
58 virtual ~AutoThread();
60 // Starts the thread, running the specified type of MessageLoop. Returns
61 // an AutoThreadTaskRunner through which tasks may be posted to the thread
62 // if successful, or NULL on failure.
64 // Note: This function can't be called on Windows with the loader lock held;
65 // i.e. during a DllMain, global object construction or destruction, atexit()
68 // NOTE: You must not call this MessageLoop's Quit method directly. The
69 // thread will exit when no references to the TaskRunner remain.
70 scoped_refptr
<AutoThreadTaskRunner
> StartWithType(
71 base::MessageLoop::Type type
);
74 // Configures the thread to initialize the specified COM apartment type.
75 // SetComInitType() must be called before Start().
76 void SetComInitType(ComInitType com_init_type
);
80 AutoThread(const char* name
, AutoThreadTaskRunner
* joiner
);
82 void QuitThread(scoped_refptr
<base::SingleThreadTaskRunner
> task_runner
);
83 void JoinAndDeleteThread();
85 // base::PlatformThread::Delegate methods:
86 virtual void ThreadMain() OVERRIDE
;
88 // Used to pass data to ThreadMain.
90 StartupData
* startup_data_
;
93 // Specifies which kind of COM apartment to initialize, if any.
94 ComInitType com_init_type_
;
97 // The thread's handle.
98 base::PlatformThreadHandle thread_
;
100 // The name of the thread. Used for debugging purposes.
103 // Flag used to indicate whether MessageLoop was quit properly.
104 // This allows us to detect premature exit via MessageLoop::Quit().
105 bool was_quit_properly_
;
107 // AutoThreadTaskRunner to post a task to to join & delete this thread.
108 scoped_refptr
<AutoThreadTaskRunner
> joiner_
;
110 DISALLOW_COPY_AND_ASSIGN(AutoThread
);
113 } // namespace remoting
115 #endif // REMOTING_AUTO_THREAD_H_