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

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

Issue 235893016: Some cleanups for the message_loop.h/cc. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: tot-merge Created 6 years, 8 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 | « no previous file | 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
(...skipping 14 matching lines...) Expand all
25 #include "base/time/time.h" 25 #include "base/time/time.h"
26 #include "base/tracking_info.h" 26 #include "base/tracking_info.h"
27 27
28 // TODO(sky): these includes should not be necessary. Nuke them. 28 // TODO(sky): these includes should not be necessary. Nuke them.
29 #if defined(OS_WIN) 29 #if defined(OS_WIN)
30 #include "base/message_loop/message_pump_win.h" 30 #include "base/message_loop/message_pump_win.h"
31 #elif defined(OS_IOS) 31 #elif defined(OS_IOS)
32 #include "base/message_loop/message_pump_io_ios.h" 32 #include "base/message_loop/message_pump_io_ios.h"
33 #elif defined(OS_POSIX) 33 #elif defined(OS_POSIX)
34 #include "base/message_loop/message_pump_libevent.h" 34 #include "base/message_loop/message_pump_libevent.h"
35 #if !defined(OS_MACOSX) && !defined(OS_ANDROID)
36
37 #if defined(OS_CHROMEOS) && !defined(OS_NACL) && !defined(USE_GLIB)
38 #include "base/message_loop/message_pump_libevent.h"
39 #elif defined(USE_GLIB) && !defined(OS_NACL)
40 #include "base/message_loop/message_pump_glib.h"
41 #elif !defined(OS_ANDROID_HOST)
42 #include "base/message_loop/message_pump_glib.h"
43 #endif
44
45 #endif
46 #endif 35 #endif
47 36
48 namespace base { 37 namespace base {
49 38
50 class HistogramBase; 39 class HistogramBase;
51 class MessagePumpObserver; 40 class MessagePumpObserver;
52 class RunLoop; 41 class RunLoop;
53 class ThreadTaskRunnerHandle; 42 class ThreadTaskRunnerHandle;
54 #if defined(OS_ANDROID)
55 class MessagePumpForUI;
56 #elif defined(OS_ANDROID_HOST) || (defined(OS_CHROMEOS) && !defined(USE_GLIB))
57 typedef MessagePumpLibevent MessagePumpForUI;
58 #endif
59 class WaitableEvent; 43 class WaitableEvent;
60 44
61 // A MessageLoop is used to process events for a particular thread. There is 45 // A MessageLoop is used to process events for a particular thread. There is
62 // at most one MessageLoop instance per thread. 46 // at most one MessageLoop instance per thread.
63 // 47 //
64 // Events include at a minimum Task instances submitted to PostTask and its 48 // Events include at a minimum Task instances submitted to PostTask and its
65 // variants. Depending on the type of message pump used by the MessageLoop 49 // variants. Depending on the type of message pump used by the MessageLoop
66 // other events such as UI messages may be processed. On Windows APC calls (as 50 // other events such as UI messages may be processed. On Windows APC calls (as
67 // time permits) and signals sent to a registered set of HANDLEs may also be 51 // time permits) and signals sent to a registered set of HANDLEs may also be
68 // processed. 52 // processed.
(...skipping 15 matching lines...) Expand all
84 // MessageLoop::ScopedNestableTaskAllower allow(MessageLoop::current()); 68 // MessageLoop::ScopedNestableTaskAllower allow(MessageLoop::current());
85 // hr = DoDragDrop(...); // Implicitly runs a modal message loop. 69 // hr = DoDragDrop(...); // Implicitly runs a modal message loop.
86 // } 70 // }
87 // // Process |hr| (the result returned by DoDragDrop()). 71 // // Process |hr| (the result returned by DoDragDrop()).
88 // 72 //
89 // Please be SURE your task is reentrant (nestable) and all global variables 73 // Please be SURE your task is reentrant (nestable) and all global variables
90 // are stable and accessible before calling SetNestableTasksAllowed(true). 74 // are stable and accessible before calling SetNestableTasksAllowed(true).
91 // 75 //
92 class BASE_EXPORT MessageLoop : public MessagePump::Delegate { 76 class BASE_EXPORT MessageLoop : public MessagePump::Delegate {
93 public: 77 public:
94 #if defined(OS_WIN)
95 typedef MessagePumpObserver Observer;
96 #endif
97
98 // A MessageLoop has a particular type, which indicates the set of 78 // A MessageLoop has a particular type, which indicates the set of
99 // asynchronous events it may process in addition to tasks and timers. 79 // asynchronous events it may process in addition to tasks and timers.
100 // 80 //
101 // TYPE_DEFAULT 81 // TYPE_DEFAULT
102 // This type of ML only supports tasks and timers. 82 // This type of ML only supports tasks and timers.
103 // 83 //
104 // TYPE_UI 84 // TYPE_UI
105 // This type of ML also supports native UI events (e.g., Windows messages). 85 // This type of ML also supports native UI events (e.g., Windows messages).
106 // See also MessageLoopForUI. 86 // See also MessageLoopForUI.
107 // 87 //
(...skipping 277 matching lines...) Expand 10 before | Expand all | Expand 10 after
385 365
386 // Returns true if the message loop has high resolution timers enabled. 366 // Returns true if the message loop has high resolution timers enabled.
387 // Provided for testing. 367 // Provided for testing.
388 bool IsHighResolutionTimerEnabledForTesting(); 368 bool IsHighResolutionTimerEnabledForTesting();
389 369
390 // Returns true if the message loop is "idle". Provided for testing. 370 // Returns true if the message loop is "idle". Provided for testing.
391 bool IsIdleForTesting(); 371 bool IsIdleForTesting();
392 372
393 //---------------------------------------------------------------------------- 373 //----------------------------------------------------------------------------
394 protected: 374 protected:
395
396 #if defined(OS_WIN)
397 MessagePumpWin* pump_win() {
398 return static_cast<MessagePumpWin*>(pump_.get());
399 }
400 #elif defined(OS_POSIX) && !defined(OS_IOS)
401 MessagePumpLibevent* pump_libevent() {
402 return static_cast<MessagePumpLibevent*>(pump_.get());
403 }
404 #endif
405
406 scoped_ptr<MessagePump> pump_; 375 scoped_ptr<MessagePump> pump_;
407 376
408 private: 377 private:
409 friend class internal::IncomingTaskQueue; 378 friend class internal::IncomingTaskQueue;
410 friend class RunLoop; 379 friend class RunLoop;
411 380
412 // Configures various members for the two constructors. 381 // Configures various members for the two constructors.
413 void Init(); 382 void Init();
414 383
415 // Invokes the actual run loop using the message pump. 384 // Invokes the actual run loop using the message pump.
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
511 void DeleteSoonInternal(const tracked_objects::Location& from_here, 480 void DeleteSoonInternal(const tracked_objects::Location& from_here,
512 void(*deleter)(const void*), 481 void(*deleter)(const void*),
513 const void* object); 482 const void* object);
514 void ReleaseSoonInternal(const tracked_objects::Location& from_here, 483 void ReleaseSoonInternal(const tracked_objects::Location& from_here,
515 void(*releaser)(const void*), 484 void(*releaser)(const void*),
516 const void* object); 485 const void* object);
517 486
518 DISALLOW_COPY_AND_ASSIGN(MessageLoop); 487 DISALLOW_COPY_AND_ASSIGN(MessageLoop);
519 }; 488 };
520 489
490 #if !defined(OS_NACL)
491
521 //----------------------------------------------------------------------------- 492 //-----------------------------------------------------------------------------
522 // MessageLoopForUI extends MessageLoop with methods that are particular to a 493 // MessageLoopForUI extends MessageLoop with methods that are particular to a
523 // MessageLoop instantiated with TYPE_UI. 494 // MessageLoop instantiated with TYPE_UI.
524 // 495 //
525 // This class is typically used like so: 496 // This class is typically used like so:
526 // MessageLoopForUI::current()->...call some method... 497 // MessageLoopForUI::current()->...call some method...
527 // 498 //
528 class BASE_EXPORT MessageLoopForUI : public MessageLoop { 499 class BASE_EXPORT MessageLoopForUI : public MessageLoop {
529 public: 500 public:
530 MessageLoopForUI() : MessageLoop(TYPE_UI) { 501 MessageLoopForUI() : MessageLoop(TYPE_UI) {
(...skipping 19 matching lines...) Expand all
550 void Attach(); 521 void Attach();
551 #endif 522 #endif
552 523
553 #if defined(OS_ANDROID) 524 #if defined(OS_ANDROID)
554 // On Android, the UI message loop is handled by Java side. So Run() should 525 // On Android, the UI message loop is handled by Java side. So Run() should
555 // never be called. Instead use Start(), which will forward all the native UI 526 // never be called. Instead use Start(), which will forward all the native UI
556 // events to the Java message loop. 527 // events to the Java message loop.
557 void Start(); 528 void Start();
558 #endif 529 #endif
559 530
560 #if !defined(OS_NACL) && defined(OS_WIN) 531 #if defined(OS_WIN)
532 typedef MessagePumpObserver Observer;
533
561 // Please see message_pump_win for definitions of these methods. 534 // Please see message_pump_win for definitions of these methods.
562 void AddObserver(Observer* observer); 535 void AddObserver(Observer* observer);
563 void RemoveObserver(Observer* observer); 536 void RemoveObserver(Observer* observer);
564 #endif 537 #endif
565 538
566 #if !defined(OS_NACL) && \ 539 #if defined(USE_OZONE) || (defined(OS_CHROMEOS) && !defined(USE_GLIB))
567 (defined(USE_OZONE) || (defined(OS_CHROMEOS) && !defined(USE_GLIB)))
568 // Please see MessagePumpLibevent for definition. 540 // Please see MessagePumpLibevent for definition.
569 bool WatchFileDescriptor( 541 bool WatchFileDescriptor(
570 int fd, 542 int fd,
571 bool persistent, 543 bool persistent,
572 MessagePumpLibevent::Mode mode, 544 MessagePumpLibevent::Mode mode,
573 MessagePumpLibevent::FileDescriptorWatcher* controller, 545 MessagePumpLibevent::FileDescriptorWatcher* controller,
574 MessagePumpLibevent::Watcher* delegate); 546 MessagePumpLibevent::Watcher* delegate);
575 #endif 547 #endif
576
577 protected:
578 #if !defined(OS_MACOSX) && !defined(OS_ANDROID)
579 // TODO(rvargas): Make this platform independent.
580 MessagePumpForUI* pump_ui() {
581 return static_cast<MessagePumpForUI*>(pump_.get());
582 }
583 #endif
584 }; 548 };
585 549
586 // Do not add any member variables to MessageLoopForUI! This is important b/c 550 // Do not add any member variables to MessageLoopForUI! This is important b/c
587 // MessageLoopForUI is often allocated via MessageLoop(TYPE_UI). Any extra 551 // MessageLoopForUI is often allocated via MessageLoop(TYPE_UI). Any extra
588 // data that you need should be stored on the MessageLoop's pump_ instance. 552 // data that you need should be stored on the MessageLoop's pump_ instance.
589 COMPILE_ASSERT(sizeof(MessageLoop) == sizeof(MessageLoopForUI), 553 COMPILE_ASSERT(sizeof(MessageLoop) == sizeof(MessageLoopForUI),
590 MessageLoopForUI_should_not_have_extra_member_variables); 554 MessageLoopForUI_should_not_have_extra_member_variables);
591 555
556 #endif // !defined(OS_NACL)
557
592 //----------------------------------------------------------------------------- 558 //-----------------------------------------------------------------------------
593 // MessageLoopForIO extends MessageLoop with methods that are particular to a 559 // MessageLoopForIO extends MessageLoop with methods that are particular to a
594 // MessageLoop instantiated with TYPE_IO. 560 // MessageLoop instantiated with TYPE_IO.
595 // 561 //
596 // This class is typically used like so: 562 // This class is typically used like so:
597 // MessageLoopForIO::current()->...call some method... 563 // MessageLoopForIO::current()->...call some method...
598 // 564 //
599 class BASE_EXPORT MessageLoopForIO : public MessageLoop { 565 class BASE_EXPORT MessageLoopForIO : public MessageLoop {
600 public: 566 public:
567 MessageLoopForIO() : MessageLoop(TYPE_IO) {
568 }
569
570 // Returns the MessageLoopForIO of the current thread.
571 static MessageLoopForIO* current() {
572 MessageLoop* loop = MessageLoop::current();
573 DCHECK_EQ(MessageLoop::TYPE_IO, loop->type());
574 return static_cast<MessageLoopForIO*>(loop);
575 }
576
577 static bool IsCurrent() {
578 MessageLoop* loop = MessageLoop::current();
579 return loop && loop->type() == MessageLoop::TYPE_IO;
580 }
581
582 #if !defined(OS_NACL)
583
601 #if defined(OS_WIN) 584 #if defined(OS_WIN)
602 typedef MessagePumpForIO::IOHandler IOHandler; 585 typedef MessagePumpForIO::IOHandler IOHandler;
603 typedef MessagePumpForIO::IOContext IOContext; 586 typedef MessagePumpForIO::IOContext IOContext;
604 typedef MessagePumpForIO::IOObserver IOObserver; 587 typedef MessagePumpForIO::IOObserver IOObserver;
605 #elif defined(OS_IOS) 588 #elif defined(OS_IOS)
606 typedef MessagePumpIOSForIO::Watcher Watcher; 589 typedef MessagePumpIOSForIO::Watcher Watcher;
607 typedef MessagePumpIOSForIO::FileDescriptorWatcher 590 typedef MessagePumpIOSForIO::FileDescriptorWatcher
608 FileDescriptorWatcher; 591 FileDescriptorWatcher;
609 typedef MessagePumpIOSForIO::IOObserver IOObserver; 592 typedef MessagePumpIOSForIO::IOObserver IOObserver;
610 593
611 enum Mode { 594 enum Mode {
612 WATCH_READ = MessagePumpIOSForIO::WATCH_READ, 595 WATCH_READ = MessagePumpIOSForIO::WATCH_READ,
613 WATCH_WRITE = MessagePumpIOSForIO::WATCH_WRITE, 596 WATCH_WRITE = MessagePumpIOSForIO::WATCH_WRITE,
614 WATCH_READ_WRITE = MessagePumpIOSForIO::WATCH_READ_WRITE 597 WATCH_READ_WRITE = MessagePumpIOSForIO::WATCH_READ_WRITE
615 }; 598 };
616 #elif defined(OS_POSIX) 599 #elif defined(OS_POSIX)
617 typedef MessagePumpLibevent::Watcher Watcher; 600 typedef MessagePumpLibevent::Watcher Watcher;
618 typedef MessagePumpLibevent::FileDescriptorWatcher 601 typedef MessagePumpLibevent::FileDescriptorWatcher
619 FileDescriptorWatcher; 602 FileDescriptorWatcher;
620 typedef MessagePumpLibevent::IOObserver IOObserver; 603 typedef MessagePumpLibevent::IOObserver IOObserver;
621 604
622 enum Mode { 605 enum Mode {
623 WATCH_READ = MessagePumpLibevent::WATCH_READ, 606 WATCH_READ = MessagePumpLibevent::WATCH_READ,
624 WATCH_WRITE = MessagePumpLibevent::WATCH_WRITE, 607 WATCH_WRITE = MessagePumpLibevent::WATCH_WRITE,
625 WATCH_READ_WRITE = MessagePumpLibevent::WATCH_READ_WRITE 608 WATCH_READ_WRITE = MessagePumpLibevent::WATCH_READ_WRITE
626 }; 609 };
627
628 #endif 610 #endif
629 611
630 MessageLoopForIO() : MessageLoop(TYPE_IO) { 612 void AddIOObserver(IOObserver* io_observer);
631 } 613 void RemoveIOObserver(IOObserver* io_observer);
632
633 // Returns the MessageLoopForIO of the current thread.
634 static MessageLoopForIO* current() {
635 MessageLoop* loop = MessageLoop::current();
636 DCHECK_EQ(MessageLoop::TYPE_IO, loop->type());
637 return static_cast<MessageLoopForIO*>(loop);
638 }
639
640 static bool IsCurrent() {
641 MessageLoop* loop = MessageLoop::current();
642 return loop && loop->type() == MessageLoop::TYPE_IO;
643 }
644
645 void AddIOObserver(IOObserver* io_observer) {
646 pump_io()->AddIOObserver(io_observer);
647 }
648
649 void RemoveIOObserver(IOObserver* io_observer) {
650 pump_io()->RemoveIOObserver(io_observer);
651 }
652 614
653 #if defined(OS_WIN) 615 #if defined(OS_WIN)
654 // Please see MessagePumpWin for definitions of these methods. 616 // Please see MessagePumpWin for definitions of these methods.
655 void RegisterIOHandler(HANDLE file, IOHandler* handler); 617 void RegisterIOHandler(HANDLE file, IOHandler* handler);
656 bool RegisterJobObject(HANDLE job, IOHandler* handler); 618 bool RegisterJobObject(HANDLE job, IOHandler* handler);
657 bool WaitForIOCompletion(DWORD timeout, IOHandler* filter); 619 bool WaitForIOCompletion(DWORD timeout, IOHandler* filter);
658 620 #elif defined(OS_POSIX)
659 protected: 621 // Please see MessagePumpIOSForIO/MessagePumpLibevent for definition.
660 // TODO(rvargas): Make this platform independent.
661 MessagePumpForIO* pump_io() {
662 return static_cast<MessagePumpForIO*>(pump_.get());
663 }
664
665 #elif defined(OS_IOS)
666 // Please see MessagePumpIOSForIO for definition.
667 bool WatchFileDescriptor(int fd, 622 bool WatchFileDescriptor(int fd,
668 bool persistent, 623 bool persistent,
669 Mode mode, 624 Mode mode,
670 FileDescriptorWatcher *controller, 625 FileDescriptorWatcher *controller,
671 Watcher *delegate); 626 Watcher *delegate);
672 627 #endif // defined(OS_IOS) || defined(OS_POSIX)
673 private: 628 #endif // !defined(OS_NACL)
674 MessagePumpIOSForIO* pump_io() {
675 return static_cast<MessagePumpIOSForIO*>(pump_.get());
676 }
677
678 #elif defined(OS_POSIX)
679 // Please see MessagePumpLibevent for definition.
680 bool WatchFileDescriptor(int fd,
681 bool persistent,
682 Mode mode,
683 FileDescriptorWatcher* controller,
684 Watcher* delegate);
685
686 private:
687 MessagePumpLibevent* pump_io() {
688 return static_cast<MessagePumpLibevent*>(pump_.get());
689 }
690 #endif // defined(OS_POSIX)
691 }; 629 };
692 630
693 // Do not add any member variables to MessageLoopForIO! This is important b/c 631 // Do not add any member variables to MessageLoopForIO! This is important b/c
694 // MessageLoopForIO is often allocated via MessageLoop(TYPE_IO). Any extra 632 // MessageLoopForIO is often allocated via MessageLoop(TYPE_IO). Any extra
695 // data that you need should be stored on the MessageLoop's pump_ instance. 633 // data that you need should be stored on the MessageLoop's pump_ instance.
696 COMPILE_ASSERT(sizeof(MessageLoop) == sizeof(MessageLoopForIO), 634 COMPILE_ASSERT(sizeof(MessageLoop) == sizeof(MessageLoopForIO),
697 MessageLoopForIO_should_not_have_extra_member_variables); 635 MessageLoopForIO_should_not_have_extra_member_variables);
698 636
699 } // namespace base 637 } // namespace base
700 638
701 #endif // BASE_MESSAGE_LOOP_MESSAGE_LOOP_H_ 639 #endif // BASE_MESSAGE_LOOP_MESSAGE_LOOP_H_
OLDNEW
« no previous file with comments | « no previous file | base/message_loop/message_loop.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698