Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef BASE_MESSAGE_LOOP_MESSAGE_LOOP_H_ | 5 #ifndef BASE_MESSAGE_LOOP_MESSAGE_LOOP_H_ |
| 6 #define BASE_MESSAGE_LOOP_MESSAGE_LOOP_H_ | 6 #define BASE_MESSAGE_LOOP_MESSAGE_LOOP_H_ |
| 7 | 7 |
| 8 #include <queue> | 8 #include <queue> |
| 9 #include <string> | 9 #include <string> |
| 10 | 10 |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 102 enum Type { | 102 enum Type { |
| 103 TYPE_DEFAULT, | 103 TYPE_DEFAULT, |
| 104 TYPE_UI, | 104 TYPE_UI, |
| 105 TYPE_CUSTOM, | 105 TYPE_CUSTOM, |
| 106 TYPE_IO, | 106 TYPE_IO, |
| 107 #if defined(OS_ANDROID) | 107 #if defined(OS_ANDROID) |
| 108 TYPE_JAVA, | 108 TYPE_JAVA, |
| 109 #endif // defined(OS_ANDROID) | 109 #endif // defined(OS_ANDROID) |
| 110 }; | 110 }; |
| 111 | 111 |
| 112 // Init options. | |
| 113 struct BASE_EXPORT InitOptions { | |
| 114 using MessagePumpFactory = Callback<scoped_ptr<MessagePump>()>; | |
|
danakj
2015/04/24 20:54:39
nit: no () for the type name
kinuko
2015/04/27 16:36:04
It's for Callback typedef, it seems we need it.
| |
| 115 InitOptions(); | |
| 116 ~InitOptions(); | |
| 117 | |
| 118 // Specify the type of message loop. | |
|
danakj
2015/04/24 20:54:39
Comments for "why" not for "what", this doesn't sa
| |
| 119 // This is ignored if message_pump_factory.is_null() is false. | |
|
danakj
2015/04/24 20:54:39
"This is only used if message_pump_factory is null
| |
| 120 MessageLoop::Type message_loop_type; | |
| 121 | |
| 122 // Specify timer slack for the message loop. | |
|
danakj
2015/04/24 20:54:39
Can you say what timer slack is, instead of just r
| |
| 123 TimerSlack timer_slack; | |
| 124 | |
| 125 // Used to create the MessagePump for the MessageLoop. | |
| 126 // If message_pump_factory.is_null() is true, then a MessagePump appropriate | |
|
danakj
2015/04/24 20:54:39
If message_pump_factory is null, then
| |
| 127 // for |message_loop_type| is created. Setting this forces the | |
| 128 // MessageLoop::Type to TYPE_CUSTOM. | |
| 129 MessagePumpFactory message_pump_factory; | |
| 130 }; | |
| 131 | |
| 132 // Creates a MessageLoop with |options|. It is valid to create a new | |
| 133 // message loop on a different thread from the final 'current' thread, | |
|
Nico
2015/04/24 21:31:16
This sounds confusing to me. Maybe
"It is valid t
kinuko
2015/04/27 16:36:04
Done.
| |
| 134 // and then pass it to the final thread where the message loop actually | |
| 135 // runs. The caller must call Init method on the final 'current' | |
| 136 // thread before calling Run to start running tasks on the message loop. | |
| 137 // | |
| 112 // Normally, it is not necessary to instantiate a MessageLoop. Instead, it | 138 // Normally, it is not necessary to instantiate a MessageLoop. Instead, it |
| 113 // is typical to make use of the current thread's MessageLoop instance. | 139 // is typical to make use of the current thread's MessageLoop instance. |
| 140 explicit MessageLoop(const InitOptions& options); | |
|
danakj
2015/04/24 20:54:39
I'm a little surprised to see us using a struct he
kinuko
2015/04/27 16:36:04
I wanted to keep them together and wanted to make
| |
| 141 | |
| 142 // Creates a MessageLoop of |type| for the current thread. Usually this | |
| 143 // constructor is used only for testing. No need to call Init if the | |
|
danakj
2015/04/24 20:54:39
Do we need to keep these test-only constructors? O
kinuko
2015/04/27 16:36:05
We need these for now, while I agree that having t
danakj
2015/04/27 16:46:40
Can you leave TODOs (pointing to a bug) for things
| |
| 144 // message loop is constructed this way. | |
| 114 explicit MessageLoop(Type type = TYPE_DEFAULT); | 145 explicit MessageLoop(Type type = TYPE_DEFAULT); |
| 115 // Creates a TYPE_CUSTOM MessageLoop with the supplied MessagePump, which must | 146 // Creates a TYPE_CUSTOM MessageLoop for the current thread with the |
| 116 // be non-NULL. | 147 // supplied MessagePump, which must be non-NULL. Usually used only for |
| 117 explicit MessageLoop(scoped_ptr<base::MessagePump> pump); | 148 // testing. No need to call Init if the message loop is constructed this way. |
| 149 explicit MessageLoop(scoped_ptr<MessagePump> pump); | |
| 118 ~MessageLoop() override; | 150 ~MessageLoop() override; |
| 119 | 151 |
| 120 // Returns the MessageLoop object for the current thread, or null if none. | 152 // Returns the MessageLoop object for the current thread, or null if none. |
| 121 static MessageLoop* current(); | 153 static MessageLoop* current(); |
| 122 | 154 |
| 123 static void EnableHistogrammer(bool enable_histogrammer); | 155 static void EnableHistogrammer(bool enable_histogrammer); |
| 124 | 156 |
| 125 typedef scoped_ptr<MessagePump> (MessagePumpFactory)(); | 157 typedef scoped_ptr<MessagePump> (MessagePumpFactory)(); |
| 126 // Uses the given base::MessagePumpForUIFactory to override the default | 158 // Uses the given base::MessagePumpForUIFactory to override the default |
| 127 // MessagePump implementation for 'TYPE_UI'. Returns true if the factory | 159 // MessagePump implementation for 'TYPE_UI'. Returns true if the factory |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 140 // not be run. Instead, they will be deleted. | 172 // not be run. Instead, they will be deleted. |
| 141 // | 173 // |
| 142 class BASE_EXPORT DestructionObserver { | 174 class BASE_EXPORT DestructionObserver { |
| 143 public: | 175 public: |
| 144 virtual void WillDestroyCurrentMessageLoop() = 0; | 176 virtual void WillDestroyCurrentMessageLoop() = 0; |
| 145 | 177 |
| 146 protected: | 178 protected: |
| 147 virtual ~DestructionObserver(); | 179 virtual ~DestructionObserver(); |
| 148 }; | 180 }; |
| 149 | 181 |
| 182 // Configure various members and bind this message loop to the current thread. | |
| 183 void Init(); | |
|
danakj
2015/04/24 20:54:40
BindToCurrentThread() ?
kinuko
2015/04/27 16:36:04
Done.
| |
| 184 | |
| 150 // Add a DestructionObserver, which will start receiving notifications | 185 // Add a DestructionObserver, which will start receiving notifications |
| 151 // immediately. | 186 // immediately. |
| 152 void AddDestructionObserver(DestructionObserver* destruction_observer); | 187 void AddDestructionObserver(DestructionObserver* destruction_observer); |
| 153 | 188 |
| 154 // Remove a DestructionObserver. It is safe to call this method while a | 189 // Remove a DestructionObserver. It is safe to call this method while a |
| 155 // DestructionObserver is receiving a notification callback. | 190 // DestructionObserver is receiving a notification callback. |
| 156 void RemoveDestructionObserver(DestructionObserver* destruction_observer); | 191 void RemoveDestructionObserver(DestructionObserver* destruction_observer); |
| 157 | 192 |
| 158 // NOTE: Deprecated; prefer task_runner() and the TaskRunner interfaces. | 193 // NOTE: Deprecated; prefer task_runner() and the TaskRunner interfaces. |
| 159 // TODO(skyostil): Remove these functions (crbug.com/465354). | 194 // TODO(skyostil): Remove these functions (crbug.com/465354). |
| (...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 387 // Can only be called from the thread that owns the MessageLoop. | 422 // Can only be called from the thread that owns the MessageLoop. |
| 388 bool is_running() const; | 423 bool is_running() const; |
| 389 | 424 |
| 390 // Returns true if the message loop has high resolution timers enabled. | 425 // Returns true if the message loop has high resolution timers enabled. |
| 391 // Provided for testing. | 426 // Provided for testing. |
| 392 bool HasHighResolutionTasks(); | 427 bool HasHighResolutionTasks(); |
| 393 | 428 |
| 394 // Returns true if the message loop is "idle". Provided for testing. | 429 // Returns true if the message loop is "idle". Provided for testing. |
| 395 bool IsIdleForTesting(); | 430 bool IsIdleForTesting(); |
| 396 | 431 |
| 397 // Wakes up the message pump. Can be called on any thread. The caller is | |
| 398 // responsible for synchronizing ScheduleWork() calls. | |
| 399 void ScheduleWork(); | |
| 400 | |
| 401 // Returns the TaskAnnotator which is used to add debug information to posted | 432 // Returns the TaskAnnotator which is used to add debug information to posted |
| 402 // tasks. | 433 // tasks. |
| 403 debug::TaskAnnotator* task_annotator() { return &task_annotator_; } | 434 debug::TaskAnnotator* task_annotator() { return &task_annotator_; } |
| 404 | 435 |
| 405 // Runs the specified PendingTask. | 436 // Runs the specified PendingTask. |
| 406 void RunTask(const PendingTask& pending_task); | 437 void RunTask(const PendingTask& pending_task); |
| 407 | 438 |
| 408 //---------------------------------------------------------------------------- | 439 //---------------------------------------------------------------------------- |
| 409 protected: | 440 protected: |
| 410 scoped_ptr<MessagePump> pump_; | 441 scoped_ptr<MessagePump> pump_; |
| 411 | 442 |
| 412 private: | 443 private: |
| 413 friend class RunLoop; | 444 friend class RunLoop; |
| 445 friend class internal::IncomingTaskQueue; | |
| 446 friend class ScheduleWorkTest; | |
| 414 | 447 |
| 415 // Configures various members for the two constructors. | 448 // Wakes up the message pump. Can be called on any thread. The caller is |
| 416 void Init(); | 449 // responsible for synchronizing ScheduleWork() calls. |
| 450 void ScheduleWork(); | |
| 417 | 451 |
| 418 // Invokes the actual run loop using the message pump. | 452 // Invokes the actual run loop using the message pump. |
| 419 void RunHandler(); | 453 void RunHandler(); |
| 420 | 454 |
| 421 // Called to process any delayed non-nestable tasks. | 455 // Called to process any delayed non-nestable tasks. |
| 422 bool ProcessNextDelayedNonNestableTask(); | 456 bool ProcessNextDelayedNonNestableTask(); |
| 423 | 457 |
| 424 // Calls RunTask or queues the pending_task on the deferred task list if it | 458 // Calls RunTask or queues the pending_task on the deferred task list if it |
| 425 // cannot be run right now. Returns true if the task was run. | 459 // cannot be run right now. Returns true if the task was run. |
| 426 bool DeferOrRunPendingTask(const PendingTask& pending_task); | 460 bool DeferOrRunPendingTask(const PendingTask& pending_task); |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 483 // A recursion block that prevents accidentally running additional tasks when | 517 // A recursion block that prevents accidentally running additional tasks when |
| 484 // insider a (accidentally induced?) nested message pump. | 518 // insider a (accidentally induced?) nested message pump. |
| 485 bool nestable_tasks_allowed_; | 519 bool nestable_tasks_allowed_; |
| 486 | 520 |
| 487 #if defined(OS_WIN) | 521 #if defined(OS_WIN) |
| 488 // Should be set to true before calling Windows APIs like TrackPopupMenu, etc | 522 // Should be set to true before calling Windows APIs like TrackPopupMenu, etc |
| 489 // which enter a modal message loop. | 523 // which enter a modal message loop. |
| 490 bool os_modal_loop_; | 524 bool os_modal_loop_; |
| 491 #endif | 525 #endif |
| 492 | 526 |
| 527 scoped_ptr<InitOptions> init_options_; | |
|
danakj
2015/04/24 20:54:39
why scoped_ptr and not just a member? i'd prefer a
kinuko
2015/04/27 16:36:04
Removed this field.
| |
| 528 | |
| 493 std::string thread_name_; | 529 std::string thread_name_; |
| 494 // A profiling histogram showing the counts of various messages and events. | 530 // A profiling histogram showing the counts of various messages and events. |
| 495 HistogramBase* message_histogram_; | 531 HistogramBase* message_histogram_; |
| 496 | 532 |
| 497 RunLoop* run_loop_; | 533 RunLoop* run_loop_; |
| 498 | 534 |
| 499 ObserverList<TaskObserver> task_observers_; | 535 ObserverList<TaskObserver> task_observers_; |
| 500 | 536 |
| 501 debug::TaskAnnotator task_annotator_; | 537 debug::TaskAnnotator task_annotator_; |
| 502 | 538 |
| (...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 654 | 690 |
| 655 // Do not add any member variables to MessageLoopForIO! This is important b/c | 691 // Do not add any member variables to MessageLoopForIO! This is important b/c |
| 656 // MessageLoopForIO is often allocated via MessageLoop(TYPE_IO). Any extra | 692 // MessageLoopForIO is often allocated via MessageLoop(TYPE_IO). Any extra |
| 657 // data that you need should be stored on the MessageLoop's pump_ instance. | 693 // data that you need should be stored on the MessageLoop's pump_ instance. |
| 658 COMPILE_ASSERT(sizeof(MessageLoop) == sizeof(MessageLoopForIO), | 694 COMPILE_ASSERT(sizeof(MessageLoop) == sizeof(MessageLoopForIO), |
| 659 MessageLoopForIO_should_not_have_extra_member_variables); | 695 MessageLoopForIO_should_not_have_extra_member_variables); |
| 660 | 696 |
| 661 } // namespace base | 697 } // namespace base |
| 662 | 698 |
| 663 #endif // BASE_MESSAGE_LOOP_MESSAGE_LOOP_H_ | 699 #endif // BASE_MESSAGE_LOOP_MESSAGE_LOOP_H_ |
| OLD | NEW |