]> Pileus Git - ~andy/gtk/commitdiff
Fix refresh of static autorelease_pool so that it doesn't happen in gtk-nested loops.
authorJohn Ralls <jralls@ceridwen.us>
Sun, 2 Jan 2011 18:23:20 +0000 (10:23 -0800)
committerJohn Ralls <jralls@ceridwen.us>
Sun, 2 Jan 2011 18:23:20 +0000 (10:23 -0800)
gdk/quartz/gdkeventloop-quartz.c

index a2a2cd315374cdd6976c3fc7872bed490c829462..39f5c0aee34cb4174862e13de12a25ef37868753 100644 (file)
@@ -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 ());