[notify] dispatch 'notify' directly if not frozen
authorRyan Lortie <desrt@desrt.ca>
Wed, 16 Nov 2011 13:02:23 +0000 (13:02 +0000)
committerRyan Lortie <desrt@desrt.ca>
Wed, 16 Nov 2011 17:50:13 +0000 (17:50 +0000)
Avoid the notify queue in the case that we're not already frozen.

gobject/gobject.c

index 85cad66..0d20a26 100644 (file)
@@ -1090,16 +1090,27 @@ static inline void
 g_object_notify_by_spec_internal (GObject    *object,
                                  GParamSpec *pspec)
 {
-  GObjectNotifyQueue *nqueue;
   GParamSpec *notify_pspec;
 
   notify_pspec = get_notify_pspec (pspec);
 
   if (notify_pspec != NULL)
     {
-      nqueue = g_object_notify_queue_freeze (object, FALSE);
-      g_object_notify_queue_add (object, nqueue, notify_pspec);
-      g_object_notify_queue_thaw (object, nqueue);
+      GObjectNotifyQueue *nqueue;
+
+      /* conditional freeze: only increase freeze count if already frozen */
+      nqueue = g_object_notify_queue_freeze (object, TRUE);
+
+      if (nqueue != NULL)
+        {
+          /* we're frozen, so add to the queue and release our freeze */
+          g_object_notify_queue_add (object, nqueue, notify_pspec);
+          g_object_notify_queue_thaw (object, nqueue);
+        }
+      else
+        /* not frozen, so just dispatch the notification directly */
+        G_OBJECT_GET_CLASS (object)
+          ->dispatch_properties_changed (object, 1, &notify_pspec);
     }
 }