Skip to content
This repository has been archived by the owner on Nov 17, 2020. It is now read-only.

Commit

Permalink
Browse files Browse the repository at this point in the history
notifyqueue: Dedup pspecs when adding
The previous code dedup'd when thawing and threw nasty warnings your way
if you notified too often. This can now easily be avoided.

Performance should be roughly identical, as both are O(n²).
  • Loading branch information
Benjamin Otte committed Aug 6, 2010
1 parent e88eb04 commit 4ac7f8f
Showing 1 changed file with 7 additions and 16 deletions.
23 changes: 7 additions & 16 deletions gobject/gobjectnotifyqueue.c
Expand Up @@ -119,22 +119,10 @@ g_object_notify_queue_thaw (GObject *object,
}

pspecs = nqueue->n_pspecs > 16 ? free_me = g_new (GParamSpec*, nqueue->n_pspecs) : pspecs_mem;
/* set first entry to NULL since it's checked unconditionally */
pspecs[0] = NULL;

for (slist = nqueue->pspecs; slist; slist = slist->next)
{
GParamSpec *pspec = slist->data;
guint i;

/* dedup, make pspecs in the list unique */
for (i = 0; i < n_pspecs; i++)
{
if (pspecs[i] == pspec)
break;
}

if (i == n_pspecs) /* if no match was found */
pspecs[n_pspecs++] = pspec;
pspecs[n_pspecs++] = slist->data;
}
g_datalist_id_set_data (&object->qdata, context->quark_notify_queue, NULL);

Expand Down Expand Up @@ -178,8 +166,11 @@ g_object_notify_queue_add (GObject *object,
pspec = redirect;

/* we do the deduping in _thaw */
nqueue->pspecs = g_slist_prepend (nqueue->pspecs, pspec);
nqueue->n_pspecs++;
if (g_slist_find (nqueue->pspecs, pspec) == NULL)
{
nqueue->pspecs = g_slist_prepend (nqueue->pspecs, pspec);
nqueue->n_pspecs++;
}

G_UNLOCK(notify_lock);
}
Expand Down

0 comments on commit 4ac7f8f

Please sign in to comment.