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




commit a8dce41866f401320460718fa0b763c7f86c3b9c
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 f674da1cb1..67608c775b 100644
--- a/gobject/gobject.c
+++ b/gobject/gobject.c
@@ -2355,12 +2355,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;
@@ -2409,6 +2411,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--)
@@ -2539,9 +2543,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;
@@ -2549,6 +2555,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);
 
@@ -2579,6 +2587,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)
     {
@@ -2587,10 +2597,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;
@@ -2615,6 +2625,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]