Allocate GObjectNotifyQueue with g_slice instead of abusing g_list

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
This commit is contained in:
Alexander Larsson 2009-08-19 15:48:19 +02:00
parent f4d9789fcf
commit af017accc5

View 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);