diff options
author | John Ralls <jralls@ceridwen.us> | 2013-08-10 14:15:19 -0700 |
---|---|---|
committer | John Ralls <jralls@ceridwen.us> | 2013-08-11 10:43:47 -0700 |
commit | 31c2e95cbd27ddd45074c276623c6b1e7d7a3ebf (patch) | |
tree | a0c0e6d527971ef3b8aec4a4af9843ced36f68d9 /gdk/quartz | |
parent | b0ff57538a5236a146b3b1e3c4729cc431406860 (diff) | |
download | gtk+-31c2e95cbd27ddd45074c276623c6b1e7d7a3ebf.tar.gz |
Bug 701571 NSApp doesn't notice NSWindow destruction
Part 1 of the fix; part 2 awaits Glib developer approval (see
https://bugzilla.gnome.org/show_bug.cgi?id=704374) and is more
correctly associated with
https://bugzilla.gnome.org/show_bug.cgi?id=674108
Diffstat (limited to 'gdk/quartz')
-rw-r--r-- | gdk/quartz/gdkeventloop-quartz.c | 42 |
1 files changed, 26 insertions, 16 deletions
diff --git a/gdk/quartz/gdkeventloop-quartz.c b/gdk/quartz/gdkeventloop-quartz.c index 0339bea174..2c1ca0b467 100644 --- a/gdk/quartz/gdkeventloop-quartz.c +++ b/gdk/quartz/gdkeventloop-quartz.c @@ -618,7 +618,32 @@ gdk_event_prepare (GSource *source, gboolean retval; gdk_threads_enter (); - + + /* The prepare stage is the stage before the main loop starts polling + * and dispatching events. The autorelease poll is drained here for + * the preceding main loop iteration or, in case of the first iteration, + * for the operations carried out between event loop initialization and + * this first iteration. + * + * The autorelease poll must only be drained when the following conditions + * apply: + * - We are at the base CFRunLoop level (indicated by current_loop_level), + * - We are at the base g_main_loop level (indicated by + * g_main_depth()) + * - We are at the base poll_func level (indicated by getting events). + * + * Messing with the autorelease pool at any level of nesting can cause access + * to deallocated memory because autorelease_pool is static and releasing a + * pool will cause all pools allocated inside of it to be released as well. + */ + if (current_loop_level == 0 && g_main_depth() == 0 && getting_events == 0) + { + if (autorelease_pool) + [autorelease_pool drain]; + + autorelease_pool = [[NSAutoreleasePool alloc] init]; + } + *timeout = -1; if (_gdk_display->event_pause_count > 0) @@ -659,21 +684,6 @@ gdk_event_dispatch (GSource *source, gdk_threads_enter (); - /* Refresh the autorelease pool if we're at the base CFRunLoop level - * (indicated by current_loop_level) and the base g_main_loop level - * (indicated by g_main_depth()). Messing with the autorelease pool at - * any level of nesting can cause access to deallocated memory because - * autorelease_pool is static and releasing a pool will cause all pools - * allocated inside of it to be released as well. - */ - if (current_loop_level == 0 && g_main_depth() == 0) - { - if (autorelease_pool) - [autorelease_pool drain]; - - autorelease_pool = [[NSAutoreleasePool alloc] init]; - } - _gdk_quartz_display_queue_events (_gdk_display); event = _gdk_event_unqueue (_gdk_display); |