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

Side by Side Diff: base/message_pump_mac.h

Issue 339095: DeferredAutoreleasePool didn't work on Snow Leopard (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 11 years, 1 month 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_pump_mac.mm » ('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 (c) 2009 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2008 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
11 // MessagePump interface called CFRunLoopBase. CFRunLoopBase contains all 11 // MessagePump interface called CFRunLoopBase. CFRunLoopBase contains all
(...skipping 16 matching lines...) Expand all
28 // called on. 28 // called on.
29 29
30 #ifndef BASE_MESSAGE_PUMP_MAC_H_ 30 #ifndef BASE_MESSAGE_PUMP_MAC_H_
31 #define BASE_MESSAGE_PUMP_MAC_H_ 31 #define BASE_MESSAGE_PUMP_MAC_H_
32 32
33 #include "base/message_pump.h" 33 #include "base/message_pump.h"
34 34
35 #include <CoreFoundation/CoreFoundation.h> 35 #include <CoreFoundation/CoreFoundation.h>
36 #include <IOKit/IOKitLib.h> 36 #include <IOKit/IOKitLib.h>
37 37
38 #if defined(__OBJC__)
39 @class NSAutoreleasePool;
40 #else // __OBJC__
41 class NSAutoreleasePool;
42 #endif // __OBJC__
43
44
45 namespace base { 38 namespace base {
46 39
47 class Time; 40 class Time;
48 41
49 class MessagePumpCFRunLoopBase : public MessagePump { 42 class MessagePumpCFRunLoopBase : public MessagePump {
50 public: 43 public:
51 MessagePumpCFRunLoopBase(); 44 MessagePumpCFRunLoopBase();
52 virtual ~MessagePumpCFRunLoopBase(); 45 virtual ~MessagePumpCFRunLoopBase();
53 46
54 // Subclasses should implement the work they need to do in MessagePump::Run 47 // Subclasses should implement the work they need to do in MessagePump::Run
55 // in the DoRun method. MessagePumpCFRunLoopBase::Run calls DoRun directly. 48 // in the DoRun method. MessagePumpCFRunLoopBase::Run calls DoRun directly.
56 // This arrangement is used because MessagePumpCFRunLoopBase needs to set 49 // This arrangement is used because MessagePumpCFRunLoopBase needs to set
57 // up and tear down things before and after the "meat" of DoRun. 50 // up and tear down things before and after the "meat" of DoRun.
58 virtual void Run(Delegate* delegate); 51 virtual void Run(Delegate* delegate);
59 virtual void DoRun(Delegate* delegate) = 0; 52 virtual void DoRun(Delegate* delegate) = 0;
60 53
61 virtual void ScheduleWork(); 54 virtual void ScheduleWork();
62 virtual void ScheduleDelayedWork(const Time& delayed_work_time); 55 virtual void ScheduleDelayedWork(const Time& delayed_work_time);
63 56
64 protected: 57 protected:
65 // Accessors for private data members to be used by subclasses. 58 // Accessors for private data members to be used by subclasses.
66 CFRunLoopRef run_loop() const { return run_loop_; } 59 CFRunLoopRef run_loop() const { return run_loop_; }
67 int nesting_level() const { return nesting_level_; } 60 int nesting_level() const { return nesting_level_; }
68 int run_nesting_level() const { return run_nesting_level_; } 61 int run_nesting_level() const { return run_nesting_level_; }
69 62
70 // Factory method for creating an autorelease pool. Not all message
71 // pumps work with autorelease pools in the same way.
72 virtual NSAutoreleasePool* CreateAutoreleasePool();
73
74 private: 63 private:
75 // Timer callback scheduled by ScheduleDelayedWork. This does not do any 64 // Timer callback scheduled by ScheduleDelayedWork. This does not do any
76 // work, but it signals delayed_work_source_ so that delayed work can be 65 // work, but it signals delayed_work_source_ so that delayed work can be
77 // performed within the appropriate priority constraints. 66 // performed within the appropriate priority constraints.
78 static void RunDelayedWorkTimer(CFRunLoopTimerRef timer, void* info); 67 static void RunDelayedWorkTimer(CFRunLoopTimerRef timer, void* info);
79 68
80 // Perform highest-priority work. This is associated with work_source_ 69 // Perform highest-priority work. This is associated with work_source_
81 // signalled by ScheduleWork. The static method calls the instance method; 70 // signalled by ScheduleWork. The static method calls the instance method;
82 // the instance method returns true if work was done. 71 // the instance method returns true if work was done.
83 static void RunWorkSource(void* info); 72 static void RunWorkSource(void* info);
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after
227 // is called, to cause the loop to wake up so that it can stop. 216 // is called, to cause the loop to wake up so that it can stop.
228 CFRunLoopSourceRef quit_source_; 217 CFRunLoopSourceRef quit_source_;
229 218
230 // False after Quit is called. 219 // False after Quit is called.
231 bool keep_running_; 220 bool keep_running_;
232 221
233 DISALLOW_COPY_AND_ASSIGN(MessagePumpNSRunLoop); 222 DISALLOW_COPY_AND_ASSIGN(MessagePumpNSRunLoop);
234 }; 223 };
235 224
236 class MessagePumpNSApplication : public MessagePumpCFRunLoopBase { 225 class MessagePumpNSApplication : public MessagePumpCFRunLoopBase {
237 // ObjC objects and C++ objects can't be friends, so this function
238 // will act as a friendly trampoline for
239 // MessagePumpNSAppDeferredAutoReleasePool to call
240 // set_needs_event_loop_wakeup.
241 friend void SetNeedsEventLoopWakeUpTrue(MessagePumpNSApplication* pump);
242
243 public: 226 public:
244 MessagePumpNSApplication(); 227 MessagePumpNSApplication();
245 228
246 virtual void DoRun(Delegate* delegate); 229 virtual void DoRun(Delegate* delegate);
247 virtual void Quit(); 230 virtual void Quit();
248 231
249 protected:
250 // MessagePumpNSApplications need a special autorelease pool that works
251 // correctly when nested inside another autorelease pool.
252 virtual NSAutoreleasePool* CreateAutoreleasePool();
253
254 // Sets a flag that will trigger the sending of an NSEvent to wake up the
255 // NSApplication event loop when the run loop exits.
256 void set_needs_event_loop_wake_up_true() {
257 needs_event_loop_wake_up_ = true;
258 }
259
260 private: 232 private:
261 virtual void EnterExitRunLoop(CFRunLoopActivity activity);
262
263 // Send a null event through to the event loop if necessary.
264 void WakeUpEventLoop();
265
266 // False after Quit is called. 233 // False after Quit is called.
267 bool keep_running_; 234 bool keep_running_;
268 235
269 // True if DoRun is managing its own run loop as opposed to letting 236 // True if DoRun is managing its own run loop as opposed to letting
270 // -[NSApplication run] handle it. The outermost run loop in the application 237 // -[NSApplication run] handle it. The outermost run loop in the application
271 // is managed by -[NSApplication run], inner run loops are handled by a loop 238 // is managed by -[NSApplication run], inner run loops are handled by a loop
272 // in DoRun. 239 // in DoRun.
273 bool running_own_loop_; 240 bool running_own_loop_;
274 241
275 // True if an event should be sent to the event loop to cause it to spin
276 // when the run loop is exiting.
277 bool needs_event_loop_wake_up_;
278
279 DISALLOW_COPY_AND_ASSIGN(MessagePumpNSApplication); 242 DISALLOW_COPY_AND_ASSIGN(MessagePumpNSApplication);
280 }; 243 };
281 244
282 class MessagePumpMac { 245 class MessagePumpMac {
283 public: 246 public:
284 // Returns a new instance of MessagePumpNSApplication if called on the main 247 // Returns a new instance of MessagePumpNSApplication if called on the main
285 // thread. Otherwise, returns a new instance of MessagePumpNSRunLoop. 248 // thread. Otherwise, returns a new instance of MessagePumpNSRunLoop.
286 static MessagePump* Create(); 249 static MessagePump* Create();
287 250
288 private: 251 private:
289 DISALLOW_IMPLICIT_CONSTRUCTORS(MessagePumpMac); 252 DISALLOW_IMPLICIT_CONSTRUCTORS(MessagePumpMac);
290 }; 253 };
291 254
292 } // namespace base 255 } // namespace base
293 256
294 #endif // BASE_MESSAGE_PUMP_MAC_H_ 257 #endif // BASE_MESSAGE_PUMP_MAC_H_
OLDNEW
« no previous file with comments | « no previous file | base/message_pump_mac.mm » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698