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_); |
} |