Allocate GObjectNotifyQueue with g_slice instead of abusing g_list
authorAlexander Larsson <alexl@redhat.com>
Wed, 19 Aug 2009 13:48:19 +0000 (15:48 +0200)
committerAlexander Larsson <alexl@redhat.com>
Fri, 2 Oct 2009 19:02:48 +0000 (21:02 +0200)
This is both cleaner and faster (it avoids function calls and
zeroing the memory twice).

Object construction performance improvement:
         Non-Threaded   Threaded
Simple:           11%       1.3%
Complex:           8%         6%

Other tests stable.

https://bugzilla.gnome.org/show_bug.cgi?id=557100

gobject/gobjectnotifyqueue.c

index 1d5787b..56422c2 100644 (file)
@@ -48,12 +48,8 @@ struct _GObjectNotifyQueue
   GSList               *pspecs;
   guint16               n_pspecs;
   guint16               freeze_count;
-  /* currently, this structure abuses the GList allocation chain and thus
-   * must be <= sizeof (GList)
-   */
 };
 
-
 /* --- functions --- */
 static void
 g_object_notify_queue_free (gpointer data)
@@ -61,7 +57,7 @@ g_object_notify_queue_free (gpointer data)
   GObjectNotifyQueue *nqueue = data;
 
   g_slist_free (nqueue->pspecs);
-  g_list_free_1 ((void*) nqueue);
+  g_slice_free (GObjectNotifyQueue, nqueue);
 }
 
 static inline GObjectNotifyQueue*
@@ -73,8 +69,7 @@ g_object_notify_queue_freeze (GObject            *object,
   nqueue = g_datalist_id_get_data (&object->qdata, context->quark_notify_queue);
   if (!nqueue)
     {
-      nqueue = (void*) g_list_alloc ();
-      memset (nqueue, 0, sizeof (*nqueue));
+      nqueue = g_slice_new0 (GObjectNotifyQueue);
       nqueue->context = context;
       g_datalist_id_set_data_full (&object->qdata, context->quark_notify_queue,
                                   nqueue, g_object_notify_queue_free);