[gtk+] Bug 701571 NSApp doesn't notice NSWindow destruction



commit 31c2e95cbd27ddd45074c276623c6b1e7d7a3ebf
Author: John Ralls <jralls ceridwen us>
Date:   Sat Aug 10 14:15:19 2013 -0700

    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

 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 0339bea..2c1ca0b 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);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]