Index: base/message_loop/message_loop.cc |
diff --git a/base/message_loop/message_loop.cc b/base/message_loop/message_loop.cc |
index eb0f968849485ea73ef8a1aab9094bb9527af403..4bb312777324036ce820e5365f81fb4fb50a64fe 100644 |
--- a/base/message_loop/message_loop.cc |
+++ b/base/message_loop/message_loop.cc |
@@ -100,10 +100,25 @@ MessagePumpForIO* ToPumpIO(MessagePump* pump) { |
} |
#endif // !defined(OS_NACL_SFI) |
+MessageLoop::Type GetMessageLoopType(const MessageLoop::Options& options) { |
+ if (options.message_pump_factory.is_null()) |
+ return options.message_loop_type; |
+ return MessageLoop::TYPE_CUSTOM; |
+} |
+ |
} // namespace |
//------------------------------------------------------------------------------ |
+MessageLoop::Options::Options() |
+ : message_loop_type(MessageLoop::TYPE_DEFAULT) { |
+} |
+ |
+MessageLoop::Options::~Options() { |
+} |
+ |
+//------------------------------------------------------------------------------ |
+ |
MessageLoop::TaskObserver::TaskObserver() { |
} |
@@ -115,6 +130,26 @@ MessageLoop::DestructionObserver::~DestructionObserver() { |
//------------------------------------------------------------------------------ |
+MessageLoop::MessageLoop(const Options& options) |
+ : type_(GetMessageLoopType(options)), |
+#if defined(OS_WIN) |
+ pending_high_res_tasks_(0), |
+ in_high_res_mode_(false), |
+#endif |
+ nestable_tasks_allowed_(true), |
+#if defined(OS_WIN) |
+ os_modal_loop_(false), |
+#endif // OS_WIN |
+ message_histogram_(NULL), |
+ run_loop_(NULL), |
+ incoming_task_queue_(options.incoming_task_queue) { |
+ if (!options.message_pump_factory.is_null()) |
+ pump_ = options.message_pump_factory.Run(); |
+ else |
+ pump_ = CreateMessagePumpForType(type_); |
+ Init(); |
+} |
+ |
MessageLoop::MessageLoop(Type type) |
: type_(type), |
#if defined(OS_WIN) |
@@ -128,7 +163,6 @@ MessageLoop::MessageLoop(Type type) |
message_histogram_(NULL), |
run_loop_(NULL) { |
Init(); |
- |
pump_ = CreateMessagePumpForType(type).Pass(); |
} |
@@ -387,7 +421,9 @@ void MessageLoop::Init() { |
DCHECK(!current()) << "should only have one message loop per thread"; |
lazy_tls_ptr.Pointer()->Set(this); |
- incoming_task_queue_ = new internal::IncomingTaskQueue(this); |
+ if (!incoming_task_queue_) |
+ incoming_task_queue_ = new internal::IncomingTaskQueue(); |
+ incoming_task_queue_->StartScheduling(this); |
message_loop_proxy_ = |
new internal::MessageLoopProxyImpl(incoming_task_queue_); |
thread_task_runner_handle_.reset( |
@@ -441,7 +477,7 @@ void MessageLoop::RunTask(const PendingTask& pending_task) { |
FOR_EACH_OBSERVER(TaskObserver, task_observers_, |
WillProcessTask(pending_task)); |
- task_annotator_.RunTask( |
+ task_annotator()->RunTask( |
"MessageLoop::PostTask", "MessageLoop::RunTask", pending_task); |
FOR_EACH_OBSERVER(TaskObserver, task_observers_, |
DidProcessTask(pending_task)); |