diff options
Diffstat (limited to 'gdk/quartz')
-rw-r--r-- | gdk/quartz/gdkeventloop-quartz.c | 19 |
1 files changed, 9 insertions, 10 deletions
diff --git a/gdk/quartz/gdkeventloop-quartz.c b/gdk/quartz/gdkeventloop-quartz.c index a2a2cd3153..39f5c0aee3 100644 --- a/gdk/quartz/gdkeventloop-quartz.c +++ b/gdk/quartz/gdkeventloop-quartz.c @@ -632,21 +632,20 @@ gdk_event_check (GSource *source) GDK_THREADS_ENTER (); - /* XXX: This check isn't right it won't handle a recursive GLib main - * loop run within an outer CFRunLoop run. Such loops will pile up - * memory. Fixing this requires setting a flag *only* when we call - * g_main_context_check() from within the run loop iteraton code, - * and also maintaining our own stack of run loops... allocating and - * releasing NSAutoReleasePools not properly nested with CFRunLoop - * runs seems to cause problems. - */ - if (current_loop_level == 0) +/* 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 release]; autorelease_pool = [[NSAutoreleasePool alloc] init]; } - + retval = (_gdk_event_queue_find_first (_gdk_display) != NULL || _gdk_quartz_event_loop_check_pending ()); |