Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(260)

Side by Side Diff: base/message_loop/message_loop.h

Issue 17078005: Move message_pump to base/message_loop. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « base/mac/scoped_sending_event.h ('k') | base/message_loop/message_loop.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
11 #include "base/base_export.h" 11 #include "base/base_export.h"
12 #include "base/basictypes.h" 12 #include "base/basictypes.h"
13 #include "base/callback_forward.h" 13 #include "base/callback_forward.h"
14 #include "base/location.h" 14 #include "base/location.h"
15 #include "base/memory/ref_counted.h" 15 #include "base/memory/ref_counted.h"
16 #include "base/message_loop/message_loop_proxy.h" 16 #include "base/message_loop/message_loop_proxy.h"
17 #include "base/message_pump.h" 17 #include "base/message_loop/message_pump.h"
18 #include "base/observer_list.h" 18 #include "base/observer_list.h"
19 #include "base/pending_task.h" 19 #include "base/pending_task.h"
20 #include "base/sequenced_task_runner_helpers.h" 20 #include "base/sequenced_task_runner_helpers.h"
21 #include "base/synchronization/lock.h" 21 #include "base/synchronization/lock.h"
22 #include "base/tracking_info.h" 22 #include "base/tracking_info.h"
23 #include "base/time.h" 23 #include "base/time.h"
24 24
25 #if defined(OS_WIN) 25 #if defined(OS_WIN)
26 // We need this to declare base::MessagePumpWin::Dispatcher, which we should 26 // We need this to declare base::MessagePumpWin::Dispatcher, which we should
27 // really just eliminate. 27 // really just eliminate.
28 #include "base/message_pump_win.h" 28 #include "base/message_loop/message_pump_win.h"
29 #elif defined(OS_IOS) 29 #elif defined(OS_IOS)
30 #include "base/message_pump_io_ios.h" 30 #include "base/message_loop/message_pump_io_ios.h"
31 #elif defined(OS_POSIX) 31 #elif defined(OS_POSIX)
32 #include "base/message_pump_libevent.h" 32 #include "base/message_loop/message_pump_libevent.h"
33 #if !defined(OS_MACOSX) && !defined(OS_ANDROID) 33 #if !defined(OS_MACOSX) && !defined(OS_ANDROID)
34 34
35 #if defined(USE_AURA) && defined(USE_X11) && !defined(OS_NACL) 35 #if defined(USE_AURA) && defined(USE_X11) && !defined(OS_NACL)
36 #include "base/message_pump_aurax11.h" 36 #include "base/message_loop/message_pump_aurax11.h"
37 #elif defined(USE_OZONE) && !defined(OS_NACL) 37 #elif defined(USE_OZONE) && !defined(OS_NACL)
38 #include "base/message_pump_ozone.h" 38 #include "base/message_loop/message_pump_ozone.h"
39 #else 39 #else
40 #include "base/message_pump_gtk.h" 40 #include "base/message_loop/message_pump_gtk.h"
41 #endif 41 #endif
42 42
43 #endif 43 #endif
44 #endif 44 #endif
45 45
46 namespace base { 46 namespace base {
47
47 class HistogramBase; 48 class HistogramBase;
48 class MessageLoopLockTest; 49 class MessageLoopLockTest;
49 class RunLoop; 50 class RunLoop;
50 class ThreadTaskRunnerHandle; 51 class ThreadTaskRunnerHandle;
51 #if defined(OS_ANDROID) 52 #if defined(OS_ANDROID)
52 class MessagePumpForUI; 53 class MessagePumpForUI;
53 #endif 54 #endif
54 55
55 // A MessageLoop is used to process events for a particular thread. There is 56 // A MessageLoop is used to process events for a particular thread. There is
56 // at most one MessageLoop instance per thread. 57 // at most one MessageLoop instance per thread.
(...skipping 19 matching lines...) Expand all
76 // HRESULT hr; 77 // HRESULT hr;
77 // { 78 // {
78 // MessageLoop::ScopedNestableTaskAllower allow(MessageLoop::current()); 79 // MessageLoop::ScopedNestableTaskAllower allow(MessageLoop::current());
79 // hr = DoDragDrop(...); // Implicitly runs a modal message loop. 80 // hr = DoDragDrop(...); // Implicitly runs a modal message loop.
80 // } 81 // }
81 // // Process |hr| (the result returned by DoDragDrop()). 82 // // Process |hr| (the result returned by DoDragDrop()).
82 // 83 //
83 // Please be SURE your task is reentrant (nestable) and all global variables 84 // Please be SURE your task is reentrant (nestable) and all global variables
84 // are stable and accessible before calling SetNestableTasksAllowed(true). 85 // are stable and accessible before calling SetNestableTasksAllowed(true).
85 // 86 //
86 class BASE_EXPORT MessageLoop : public base::MessagePump::Delegate { 87 class BASE_EXPORT MessageLoop : public MessagePump::Delegate {
87 public: 88 public:
88 89
89 #if !defined(OS_MACOSX) && !defined(OS_ANDROID) 90 #if !defined(OS_MACOSX) && !defined(OS_ANDROID)
90 typedef base::MessagePumpDispatcher Dispatcher; 91 typedef MessagePumpDispatcher Dispatcher;
91 typedef base::MessagePumpObserver Observer; 92 typedef MessagePumpObserver Observer;
92 #endif 93 #endif
93 94
94 // A MessageLoop has a particular type, which indicates the set of 95 // A MessageLoop has a particular type, which indicates the set of
95 // asynchronous events it may process in addition to tasks and timers. 96 // asynchronous events it may process in addition to tasks and timers.
96 // 97 //
97 // TYPE_DEFAULT 98 // TYPE_DEFAULT
98 // This type of ML only supports tasks and timers. 99 // This type of ML only supports tasks and timers.
99 // 100 //
100 // TYPE_UI 101 // TYPE_UI
101 // This type of ML also supports native UI events (e.g., Windows messages). 102 // This type of ML also supports native UI events (e.g., Windows messages).
(...skipping 12 matching lines...) Expand all
114 // Normally, it is not necessary to instantiate a MessageLoop. Instead, it 115 // Normally, it is not necessary to instantiate a MessageLoop. Instead, it
115 // is typical to make use of the current thread's MessageLoop instance. 116 // is typical to make use of the current thread's MessageLoop instance.
116 explicit MessageLoop(Type type = TYPE_DEFAULT); 117 explicit MessageLoop(Type type = TYPE_DEFAULT);
117 virtual ~MessageLoop(); 118 virtual ~MessageLoop();
118 119
119 // Returns the MessageLoop object for the current thread, or null if none. 120 // Returns the MessageLoop object for the current thread, or null if none.
120 static MessageLoop* current(); 121 static MessageLoop* current();
121 122
122 static void EnableHistogrammer(bool enable_histogrammer); 123 static void EnableHistogrammer(bool enable_histogrammer);
123 124
124 typedef base::MessagePump* (MessagePumpFactory)(); 125 typedef MessagePump* (MessagePumpFactory)();
125 // Uses the given base::MessagePumpForUIFactory to override the default 126 // Uses the given base::MessagePumpForUIFactory to override the default
126 // MessagePump implementation for 'TYPE_UI'. Returns true if the factory 127 // MessagePump implementation for 'TYPE_UI'. Returns true if the factory
127 // was successfully registered. 128 // was successfully registered.
128 static bool InitMessagePumpForUIFactory(MessagePumpFactory* factory); 129 static bool InitMessagePumpForUIFactory(MessagePumpFactory* factory);
129 130
130 // A DestructionObserver is notified when the current MessageLoop is being 131 // A DestructionObserver is notified when the current MessageLoop is being
131 // destroyed. These observers are notified prior to MessageLoop::current() 132 // destroyed. These observers are notified prior to MessageLoop::current()
132 // being changed to return NULL. This gives interested parties the chance to 133 // being changed to return NULL. This gives interested parties the chance to
133 // do final cleanup that depends on the MessageLoop. 134 // do final cleanup that depends on the MessageLoop.
134 // 135 //
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
167 // 168 //
168 // PostTask(from_here, task) is equivalent to 169 // PostTask(from_here, task) is equivalent to
169 // PostDelayedTask(from_here, task, 0). 170 // PostDelayedTask(from_here, task, 0).
170 // 171 //
171 // The TryPostTask is meant for the cases where the calling thread cannot 172 // The TryPostTask is meant for the cases where the calling thread cannot
172 // block. If posting the task will block, the call returns false, the task 173 // block. If posting the task will block, the call returns false, the task
173 // is not posted but the task is consumed anyways. 174 // is not posted but the task is consumed anyways.
174 // 175 //
175 // NOTE: These methods may be called on any thread. The Task will be invoked 176 // NOTE: These methods may be called on any thread. The Task will be invoked
176 // on the thread that executes MessageLoop::Run(). 177 // on the thread that executes MessageLoop::Run().
177 void PostTask( 178 void PostTask(const tracked_objects::Location& from_here,
178 const tracked_objects::Location& from_here, 179 const Closure& task);
179 const base::Closure& task);
180 180
181 bool TryPostTask( 181 bool TryPostTask(const tracked_objects::Location& from_here,
182 const tracked_objects::Location& from_here, 182 const Closure& task);
183 const base::Closure& task);
184 183
185 void PostDelayedTask( 184 void PostDelayedTask(const tracked_objects::Location& from_here,
186 const tracked_objects::Location& from_here, 185 const Closure& task,
187 const base::Closure& task, 186 TimeDelta delay);
188 base::TimeDelta delay);
189 187
190 void PostNonNestableTask( 188 void PostNonNestableTask(const tracked_objects::Location& from_here,
191 const tracked_objects::Location& from_here, 189 const Closure& task);
192 const base::Closure& task);
193 190
194 void PostNonNestableDelayedTask( 191 void PostNonNestableDelayedTask(const tracked_objects::Location& from_here,
195 const tracked_objects::Location& from_here, 192 const Closure& task,
196 const base::Closure& task, 193 TimeDelta delay);
197 base::TimeDelta delay);
198 194
199 // A variant on PostTask that deletes the given object. This is useful 195 // A variant on PostTask that deletes the given object. This is useful
200 // if the object needs to live until the next run of the MessageLoop (for 196 // if the object needs to live until the next run of the MessageLoop (for
201 // example, deleting a RenderProcessHost from within an IPC callback is not 197 // example, deleting a RenderProcessHost from within an IPC callback is not
202 // good). 198 // good).
203 // 199 //
204 // NOTE: This method may be called on any thread. The object will be deleted 200 // NOTE: This method may be called on any thread. The object will be deleted
205 // on the thread that executes MessageLoop::Run(). If this is not the same 201 // on the thread that executes MessageLoop::Run(). If this is not the same
206 // as the thread that calls PostDelayedTask(FROM_HERE, ), then T MUST inherit 202 // as the thread that calls PostDelayedTask(FROM_HERE, ), then T MUST inherit
207 // from RefCountedThreadSafe<T>! 203 // from RefCountedThreadSafe<T>!
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
257 // which nested run loop you are quitting, so be careful! 253 // which nested run loop you are quitting, so be careful!
258 void QuitWhenIdle(); 254 void QuitWhenIdle();
259 255
260 // Deprecated: use RunLoop instead. 256 // Deprecated: use RunLoop instead.
261 // 257 //
262 // This method is a variant of Quit, that does not wait for pending messages 258 // This method is a variant of Quit, that does not wait for pending messages
263 // to be processed before returning from Run. 259 // to be processed before returning from Run.
264 void QuitNow(); 260 void QuitNow();
265 261
266 // TODO(jbates) remove this. crbug.com/131220. See QuitWhenIdleClosure(). 262 // TODO(jbates) remove this. crbug.com/131220. See QuitWhenIdleClosure().
267 static base::Closure QuitClosure() { return QuitWhenIdleClosure(); } 263 static Closure QuitClosure() { return QuitWhenIdleClosure(); }
268 264
269 // Deprecated: use RunLoop instead. 265 // Deprecated: use RunLoop instead.
270 // Construct a Closure that will call QuitWhenIdle(). Useful to schedule an 266 // Construct a Closure that will call QuitWhenIdle(). Useful to schedule an
271 // arbitrary MessageLoop to QuitWhenIdle. 267 // arbitrary MessageLoop to QuitWhenIdle.
272 static base::Closure QuitWhenIdleClosure(); 268 static Closure QuitWhenIdleClosure();
273 269
274 // Returns true if this loop is |type|. This allows subclasses (especially 270 // Returns true if this loop is |type|. This allows subclasses (especially
275 // those in tests) to specialize how they are identified. 271 // those in tests) to specialize how they are identified.
276 virtual bool IsType(Type type) const; 272 virtual bool IsType(Type type) const;
277 273
278 // Returns the type passed to the constructor. 274 // Returns the type passed to the constructor.
279 Type type() const { return type_; } 275 Type type() const { return type_; }
280 276
281 // Optional call to connect the thread name with this loop. 277 // Optional call to connect the thread name with this loop.
282 void set_thread_name(const std::string& thread_name) { 278 void set_thread_name(const std::string& thread_name) {
283 DCHECK(thread_name_.empty()) << "Should not rename this thread!"; 279 DCHECK(thread_name_.empty()) << "Should not rename this thread!";
284 thread_name_ = thread_name; 280 thread_name_ = thread_name;
285 } 281 }
286 const std::string& thread_name() const { return thread_name_; } 282 const std::string& thread_name() const { return thread_name_; }
287 283
288 // Gets the message loop proxy associated with this message loop. 284 // Gets the message loop proxy associated with this message loop.
289 scoped_refptr<base::MessageLoopProxy> message_loop_proxy() { 285 scoped_refptr<MessageLoopProxy> message_loop_proxy() {
290 return message_loop_proxy_.get(); 286 return message_loop_proxy_.get();
291 } 287 }
292 288
293 // Enables or disables the recursive task processing. This happens in the case 289 // Enables or disables the recursive task processing. This happens in the case
294 // of recursive message loops. Some unwanted message loop may occurs when 290 // of recursive message loops. Some unwanted message loop may occurs when
295 // using common controls or printer functions. By default, recursive task 291 // using common controls or printer functions. By default, recursive task
296 // processing is disabled. 292 // processing is disabled.
297 // 293 //
298 // Please utilize |ScopedNestableTaskAllower| instead of calling these methods 294 // Please utilize |ScopedNestableTaskAllower| instead of calling these methods
299 // directly. In general nestable message loops are to be avoided. They are 295 // directly. In general nestable message loops are to be avoided. They are
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
342 338
343 // A TaskObserver is an object that receives task notifications from the 339 // A TaskObserver is an object that receives task notifications from the
344 // MessageLoop. 340 // MessageLoop.
345 // 341 //
346 // NOTE: A TaskObserver implementation should be extremely fast! 342 // NOTE: A TaskObserver implementation should be extremely fast!
347 class BASE_EXPORT TaskObserver { 343 class BASE_EXPORT TaskObserver {
348 public: 344 public:
349 TaskObserver(); 345 TaskObserver();
350 346
351 // This method is called before processing a task. 347 // This method is called before processing a task.
352 virtual void WillProcessTask(const base::PendingTask& pending_task) = 0; 348 virtual void WillProcessTask(const PendingTask& pending_task) = 0;
353 349
354 // This method is called after processing a task. 350 // This method is called after processing a task.
355 virtual void DidProcessTask(const base::PendingTask& pending_task) = 0; 351 virtual void DidProcessTask(const PendingTask& pending_task) = 0;
356 352
357 protected: 353 protected:
358 virtual ~TaskObserver(); 354 virtual ~TaskObserver();
359 }; 355 };
360 356
361 // These functions can only be called on the same thread that |this| is 357 // These functions can only be called on the same thread that |this| is
362 // running on. 358 // running on.
363 void AddTaskObserver(TaskObserver* task_observer); 359 void AddTaskObserver(TaskObserver* task_observer);
364 void RemoveTaskObserver(TaskObserver* task_observer); 360 void RemoveTaskObserver(TaskObserver* task_observer);
365 361
(...skipping 24 matching lines...) Expand all
390 } 386 }
391 #endif // OS_WIN 387 #endif // OS_WIN
392 388
393 // Can only be called from the thread that owns the MessageLoop. 389 // Can only be called from the thread that owns the MessageLoop.
394 bool is_running() const; 390 bool is_running() const;
395 391
396 //---------------------------------------------------------------------------- 392 //----------------------------------------------------------------------------
397 protected: 393 protected:
398 394
399 #if defined(OS_WIN) 395 #if defined(OS_WIN)
400 base::MessagePumpWin* pump_win() { 396 MessagePumpWin* pump_win() {
401 return static_cast<base::MessagePumpWin*>(pump_.get()); 397 return static_cast<MessagePumpWin*>(pump_.get());
402 } 398 }
403 #elif defined(OS_POSIX) && !defined(OS_IOS) 399 #elif defined(OS_POSIX) && !defined(OS_IOS)
404 base::MessagePumpLibevent* pump_libevent() { 400 MessagePumpLibevent* pump_libevent() {
405 return static_cast<base::MessagePumpLibevent*>(pump_.get()); 401 return static_cast<MessagePumpLibevent*>(pump_.get());
406 } 402 }
407 #endif 403 #endif
408 404
409 scoped_refptr<base::MessagePump> pump_; 405 scoped_refptr<MessagePump> pump_;
410 406
411 private: 407 private:
412 friend class base::RunLoop; 408 friend class RunLoop;
413 friend class base::MessageLoopLockTest; 409 friend class MessageLoopLockTest;
414 410
415 // A function to encapsulate all the exception handling capability in the 411 // A function to encapsulate all the exception handling capability in the
416 // stacks around the running of a main message loop. It will run the message 412 // stacks around the running of a main message loop. It will run the message
417 // loop in a SEH try block or not depending on the set_SEH_restoration() 413 // loop in a SEH try block or not depending on the set_SEH_restoration()
418 // flag invoking respectively RunInternalInSEHFrame() or RunInternal(). 414 // flag invoking respectively RunInternalInSEHFrame() or RunInternal().
419 void RunHandler(); 415 void RunHandler();
420 416
421 #if defined(OS_WIN) 417 #if defined(OS_WIN)
422 __declspec(noinline) void RunInternalInSEHFrame(); 418 __declspec(noinline) void RunInternalInSEHFrame();
423 #endif 419 #endif
424 420
425 // A surrounding stack frame around the running of the message loop that 421 // A surrounding stack frame around the running of the message loop that
426 // supports all saving and restoring of state, as is needed for any/all (ugly) 422 // supports all saving and restoring of state, as is needed for any/all (ugly)
427 // recursive calls. 423 // recursive calls.
428 void RunInternal(); 424 void RunInternal();
429 425
430 // Called to process any delayed non-nestable tasks. 426 // Called to process any delayed non-nestable tasks.
431 bool ProcessNextDelayedNonNestableTask(); 427 bool ProcessNextDelayedNonNestableTask();
432 428
433 // Runs the specified PendingTask. 429 // Runs the specified PendingTask.
434 void RunTask(const base::PendingTask& pending_task); 430 void RunTask(const PendingTask& pending_task);
435 431
436 // Calls RunTask or queues the pending_task on the deferred task list if it 432 // Calls RunTask or queues the pending_task on the deferred task list if it
437 // cannot be run right now. Returns true if the task was run. 433 // cannot be run right now. Returns true if the task was run.
438 bool DeferOrRunPendingTask(const base::PendingTask& pending_task); 434 bool DeferOrRunPendingTask(const PendingTask& pending_task);
439 435
440 // Adds the pending task to delayed_work_queue_. 436 // Adds the pending task to delayed_work_queue_.
441 void AddToDelayedWorkQueue(const base::PendingTask& pending_task); 437 void AddToDelayedWorkQueue(const PendingTask& pending_task);
442 438
443 // This function attempts to add pending task to our incoming_queue_. 439 // This function attempts to add pending task to our incoming_queue_.
444 // The append can only possibly fail when |use_try_lock| is true. 440 // The append can only possibly fail when |use_try_lock| is true.
445 // 441 //
446 // When |use_try_lock| is true, then this call will avoid blocking if 442 // When |use_try_lock| is true, then this call will avoid blocking if
447 // the related lock is already held, and will in that case (when the 443 // the related lock is already held, and will in that case (when the
448 // lock is contended) fail to perform the append, and will return false. 444 // lock is contended) fail to perform the append, and will return false.
449 // 445 //
450 // If the call succeeds to append to the queue, then this call 446 // If the call succeeds to append to the queue, then this call
451 // will return true. 447 // will return true.
452 // 448 //
453 // In all cases, the caller retains ownership of |pending_task|, but this 449 // In all cases, the caller retains ownership of |pending_task|, but this
454 // function will reset the value of pending_task->task. This is needed to 450 // function will reset the value of pending_task->task. This is needed to
455 // ensure that the posting call stack does not retain pending_task->task 451 // ensure that the posting call stack does not retain pending_task->task
456 // beyond this function call. 452 // beyond this function call.
457 bool AddToIncomingQueue(base::PendingTask* pending_task, bool use_try_lock); 453 bool AddToIncomingQueue(PendingTask* pending_task, bool use_try_lock);
458 454
459 // Load tasks from the incoming_queue_ into work_queue_ if the latter is 455 // Load tasks from the incoming_queue_ into work_queue_ if the latter is
460 // empty. The former requires a lock to access, while the latter is directly 456 // empty. The former requires a lock to access, while the latter is directly
461 // accessible on this thread. 457 // accessible on this thread.
462 void ReloadWorkQueue(); 458 void ReloadWorkQueue();
463 459
464 // Delete tasks that haven't run yet without running them. Used in the 460 // Delete tasks that haven't run yet without running them. Used in the
465 // destructor to make sure all the task's destructors get called. Returns 461 // destructor to make sure all the task's destructors get called. Returns
466 // true if some work was done. 462 // true if some work was done.
467 bool DeletePendingTasks(); 463 bool DeletePendingTasks();
468 464
469 // Calculates the time at which a PendingTask should run. 465 // Calculates the time at which a PendingTask should run.
470 base::TimeTicks CalculateDelayedRuntime(base::TimeDelta delay); 466 TimeTicks CalculateDelayedRuntime(TimeDelta delay);
471 467
472 // Start recording histogram info about events and action IF it was enabled 468 // Start recording histogram info about events and action IF it was enabled
473 // and IF the statistics recorder can accept a registration of our histogram. 469 // and IF the statistics recorder can accept a registration of our histogram.
474 void StartHistogrammer(); 470 void StartHistogrammer();
475 471
476 // Add occurrence of event to our histogram, so that we can see what is being 472 // Add occurrence of event to our histogram, so that we can see what is being
477 // done in a specific MessageLoop instance (i.e., specific thread). 473 // done in a specific MessageLoop instance (i.e., specific thread).
478 // If message_histogram_ is NULL, this is a no-op. 474 // If message_histogram_ is NULL, this is a no-op.
479 void HistogramEvent(int event); 475 void HistogramEvent(int event);
480 476
481 // base::MessagePump::Delegate methods: 477 // MessagePump::Delegate methods:
482 virtual bool DoWork() OVERRIDE; 478 virtual bool DoWork() OVERRIDE;
483 virtual bool DoDelayedWork(base::TimeTicks* next_delayed_work_time) OVERRIDE; 479 virtual bool DoDelayedWork(TimeTicks* next_delayed_work_time) OVERRIDE;
484 virtual bool DoIdleWork() OVERRIDE; 480 virtual bool DoIdleWork() OVERRIDE;
485 481
486 Type type_; 482 Type type_;
487 483
488 // A list of tasks that need to be processed by this instance. Note that 484 // A list of tasks that need to be processed by this instance. Note that
489 // this queue is only accessed (push/pop) by our current thread. 485 // this queue is only accessed (push/pop) by our current thread.
490 base::TaskQueue work_queue_; 486 TaskQueue work_queue_;
491 487
492 // Contains delayed tasks, sorted by their 'delayed_run_time' property. 488 // Contains delayed tasks, sorted by their 'delayed_run_time' property.
493 base::DelayedTaskQueue delayed_work_queue_; 489 DelayedTaskQueue delayed_work_queue_;
494 490
495 // A recent snapshot of Time::Now(), used to check delayed_work_queue_. 491 // A recent snapshot of Time::Now(), used to check delayed_work_queue_.
496 base::TimeTicks recent_time_; 492 TimeTicks recent_time_;
497 493
498 // A queue of non-nestable tasks that we had to defer because when it came 494 // A queue of non-nestable tasks that we had to defer because when it came
499 // time to execute them we were in a nested message loop. They will execute 495 // time to execute them we were in a nested message loop. They will execute
500 // once we're out of nested message loops. 496 // once we're out of nested message loops.
501 base::TaskQueue deferred_non_nestable_work_queue_; 497 TaskQueue deferred_non_nestable_work_queue_;
502 498
503 ObserverList<DestructionObserver> destruction_observers_; 499 ObserverList<DestructionObserver> destruction_observers_;
504 500
505 // A recursion block that prevents accidentally running additional tasks when 501 // A recursion block that prevents accidentally running additional tasks when
506 // insider a (accidentally induced?) nested message pump. 502 // insider a (accidentally induced?) nested message pump.
507 bool nestable_tasks_allowed_; 503 bool nestable_tasks_allowed_;
508 504
509 bool exception_restoration_; 505 bool exception_restoration_;
510 506
511 std::string thread_name_; 507 std::string thread_name_;
512 // A profiling histogram showing the counts of various messages and events. 508 // A profiling histogram showing the counts of various messages and events.
513 base::HistogramBase* message_histogram_; 509 HistogramBase* message_histogram_;
514 510
515 // An incoming queue of tasks that are acquired under a mutex for processing 511 // An incoming queue of tasks that are acquired under a mutex for processing
516 // on this instance's thread. These tasks have not yet been sorted out into 512 // on this instance's thread. These tasks have not yet been sorted out into
517 // items for our work_queue_ vs delayed_work_queue_. 513 // items for our work_queue_ vs delayed_work_queue_.
518 base::TaskQueue incoming_queue_; 514 TaskQueue incoming_queue_;
519 // Protect access to incoming_queue_. 515 // Protect access to incoming_queue_.
520 mutable base::Lock incoming_queue_lock_; 516 mutable Lock incoming_queue_lock_;
521 517
522 base::RunLoop* run_loop_; 518 RunLoop* run_loop_;
523 519
524 #if defined(OS_WIN) 520 #if defined(OS_WIN)
525 base::TimeTicks high_resolution_timer_expiration_; 521 TimeTicks high_resolution_timer_expiration_;
526 // 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
527 // which enter a modal message loop. 523 // which enter a modal message loop.
528 bool os_modal_loop_; 524 bool os_modal_loop_;
529 #endif 525 #endif
530 526
531 // The next sequence number to use for delayed tasks. Updating this counter is 527 // The next sequence number to use for delayed tasks. Updating this counter is
532 // protected by incoming_queue_lock_. 528 // protected by incoming_queue_lock_.
533 int next_sequence_num_; 529 int next_sequence_num_;
534 530
535 ObserverList<TaskObserver> task_observers_; 531 ObserverList<TaskObserver> task_observers_;
536 532
537 // The message loop proxy associated with this message loop, if one exists. 533 // The message loop proxy associated with this message loop, if one exists.
538 scoped_refptr<base::MessageLoopProxy> message_loop_proxy_; 534 scoped_refptr<MessageLoopProxy> message_loop_proxy_;
539 scoped_ptr<base::ThreadTaskRunnerHandle> thread_task_runner_handle_; 535 scoped_ptr<ThreadTaskRunnerHandle> thread_task_runner_handle_;
540 536
541 template <class T, class R> friend class base::subtle::DeleteHelperInternal; 537 template <class T, class R> friend class base::subtle::DeleteHelperInternal;
542 template <class T, class R> friend class base::subtle::ReleaseHelperInternal; 538 template <class T, class R> friend class base::subtle::ReleaseHelperInternal;
543 539
544 void DeleteSoonInternal(const tracked_objects::Location& from_here, 540 void DeleteSoonInternal(const tracked_objects::Location& from_here,
545 void(*deleter)(const void*), 541 void(*deleter)(const void*),
546 const void* object); 542 const void* object);
547 void ReleaseSoonInternal(const tracked_objects::Location& from_here, 543 void ReleaseSoonInternal(const tracked_objects::Location& from_here,
548 void(*releaser)(const void*), 544 void(*releaser)(const void*),
549 const void* object); 545 const void* object);
550 546
551 DISALLOW_COPY_AND_ASSIGN(MessageLoop); 547 DISALLOW_COPY_AND_ASSIGN(MessageLoop);
552 }; 548 };
553 549
554 //----------------------------------------------------------------------------- 550 //-----------------------------------------------------------------------------
555 // MessageLoopForUI extends MessageLoop with methods that are particular to a 551 // MessageLoopForUI extends MessageLoop with methods that are particular to a
556 // MessageLoop instantiated with TYPE_UI. 552 // MessageLoop instantiated with TYPE_UI.
557 // 553 //
558 // This class is typically used like so: 554 // This class is typically used like so:
559 // MessageLoopForUI::current()->...call some method... 555 // MessageLoopForUI::current()->...call some method...
560 // 556 //
561 class BASE_EXPORT MessageLoopForUI : public MessageLoop { 557 class BASE_EXPORT MessageLoopForUI : public MessageLoop {
562 public: 558 public:
563 #if defined(OS_WIN) 559 #if defined(OS_WIN)
564 typedef base::MessagePumpForUI::MessageFilter MessageFilter; 560 typedef MessagePumpForUI::MessageFilter MessageFilter;
565 #endif 561 #endif
566 562
567 MessageLoopForUI() : MessageLoop(TYPE_UI) { 563 MessageLoopForUI() : MessageLoop(TYPE_UI) {
568 } 564 }
569 565
570 // Returns the MessageLoopForUI of the current thread. 566 // Returns the MessageLoopForUI of the current thread.
571 static MessageLoopForUI* current() { 567 static MessageLoopForUI* current() {
572 MessageLoop* loop = MessageLoop::current(); 568 MessageLoop* loop = MessageLoop::current();
573 DCHECK(loop); 569 DCHECK(loop);
574 DCHECK_EQ(MessageLoop::TYPE_UI, loop->type()); 570 DCHECK_EQ(MessageLoop::TYPE_UI, loop->type());
(...skipping 25 matching lines...) Expand all
600 596
601 #if defined(OS_WIN) 597 #if defined(OS_WIN)
602 // Plese see MessagePumpForUI for definitions of this method. 598 // Plese see MessagePumpForUI for definitions of this method.
603 void SetMessageFilter(scoped_ptr<MessageFilter> message_filter) { 599 void SetMessageFilter(scoped_ptr<MessageFilter> message_filter) {
604 pump_ui()->SetMessageFilter(message_filter.Pass()); 600 pump_ui()->SetMessageFilter(message_filter.Pass());
605 } 601 }
606 #endif 602 #endif
607 603
608 protected: 604 protected:
609 #if defined(USE_AURA) && defined(USE_X11) && !defined(OS_NACL) 605 #if defined(USE_AURA) && defined(USE_X11) && !defined(OS_NACL)
610 friend class base::MessagePumpAuraX11; 606 friend class MessagePumpAuraX11;
611 #endif 607 #endif
612 #if defined(USE_OZONE) && !defined(OS_NACL) 608 #if defined(USE_OZONE) && !defined(OS_NACL)
613 friend class base::MessagePumpOzone; 609 friend class MessagePumpOzone;
614 #endif 610 #endif
615 611
616 // TODO(rvargas): Make this platform independent. 612 // TODO(rvargas): Make this platform independent.
617 base::MessagePumpForUI* pump_ui() { 613 MessagePumpForUI* pump_ui() {
618 return static_cast<base::MessagePumpForUI*>(pump_.get()); 614 return static_cast<MessagePumpForUI*>(pump_.get());
619 } 615 }
620 #endif // !defined(OS_MACOSX) 616 #endif // !defined(OS_MACOSX)
621 }; 617 };
622 618
623 // Do not add any member variables to MessageLoopForUI! This is important b/c 619 // Do not add any member variables to MessageLoopForUI! This is important b/c
624 // MessageLoopForUI is often allocated via MessageLoop(TYPE_UI). Any extra 620 // MessageLoopForUI is often allocated via MessageLoop(TYPE_UI). Any extra
625 // data that you need should be stored on the MessageLoop's pump_ instance. 621 // data that you need should be stored on the MessageLoop's pump_ instance.
626 COMPILE_ASSERT(sizeof(MessageLoop) == sizeof(MessageLoopForUI), 622 COMPILE_ASSERT(sizeof(MessageLoop) == sizeof(MessageLoopForUI),
627 MessageLoopForUI_should_not_have_extra_member_variables); 623 MessageLoopForUI_should_not_have_extra_member_variables);
628 624
629 //----------------------------------------------------------------------------- 625 //-----------------------------------------------------------------------------
630 // MessageLoopForIO extends MessageLoop with methods that are particular to a 626 // MessageLoopForIO extends MessageLoop with methods that are particular to a
631 // MessageLoop instantiated with TYPE_IO. 627 // MessageLoop instantiated with TYPE_IO.
632 // 628 //
633 // This class is typically used like so: 629 // This class is typically used like so:
634 // MessageLoopForIO::current()->...call some method... 630 // MessageLoopForIO::current()->...call some method...
635 // 631 //
636 class BASE_EXPORT MessageLoopForIO : public MessageLoop { 632 class BASE_EXPORT MessageLoopForIO : public MessageLoop {
637 public: 633 public:
638 #if defined(OS_WIN) 634 #if defined(OS_WIN)
639 typedef base::MessagePumpForIO::IOHandler IOHandler; 635 typedef MessagePumpForIO::IOHandler IOHandler;
640 typedef base::MessagePumpForIO::IOContext IOContext; 636 typedef MessagePumpForIO::IOContext IOContext;
641 typedef base::MessagePumpForIO::IOObserver IOObserver; 637 typedef MessagePumpForIO::IOObserver IOObserver;
642 #elif defined(OS_IOS) 638 #elif defined(OS_IOS)
643 typedef base::MessagePumpIOSForIO::Watcher Watcher; 639 typedef MessagePumpIOSForIO::Watcher Watcher;
644 typedef base::MessagePumpIOSForIO::FileDescriptorWatcher 640 typedef MessagePumpIOSForIO::FileDescriptorWatcher
645 FileDescriptorWatcher; 641 FileDescriptorWatcher;
646 typedef base::MessagePumpIOSForIO::IOObserver IOObserver; 642 typedef MessagePumpIOSForIO::IOObserver IOObserver;
647 643
648 enum Mode { 644 enum Mode {
649 WATCH_READ = base::MessagePumpIOSForIO::WATCH_READ, 645 WATCH_READ = MessagePumpIOSForIO::WATCH_READ,
650 WATCH_WRITE = base::MessagePumpIOSForIO::WATCH_WRITE, 646 WATCH_WRITE = MessagePumpIOSForIO::WATCH_WRITE,
651 WATCH_READ_WRITE = base::MessagePumpIOSForIO::WATCH_READ_WRITE 647 WATCH_READ_WRITE = MessagePumpIOSForIO::WATCH_READ_WRITE
652 }; 648 };
653 #elif defined(OS_POSIX) 649 #elif defined(OS_POSIX)
654 typedef base::MessagePumpLibevent::Watcher Watcher; 650 typedef MessagePumpLibevent::Watcher Watcher;
655 typedef base::MessagePumpLibevent::FileDescriptorWatcher 651 typedef MessagePumpLibevent::FileDescriptorWatcher
656 FileDescriptorWatcher; 652 FileDescriptorWatcher;
657 typedef base::MessagePumpLibevent::IOObserver IOObserver; 653 typedef MessagePumpLibevent::IOObserver IOObserver;
658 654
659 enum Mode { 655 enum Mode {
660 WATCH_READ = base::MessagePumpLibevent::WATCH_READ, 656 WATCH_READ = MessagePumpLibevent::WATCH_READ,
661 WATCH_WRITE = base::MessagePumpLibevent::WATCH_WRITE, 657 WATCH_WRITE = MessagePumpLibevent::WATCH_WRITE,
662 WATCH_READ_WRITE = base::MessagePumpLibevent::WATCH_READ_WRITE 658 WATCH_READ_WRITE = MessagePumpLibevent::WATCH_READ_WRITE
663 }; 659 };
664 660
665 #endif 661 #endif
666 662
667 MessageLoopForIO() : MessageLoop(TYPE_IO) { 663 MessageLoopForIO() : MessageLoop(TYPE_IO) {
668 } 664 }
669 665
670 // Returns the MessageLoopForIO of the current thread. 666 // Returns the MessageLoopForIO of the current thread.
671 static MessageLoopForIO* current() { 667 static MessageLoopForIO* current() {
672 MessageLoop* loop = MessageLoop::current(); 668 MessageLoop* loop = MessageLoop::current();
(...skipping 10 matching lines...) Expand all
683 } 679 }
684 680
685 #if defined(OS_WIN) 681 #if defined(OS_WIN)
686 // Please see MessagePumpWin for definitions of these methods. 682 // Please see MessagePumpWin for definitions of these methods.
687 void RegisterIOHandler(HANDLE file, IOHandler* handler); 683 void RegisterIOHandler(HANDLE file, IOHandler* handler);
688 bool RegisterJobObject(HANDLE job, IOHandler* handler); 684 bool RegisterJobObject(HANDLE job, IOHandler* handler);
689 bool WaitForIOCompletion(DWORD timeout, IOHandler* filter); 685 bool WaitForIOCompletion(DWORD timeout, IOHandler* filter);
690 686
691 protected: 687 protected:
692 // TODO(rvargas): Make this platform independent. 688 // TODO(rvargas): Make this platform independent.
693 base::MessagePumpForIO* pump_io() { 689 MessagePumpForIO* pump_io() {
694 return static_cast<base::MessagePumpForIO*>(pump_.get()); 690 return static_cast<MessagePumpForIO*>(pump_.get());
695 } 691 }
696 692
697 #elif defined(OS_IOS) 693 #elif defined(OS_IOS)
698 // Please see MessagePumpIOSForIO for definition. 694 // Please see MessagePumpIOSForIO for definition.
699 bool WatchFileDescriptor(int fd, 695 bool WatchFileDescriptor(int fd,
700 bool persistent, 696 bool persistent,
701 Mode mode, 697 Mode mode,
702 FileDescriptorWatcher *controller, 698 FileDescriptorWatcher *controller,
703 Watcher *delegate); 699 Watcher *delegate);
704 700
705 private: 701 private:
706 base::MessagePumpIOSForIO* pump_io() { 702 MessagePumpIOSForIO* pump_io() {
707 return static_cast<base::MessagePumpIOSForIO*>(pump_.get()); 703 return static_cast<MessagePumpIOSForIO*>(pump_.get());
708 } 704 }
709 705
710 #elif defined(OS_POSIX) 706 #elif defined(OS_POSIX)
711 // Please see MessagePumpLibevent for definition. 707 // Please see MessagePumpLibevent for definition.
712 bool WatchFileDescriptor(int fd, 708 bool WatchFileDescriptor(int fd,
713 bool persistent, 709 bool persistent,
714 Mode mode, 710 Mode mode,
715 FileDescriptorWatcher* controller, 711 FileDescriptorWatcher* controller,
716 Watcher* delegate); 712 Watcher* delegate);
717 713
718 private: 714 private:
719 base::MessagePumpLibevent* pump_io() { 715 MessagePumpLibevent* pump_io() {
720 return static_cast<base::MessagePumpLibevent*>(pump_.get()); 716 return static_cast<MessagePumpLibevent*>(pump_.get());
721 } 717 }
722 #endif // defined(OS_POSIX) 718 #endif // defined(OS_POSIX)
723 }; 719 };
724 720
725 // Do not add any member variables to MessageLoopForIO! This is important b/c 721 // Do not add any member variables to MessageLoopForIO! This is important b/c
726 // MessageLoopForIO is often allocated via MessageLoop(TYPE_IO). Any extra 722 // MessageLoopForIO is often allocated via MessageLoop(TYPE_IO). Any extra
727 // data that you need should be stored on the MessageLoop's pump_ instance. 723 // data that you need should be stored on the MessageLoop's pump_ instance.
728 COMPILE_ASSERT(sizeof(MessageLoop) == sizeof(MessageLoopForIO), 724 COMPILE_ASSERT(sizeof(MessageLoop) == sizeof(MessageLoopForIO),
729 MessageLoopForIO_should_not_have_extra_member_variables); 725 MessageLoopForIO_should_not_have_extra_member_variables);
730 726
731 } // namespace base 727 } // namespace base
732 728
733 #endif // BASE_MESSAGE_LOOP_MESSAGE_LOOP_H_ 729 #endif // BASE_MESSAGE_LOOP_MESSAGE_LOOP_H_
OLDNEW
« no previous file with comments | « base/mac/scoped_sending_event.h ('k') | base/message_loop/message_loop.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698