[glib/gobject-speedups3: 2/2] Reduce locking overhead for param specs




commit 798873218f5b47aea9cd454e1cfef75701cacf34
Author: Matthias Clasen <mclasen redhat com>
Date:   Fri May 20 08:01:08 2022 -0400

    Reduce locking overhead for param specs
    
    Only take the pspec pool mutex once per
    g_object_new or g_object_set call.

 gobject/gobject.c | 24 ++++++++++++++++++------
 1 file changed, 18 insertions(+), 6 deletions(-)
---
diff --git a/gobject/gobject.c b/gobject/gobject.c
index d35a94bb1d..63b2246e21 100644
--- a/gobject/gobject.c
+++ b/gobject/gobject.c
@@ -2354,12 +2354,14 @@ g_object_new_valist (GType        object_type,
 
       name = first_property_name;
 
+      g_param_spec_pool_acquire (pspec_pool);
+
       do
         {
           gchar *error = NULL;
           GParamSpec *pspec;
 
-          pspec = g_param_spec_pool_lookup (pspec_pool, name, object_type, TRUE);
+          pspec = g_param_spec_pool_find (pspec_pool, name, object_type, TRUE);
 
           if (!g_object_new_is_valid_property (object_type, pspec, name, params, n_params))
             break;
@@ -2408,6 +2410,8 @@ g_object_new_valist (GType        object_type,
         }
       while ((name = va_arg (var_args, const gchar *)));
 
+      g_param_spec_pool_release (pspec_pool);
+
       object = g_object_new_internal (class, params, n_params);
 
       while (n_params--)
@@ -2538,9 +2542,11 @@ g_object_setv (GObject       *object,
   if (_g_object_has_notify_handler (object))
     nqueue = g_object_notify_queue_freeze (object, FALSE);
 
+  g_param_spec_pool_acquire (pspec_pool);
+
   for (i = 0; i < n_properties; i++)
     {
-      pspec = g_param_spec_pool_lookup (pspec_pool, names[i], obj_type, TRUE);
+      pspec = g_param_spec_pool_find (pspec_pool, names[i], obj_type, TRUE);
 
       if (!g_object_set_is_valid_property (object, pspec, names[i]))
         break;
@@ -2548,6 +2554,8 @@ g_object_setv (GObject       *object,
       object_set_property (object, pspec, &values[i], nqueue);
     }
 
+  g_param_spec_pool_release (pspec_pool);
+
   if (nqueue)
     g_object_notify_queue_thaw (object, nqueue);
 
@@ -2578,6 +2586,8 @@ g_object_set_valist (GObject       *object,
   if (_g_object_has_notify_handler (object))
     nqueue = g_object_notify_queue_freeze (object, FALSE);
   
+  g_param_spec_pool_acquire (pspec_pool);
+
   name = first_property_name;
   while (name)
     {
@@ -2586,10 +2596,10 @@ g_object_set_valist (GObject     *object,
       gchar *error = NULL;
       GTypeValueTable *vtab;
       
-      pspec = g_param_spec_pool_lookup (pspec_pool,
-                                       name,
-                                       G_OBJECT_TYPE (object),
-                                       TRUE);
+      pspec = g_param_spec_pool_find (pspec_pool,
+                                     name,
+                                     G_OBJECT_TYPE (object),
+                                     TRUE);
 
       if (!g_object_set_is_valid_property (object, pspec, name))
         break;
@@ -2614,6 +2624,8 @@ g_object_set_valist (GObject       *object,
       name = va_arg (var_args, gchar*);
     }
 
+  g_param_spec_pool_release (pspec_pool);
+
   if (nqueue)
     g_object_notify_queue_thaw (object, nqueue);
 


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