[glib/wip/notify-performance: 8/8] [notify] dispatch 'notify' directly if not frozen



commit 51c9c3a863bfa7044ea7bea06c55806d554324b6
Author: Ryan Lortie <desrt desrt ca>
Date:   Wed Nov 16 13:02:23 2011 +0000

    [notify] dispatch 'notify' directly if not frozen
    
    Avoid the notify queue in the case that we're not already frozen.

 gobject/gobject.c |   19 +++++++++++++++----
 1 files changed, 15 insertions(+), 4 deletions(-)
---
diff --git a/gobject/gobject.c b/gobject/gobject.c
index f2a959c..723ea34 100644
--- a/gobject/gobject.c
+++ b/gobject/gobject.c
@@ -978,16 +978,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);
     }
 }
 



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