| Index: base/message_loop/message_pump_mac.mm
|
| diff --git a/base/message_loop/message_pump_mac.mm b/base/message_loop/message_pump_mac.mm
|
| index 370e351ec9cd449c9c281da177dedf0db8aac7c0..2eacb4ec740105f7251948ae1dd541de399d64ef 100644
|
| --- a/base/message_loop/message_pump_mac.mm
|
| +++ b/base/message_loop/message_pump_mac.mm
|
| @@ -44,39 +44,8 @@ const CFStringRef kAllModes[] = {
|
| CFSTR("NSUnhighlightMenuRunLoopMode"),
|
| };
|
|
|
| -void CFRunLoopAddSourceToAllModes(CFRunLoopRef rl, CFRunLoopSourceRef source) {
|
| - for (const CFStringRef& mode : kAllModes)
|
| - CFRunLoopAddSource(rl, source, mode);
|
| -}
|
| -
|
| -void CFRunLoopRemoveSourceFromAllModes(CFRunLoopRef rl,
|
| - CFRunLoopSourceRef source) {
|
| - for (const CFStringRef& mode : kAllModes)
|
| - CFRunLoopRemoveSource(rl, source, mode);
|
| -}
|
| -
|
| -void CFRunLoopAddTimerToAllModes(CFRunLoopRef rl, CFRunLoopTimerRef timer) {
|
| - for (const CFStringRef& mode : kAllModes)
|
| - CFRunLoopAddTimer(rl, timer, mode);
|
| -}
|
| -
|
| -void CFRunLoopRemoveTimerFromAllModes(CFRunLoopRef rl,
|
| - CFRunLoopTimerRef timer) {
|
| - for (const CFStringRef& mode : kAllModes)
|
| - CFRunLoopRemoveTimer(rl, timer, mode);
|
| -}
|
| -
|
| -void CFRunLoopAddObserverToAllModes(CFRunLoopRef rl,
|
| - CFRunLoopObserverRef observer) {
|
| - for (const CFStringRef& mode : kAllModes)
|
| - CFRunLoopAddObserver(rl, observer, mode);
|
| -}
|
| -
|
| -void CFRunLoopRemoveObserverFromAllModes(CFRunLoopRef rl,
|
| - CFRunLoopObserverRef observer) {
|
| - for (const CFStringRef& mode : kAllModes)
|
| - CFRunLoopRemoveObserver(rl, observer, mode);
|
| -}
|
| +// Mask that determines which modes in |kAllModes| to use.
|
| +enum { kCommonModeMask = 0x1, kAllModesMask = ~0 };
|
|
|
| void NoOp(void* info) {
|
| }
|
| @@ -196,8 +165,9 @@ void MessagePumpCFRunLoopBase::ChromeCFRunLoopTimerSetValid(
|
| }
|
|
|
| // Must be called on the run loop thread.
|
| -MessagePumpCFRunLoopBase::MessagePumpCFRunLoopBase()
|
| - : delegate_(NULL),
|
| +MessagePumpCFRunLoopBase::MessagePumpCFRunLoopBase(int mode_mask)
|
| + : mode_mask_(mode_mask),
|
| + delegate_(NULL),
|
| delayed_work_fire_time_(kCFTimeIntervalMax),
|
| timer_slack_(base::TIMER_SLACK_NONE),
|
| nesting_level_(0),
|
| @@ -220,7 +190,7 @@ MessagePumpCFRunLoopBase::MessagePumpCFRunLoopBase()
|
| 0, // priority
|
| RunDelayedWorkTimer,
|
| &timer_context);
|
| - CFRunLoopAddTimerToAllModes(run_loop_, delayed_work_timer_);
|
| + InvokeForAllModes(&CFRunLoopAddTimer, delayed_work_timer_);
|
|
|
| CFRunLoopSourceContext source_context = CFRunLoopSourceContext();
|
| source_context.info = this;
|
| @@ -228,19 +198,19 @@ MessagePumpCFRunLoopBase::MessagePumpCFRunLoopBase()
|
| work_source_ = CFRunLoopSourceCreate(NULL, // allocator
|
| 1, // priority
|
| &source_context);
|
| - CFRunLoopAddSourceToAllModes(run_loop_, work_source_);
|
| + InvokeForAllModes(&CFRunLoopAddSource, work_source_);
|
|
|
| source_context.perform = RunIdleWorkSource;
|
| idle_work_source_ = CFRunLoopSourceCreate(NULL, // allocator
|
| 2, // priority
|
| &source_context);
|
| - CFRunLoopAddSourceToAllModes(run_loop_, idle_work_source_);
|
| + InvokeForAllModes(&CFRunLoopAddSource, idle_work_source_);
|
|
|
| source_context.perform = RunNestingDeferredWorkSource;
|
| nesting_deferred_work_source_ = CFRunLoopSourceCreate(NULL, // allocator
|
| 0, // priority
|
| &source_context);
|
| - CFRunLoopAddSourceToAllModes(run_loop_, nesting_deferred_work_source_);
|
| + InvokeForAllModes(&CFRunLoopAddSource, nesting_deferred_work_source_);
|
|
|
| CFRunLoopObserverContext observer_context = CFRunLoopObserverContext();
|
| observer_context.info = this;
|
| @@ -250,7 +220,7 @@ MessagePumpCFRunLoopBase::MessagePumpCFRunLoopBase()
|
| 0, // priority
|
| PreWaitObserver,
|
| &observer_context);
|
| - CFRunLoopAddObserverToAllModes(run_loop_, pre_wait_observer_);
|
| + InvokeForAllModes(&CFRunLoopAddObserver, pre_wait_observer_);
|
|
|
| pre_source_observer_ = CFRunLoopObserverCreate(NULL, // allocator
|
| kCFRunLoopBeforeSources,
|
| @@ -258,7 +228,7 @@ MessagePumpCFRunLoopBase::MessagePumpCFRunLoopBase()
|
| 0, // priority
|
| PreSourceObserver,
|
| &observer_context);
|
| - CFRunLoopAddObserverToAllModes(run_loop_, pre_source_observer_);
|
| + InvokeForAllModes(&CFRunLoopAddObserver, pre_source_observer_);
|
|
|
| enter_exit_observer_ = CFRunLoopObserverCreate(NULL, // allocator
|
| kCFRunLoopEntry |
|
| @@ -267,34 +237,25 @@ MessagePumpCFRunLoopBase::MessagePumpCFRunLoopBase()
|
| 0, // priority
|
| EnterExitObserver,
|
| &observer_context);
|
| - CFRunLoopAddObserverToAllModes(run_loop_, enter_exit_observer_);
|
| + InvokeForAllModes(&CFRunLoopAddObserver, enter_exit_observer_);
|
| }
|
|
|
| // Ideally called on the run loop thread. If other run loops were running
|
| // lower on the run loop thread's stack when this object was created, the
|
| // same number of run loops must be running when this object is destroyed.
|
| MessagePumpCFRunLoopBase::~MessagePumpCFRunLoopBase() {
|
| - CFRunLoopRemoveObserverFromAllModes(run_loop_, enter_exit_observer_);
|
| - CFRelease(enter_exit_observer_);
|
| -
|
| - CFRunLoopRemoveObserverFromAllModes(run_loop_, pre_source_observer_);
|
| - CFRelease(pre_source_observer_);
|
| -
|
| - CFRunLoopRemoveObserverFromAllModes(run_loop_, pre_wait_observer_);
|
| - CFRelease(pre_wait_observer_);
|
| -
|
| - CFRunLoopRemoveSourceFromAllModes(run_loop_, nesting_deferred_work_source_);
|
| - CFRelease(nesting_deferred_work_source_);
|
| -
|
| - CFRunLoopRemoveSourceFromAllModes(run_loop_, idle_work_source_);
|
| - CFRelease(idle_work_source_);
|
| -
|
| - CFRunLoopRemoveSourceFromAllModes(run_loop_, work_source_);
|
| - CFRelease(work_source_);
|
| -
|
| - CFRunLoopRemoveTimerFromAllModes(run_loop_, delayed_work_timer_);
|
| + for (const CFRunLoopObserverRef& observer :
|
| + {enter_exit_observer_, pre_source_observer_, pre_wait_observer_}) {
|
| + InvokeForAllModes(&CFRunLoopRemoveObserver, observer);
|
| + CFRelease(observer);
|
| + }
|
| + for (const CFRunLoopSourceRef& source :
|
| + {nesting_deferred_work_source_, idle_work_source_, work_source_}) {
|
| + InvokeForAllModes(&CFRunLoopRemoveSource, source);
|
| + CFRelease(source);
|
| + }
|
| + InvokeForAllModes(&CFRunLoopRemoveTimer, delayed_work_timer_);
|
| CFRelease(delayed_work_timer_);
|
| -
|
| CFRelease(run_loop_);
|
| }
|
|
|
| @@ -367,6 +328,17 @@ void MessagePumpCFRunLoopBase::SetTimerSlack(TimerSlack timer_slack) {
|
| timer_slack_ = timer_slack;
|
| }
|
|
|
| +template <typename Argument>
|
| +void MessagePumpCFRunLoopBase::InvokeForAllModes(void method(CFRunLoopRef,
|
| + Argument,
|
| + CFStringRef),
|
| + Argument argument) {
|
| + for (size_t i = 0; i < arraysize(kAllModes); ++i) {
|
| + if (mode_mask_ & (0x1 << i))
|
| + method(run_loop_, argument, kAllModes[i]);
|
| + }
|
| +}
|
| +
|
| // Called from the run loop.
|
| // static
|
| void MessagePumpCFRunLoopBase::RunDelayedWorkTimer(CFRunLoopTimerRef timer,
|
| @@ -645,8 +617,7 @@ AutoreleasePoolType* MessagePumpCFRunLoopBase::CreateAutoreleasePool() {
|
| }
|
|
|
| MessagePumpCFRunLoop::MessagePumpCFRunLoop()
|
| - : quit_pending_(false) {
|
| -}
|
| + : MessagePumpCFRunLoopBase(kCommonModeMask), quit_pending_(false) {}
|
|
|
| MessagePumpCFRunLoop::~MessagePumpCFRunLoop() {}
|
|
|
| @@ -697,17 +668,17 @@ void MessagePumpCFRunLoop::EnterExitRunLoop(CFRunLoopActivity activity) {
|
| }
|
|
|
| MessagePumpNSRunLoop::MessagePumpNSRunLoop()
|
| - : keep_running_(true) {
|
| + : MessagePumpCFRunLoopBase(kCommonModeMask), keep_running_(true) {
|
| CFRunLoopSourceContext source_context = CFRunLoopSourceContext();
|
| source_context.perform = NoOp;
|
| quit_source_ = CFRunLoopSourceCreate(NULL, // allocator
|
| 0, // priority
|
| &source_context);
|
| - CFRunLoopAddSourceToAllModes(run_loop(), quit_source_);
|
| + InvokeForAllModes(&CFRunLoopAddSource, quit_source_);
|
| }
|
|
|
| MessagePumpNSRunLoop::~MessagePumpNSRunLoop() {
|
| - CFRunLoopRemoveSourceFromAllModes(run_loop(), quit_source_);
|
| + InvokeForAllModes(&CFRunLoopRemoveSource, quit_source_);
|
| CFRelease(quit_source_);
|
| }
|
|
|
| @@ -729,8 +700,7 @@ void MessagePumpNSRunLoop::Quit() {
|
|
|
| #if defined(OS_IOS)
|
| MessagePumpUIApplication::MessagePumpUIApplication()
|
| - : run_loop_(NULL) {
|
| -}
|
| + : MessagePumpCFRunLoopBase(kCommonModeMask), run_loop_(NULL) {}
|
|
|
| MessagePumpUIApplication::~MessagePumpUIApplication() {}
|
|
|
| @@ -752,9 +722,9 @@ void MessagePumpUIApplication::Attach(Delegate* delegate) {
|
| #else
|
|
|
| MessagePumpNSApplication::MessagePumpNSApplication()
|
| - : keep_running_(true),
|
| - running_own_loop_(false) {
|
| -}
|
| + : MessagePumpCFRunLoopBase(kAllModesMask),
|
| + keep_running_(true),
|
| + running_own_loop_(false) {}
|
|
|
| MessagePumpNSApplication::~MessagePumpNSApplication() {}
|
|
|
|
|