Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 // The basis for all native run loops on the Mac is the CFRunLoop. It can be | 5 // The basis for all native run loops on the Mac is the CFRunLoop. It can be |
| 6 // used directly, it can be used as the driving force behind the similar | 6 // used directly, it can be used as the driving force behind the similar |
| 7 // Foundation NSRunLoop, and it can be used to implement higher-level event | 7 // Foundation NSRunLoop, and it can be used to implement higher-level event |
| 8 // loops such as the NSApplication event loop. | 8 // loops such as the NSApplication event loop. |
| 9 // | 9 // |
| 10 // This file introduces a basic CFRunLoop-based implementation of the | 10 // This file introduces a basic CFRunLoop-based implementation of the |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 77 #else // !defined(__OBJC__) || __has_feature(objc_arc) | 77 #else // !defined(__OBJC__) || __has_feature(objc_arc) |
| 78 typedef NSAutoreleasePool AutoreleasePoolType; | 78 typedef NSAutoreleasePool AutoreleasePoolType; |
| 79 #endif // !defined(__OBJC__) || __has_feature(objc_arc) | 79 #endif // !defined(__OBJC__) || __has_feature(objc_arc) |
| 80 | 80 |
| 81 class BASE_EXPORT MessagePumpCFRunLoopBase : public MessagePump { | 81 class BASE_EXPORT MessagePumpCFRunLoopBase : public MessagePump { |
| 82 // Needs access to CreateAutoreleasePool. | 82 // Needs access to CreateAutoreleasePool. |
| 83 friend class MessagePumpScopedAutoreleasePool; | 83 friend class MessagePumpScopedAutoreleasePool; |
| 84 friend class TestMessagePumpCFRunLoopBase; | 84 friend class TestMessagePumpCFRunLoopBase; |
| 85 | 85 |
| 86 public: | 86 public: |
| 87 MessagePumpCFRunLoopBase(); | 87 explicit MessagePumpCFRunLoopBase(int mode_mask); |
|
Mark Mentovai
2017/05/19 03:29:13
Since you aren’t providing the enum that has masky
tapted
2017/05/19 06:28:15
Done. Made this constructor protected also and fix
| |
| 88 ~MessagePumpCFRunLoopBase() override; | 88 ~MessagePumpCFRunLoopBase() override; |
| 89 | 89 |
| 90 // Subclasses should implement the work they need to do in MessagePump::Run | 90 // Subclasses should implement the work they need to do in MessagePump::Run |
| 91 // in the DoRun method. MessagePumpCFRunLoopBase::Run calls DoRun directly. | 91 // in the DoRun method. MessagePumpCFRunLoopBase::Run calls DoRun directly. |
| 92 // This arrangement is used because MessagePumpCFRunLoopBase needs to set | 92 // This arrangement is used because MessagePumpCFRunLoopBase needs to set |
| 93 // up and tear down things before and after the "meat" of DoRun. | 93 // up and tear down things before and after the "meat" of DoRun. |
| 94 void Run(Delegate* delegate) override; | 94 void Run(Delegate* delegate) override; |
| 95 virtual void DoRun(Delegate* delegate) = 0; | 95 virtual void DoRun(Delegate* delegate) = 0; |
| 96 | 96 |
| 97 void ScheduleWork() override; | 97 void ScheduleWork() override; |
| 98 void ScheduleDelayedWork(const TimeTicks& delayed_work_time) override; | 98 void ScheduleDelayedWork(const TimeTicks& delayed_work_time) override; |
| 99 void SetTimerSlack(TimerSlack timer_slack) override; | 99 void SetTimerSlack(TimerSlack timer_slack) override; |
| 100 | 100 |
| 101 protected: | 101 protected: |
| 102 // Accessors for private data members to be used by subclasses. | 102 // Accessors for private data members to be used by subclasses. |
| 103 CFRunLoopRef run_loop() const { return run_loop_; } | 103 CFRunLoopRef run_loop() const { return run_loop_; } |
| 104 int nesting_level() const { return nesting_level_; } | 104 int nesting_level() const { return nesting_level_; } |
| 105 int run_nesting_level() const { return run_nesting_level_; } | 105 int run_nesting_level() const { return run_nesting_level_; } |
| 106 | 106 |
| 107 // Sets this pump's delegate. Signals the appropriate sources if | 107 // Sets this pump's delegate. Signals the appropriate sources if |
| 108 // |delegateless_work_| is true. |delegate| can be NULL. | 108 // |delegateless_work_| is true. |delegate| can be NULL. |
| 109 void SetDelegate(Delegate* delegate); | 109 void SetDelegate(Delegate* delegate); |
| 110 | 110 |
| 111 // Return an autorelease pool to wrap around any work being performed. | 111 // Return an autorelease pool to wrap around any work being performed. |
| 112 // In some cases, CreateAutoreleasePool may return nil intentionally to | 112 // In some cases, CreateAutoreleasePool may return nil intentionally to |
| 113 // preventing an autorelease pool from being created, allowing any | 113 // preventing an autorelease pool from being created, allowing any |
| 114 // objects autoreleased by work to fall into the current autorelease pool. | 114 // objects autoreleased by work to fall into the current autorelease pool. |
| 115 virtual AutoreleasePoolType* CreateAutoreleasePool(); | 115 virtual AutoreleasePoolType* CreateAutoreleasePool(); |
| 116 | 116 |
| 117 // Invokes method(run_loop_, arg, mode) for all the modes in |mode_mask_|. | |
| 118 template <typename Argument> | |
| 119 void InvokeForAllModes(void method(CFRunLoopRef, Argument, CFStringRef), | |
|
Mark Mentovai
2017/05/19 03:29:13
More a function than a method?
Mark Mentovai
2017/05/19 03:29:13
Since it’s restricted to mode_mask_, it shouldn’t
tapted
2017/05/19 06:28:15
Done.
tapted
2017/05/19 06:28:15
Done.
| |
| 120 Argument argument); | |
| 121 | |
| 117 private: | 122 private: |
| 118 // Marking timers as invalid at the right time helps significantly reduce | 123 // Marking timers as invalid at the right time helps significantly reduce |
| 119 // power use (see the comment in RunDelayedWorkTimer()), however there is no | 124 // power use (see the comment in RunDelayedWorkTimer()), however there is no |
| 120 // public API for doing so. CFRuntime.h states that CFRuntimeBase, upon which | 125 // public API for doing so. CFRuntime.h states that CFRuntimeBase, upon which |
| 121 // the above timer invalidation functions are based, can change from release | 126 // the above timer invalidation functions are based, can change from release |
| 122 // to release and should not be accessed directly (this struct last changed at | 127 // to release and should not be accessed directly (this struct last changed at |
| 123 // least in 2008 in CF-476). | 128 // least in 2008 in CF-476). |
| 124 // | 129 // |
| 125 // This function uses private API to modify a test timer's valid state and | 130 // This function uses private API to modify a test timer's valid state and |
| 126 // uses public API to confirm that the private API changed the right bit. | 131 // uses public API to confirm that the private API changed the right bit. |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 183 CFRunLoopActivity activity, void* info); | 188 CFRunLoopActivity activity, void* info); |
| 184 | 189 |
| 185 // Called by EnterExitObserver after performing maintenance on nesting_level_. | 190 // Called by EnterExitObserver after performing maintenance on nesting_level_. |
| 186 // This allows subclasses an opportunity to perform additional processing on | 191 // This allows subclasses an opportunity to perform additional processing on |
| 187 // the basis of run loops starting and stopping. | 192 // the basis of run loops starting and stopping. |
| 188 virtual void EnterExitRunLoop(CFRunLoopActivity activity); | 193 virtual void EnterExitRunLoop(CFRunLoopActivity activity); |
| 189 | 194 |
| 190 // The thread's run loop. | 195 // The thread's run loop. |
| 191 CFRunLoopRef run_loop_; | 196 CFRunLoopRef run_loop_; |
| 192 | 197 |
| 198 // Bitmask controlling the run loop modes in which posted tasks may run. | |
| 199 const int mode_mask_; | |
| 200 | |
| 193 // The timer, sources, and observers are described above alongside their | 201 // The timer, sources, and observers are described above alongside their |
| 194 // callbacks. | 202 // callbacks. |
| 195 CFRunLoopTimerRef delayed_work_timer_; | 203 CFRunLoopTimerRef delayed_work_timer_; |
| 196 CFRunLoopSourceRef work_source_; | 204 CFRunLoopSourceRef work_source_; |
| 197 CFRunLoopSourceRef idle_work_source_; | 205 CFRunLoopSourceRef idle_work_source_; |
| 198 CFRunLoopSourceRef nesting_deferred_work_source_; | 206 CFRunLoopSourceRef nesting_deferred_work_source_; |
| 199 CFRunLoopObserverRef pre_wait_observer_; | 207 CFRunLoopObserverRef pre_wait_observer_; |
| 200 CFRunLoopObserverRef pre_source_observer_; | 208 CFRunLoopObserverRef pre_source_observer_; |
| 201 CFRunLoopObserverRef enter_exit_observer_; | 209 CFRunLoopObserverRef enter_exit_observer_; |
| 202 | 210 |
| (...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 362 DISALLOW_IMPLICIT_CONSTRUCTORS(MessagePumpMac); | 370 DISALLOW_IMPLICIT_CONSTRUCTORS(MessagePumpMac); |
| 363 }; | 371 }; |
| 364 | 372 |
| 365 // Tasks posted to the message loop are posted under this mode, as well | 373 // Tasks posted to the message loop are posted under this mode, as well |
| 366 // as kCFRunLoopCommonModes. | 374 // as kCFRunLoopCommonModes. |
| 367 extern const CFStringRef BASE_EXPORT kMessageLoopExclusiveRunLoopMode; | 375 extern const CFStringRef BASE_EXPORT kMessageLoopExclusiveRunLoopMode; |
| 368 | 376 |
| 369 } // namespace base | 377 } // namespace base |
| 370 | 378 |
| 371 #endif // BASE_MESSAGE_LOOP_MESSAGE_PUMP_MAC_H_ | 379 #endif // BASE_MESSAGE_LOOP_MESSAGE_PUMP_MAC_H_ |
| OLD | NEW |