Chromium Code Reviews| 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 25aac17f2672c78b503f6bd9aa35b8be95a6bcc3..97b7aa2d6d9dd9b02f87ae3e2fe17b3a2b1142b7 100644 |
| --- a/base/message_loop/message_pump_mac.mm |
| +++ b/base/message_loop/message_pump_mac.mm |
| @@ -68,6 +68,10 @@ void SetTimerTolerance(CFRunLoopTimerRef timer, CFTimeInterval tolerance) { |
| namespace base { |
| +// static |
| +const CFStringRef kMessageLoopExclusiveRunLoopMode = |
| + CFSTR("kMessageLoopExclusiveRunLoopMode"); |
| + |
| // A scoper for autorelease pools created from message pump run loops. |
| // Avoids dirtying up the ScopedNSAutoreleasePool interface for the rare |
| // case where an autorelease pool needs to be passed in. |
| @@ -124,9 +128,9 @@ class MessagePumpInstrumentation { |
| 0, // order |
| &MessagePumpInstrumentation::TimerFired, |
| &timer_context)); |
| - CFRunLoopAddTimer(CFRunLoopGetCurrent(), |
| - timer_, |
| - kCFRunLoopCommonModes); |
| + CFRunLoopAddTimer(CFRunLoopGetCurrent(), timer_, kCFRunLoopCommonModes); |
| + CFRunLoopAddTimer(CFRunLoopGetCurrent(), timer_, |
| + kMessageLoopExclusiveRunLoopMode); |
| } |
| // Used to track kCFRunLoopEntry. |
| @@ -333,6 +337,8 @@ MessagePumpCFRunLoopBase::MessagePumpCFRunLoopBase() |
| RunDelayedWorkTimer, |
| &timer_context); |
| CFRunLoopAddTimer(run_loop_, delayed_work_timer_, kCFRunLoopCommonModes); |
| + CFRunLoopAddTimer(run_loop_, delayed_work_timer_, |
|
Mark Mentovai
2014/06/12 16:17:13
There’s enough duplication now that I think we sho
ccameron
2014/06/12 17:10:40
Yeah, I was on the bubble about which way to go --
|
| + kMessageLoopExclusiveRunLoopMode); |
| CFRunLoopSourceContext source_context = CFRunLoopSourceContext(); |
| source_context.info = this; |
| @@ -341,12 +347,16 @@ MessagePumpCFRunLoopBase::MessagePumpCFRunLoopBase() |
| 1, // priority |
| &source_context); |
| CFRunLoopAddSource(run_loop_, work_source_, kCFRunLoopCommonModes); |
| + CFRunLoopAddSource(run_loop_, work_source_, |
| + kMessageLoopExclusiveRunLoopMode); |
| source_context.perform = RunIdleWorkSource; |
| idle_work_source_ = CFRunLoopSourceCreate(NULL, // allocator |
| 2, // priority |
| &source_context); |
| CFRunLoopAddSource(run_loop_, idle_work_source_, kCFRunLoopCommonModes); |
| + CFRunLoopAddSource( |
| + run_loop_, idle_work_source_, kCFRunLoopCommonModes); |
| source_context.perform = RunNestingDeferredWorkSource; |
| nesting_deferred_work_source_ = CFRunLoopSourceCreate(NULL, // allocator |
| @@ -354,6 +364,8 @@ MessagePumpCFRunLoopBase::MessagePumpCFRunLoopBase() |
| &source_context); |
| CFRunLoopAddSource(run_loop_, nesting_deferred_work_source_, |
| kCFRunLoopCommonModes); |
| + CFRunLoopAddSource(run_loop_, nesting_deferred_work_source_, |
| + kMessageLoopExclusiveRunLoopMode); |
| CFRunLoopObserverContext observer_context = CFRunLoopObserverContext(); |
| observer_context.info = this; |
| @@ -365,6 +377,8 @@ MessagePumpCFRunLoopBase::MessagePumpCFRunLoopBase() |
| StartOrEndWaitObserver, |
| &observer_context); |
| CFRunLoopAddObserver(run_loop_, pre_wait_observer_, kCFRunLoopCommonModes); |
| + CFRunLoopAddObserver(run_loop_, pre_wait_observer_, |
| + kMessageLoopExclusiveRunLoopMode); |
| pre_source_observer_ = CFRunLoopObserverCreate(NULL, // allocator |
| kCFRunLoopBeforeSources, |
| @@ -373,6 +387,8 @@ MessagePumpCFRunLoopBase::MessagePumpCFRunLoopBase() |
| PreSourceObserver, |
| &observer_context); |
| CFRunLoopAddObserver(run_loop_, pre_source_observer_, kCFRunLoopCommonModes); |
| + CFRunLoopAddObserver(run_loop_, pre_source_observer_, |
| + kMessageLoopExclusiveRunLoopMode); |
| enter_exit_observer_ = CFRunLoopObserverCreate(NULL, // allocator |
| kCFRunLoopEntry | |
| @@ -382,6 +398,8 @@ MessagePumpCFRunLoopBase::MessagePumpCFRunLoopBase() |
| EnterExitObserver, |
| &observer_context); |
| CFRunLoopAddObserver(run_loop_, enter_exit_observer_, kCFRunLoopCommonModes); |
| + CFRunLoopAddObserver(run_loop_, enter_exit_observer_, |
| + kMessageLoopExclusiveRunLoopMode); |
| } |
| // Ideally called on the run loop thread. If other run loops were running |
| @@ -390,27 +408,41 @@ MessagePumpCFRunLoopBase::MessagePumpCFRunLoopBase() |
| MessagePumpCFRunLoopBase::~MessagePumpCFRunLoopBase() { |
| CFRunLoopRemoveObserver(run_loop_, enter_exit_observer_, |
| kCFRunLoopCommonModes); |
| + CFRunLoopRemoveObserver(run_loop_, enter_exit_observer_, |
| + kMessageLoopExclusiveRunLoopMode); |
| CFRelease(enter_exit_observer_); |
| CFRunLoopRemoveObserver(run_loop_, pre_source_observer_, |
| kCFRunLoopCommonModes); |
| + CFRunLoopRemoveObserver(run_loop_, pre_source_observer_, |
| + kMessageLoopExclusiveRunLoopMode); |
| CFRelease(pre_source_observer_); |
| CFRunLoopRemoveObserver(run_loop_, pre_wait_observer_, |
| kCFRunLoopCommonModes); |
| + CFRunLoopRemoveObserver(run_loop_, pre_wait_observer_, |
| + kMessageLoopExclusiveRunLoopMode); |
| CFRelease(pre_wait_observer_); |
| CFRunLoopRemoveSource(run_loop_, nesting_deferred_work_source_, |
| kCFRunLoopCommonModes); |
| + CFRunLoopRemoveSource(run_loop_, nesting_deferred_work_source_, |
| + kMessageLoopExclusiveRunLoopMode); |
| CFRelease(nesting_deferred_work_source_); |
| CFRunLoopRemoveSource(run_loop_, idle_work_source_, kCFRunLoopCommonModes); |
| + CFRunLoopRemoveSource(run_loop_, idle_work_source_, |
| + kMessageLoopExclusiveRunLoopMode); |
| CFRelease(idle_work_source_); |
| CFRunLoopRemoveSource(run_loop_, work_source_, kCFRunLoopCommonModes); |
| + CFRunLoopRemoveSource(run_loop_, work_source_, |
| + kMessageLoopExclusiveRunLoopMode); |
| CFRelease(work_source_); |
| CFRunLoopRemoveTimer(run_loop_, delayed_work_timer_, kCFRunLoopCommonModes); |
| + CFRunLoopRemoveTimer(run_loop_, delayed_work_timer_, |
| + kMessageLoopExclusiveRunLoopMode); |
| CFRelease(delayed_work_timer_); |
| CFRelease(run_loop_); |
| @@ -800,10 +832,14 @@ MessagePumpNSRunLoop::MessagePumpNSRunLoop() |
| 0, // priority |
| &source_context); |
| CFRunLoopAddSource(run_loop(), quit_source_, kCFRunLoopCommonModes); |
| + CFRunLoopAddSource(run_loop(), quit_source_, |
| + kMessageLoopExclusiveRunLoopMode); |
| } |
| MessagePumpNSRunLoop::~MessagePumpNSRunLoop() { |
| CFRunLoopRemoveSource(run_loop(), quit_source_, kCFRunLoopCommonModes); |
| + CFRunLoopRemoveSource(run_loop(), quit_source_, |
| + kMessageLoopExclusiveRunLoopMode); |
| CFRelease(quit_source_); |
| } |