gsignal: remove some pointless locking

We previously hold a lock in the loop that collects the arguments for
g_signal_emit(), which we drop before calling into the argument
collection functions and reacquire again at the bottom of the loop (ie:
one release/acquire pair for each argument collected).  To make matters
worse, the lock is just released again after the loop.

Presumably that was done to protect the access to the parameter array,
but it's pretty unlikely that this is needed because the only way it
changes is if the signal is unloaded.  That only happens when unloading
types which is quite unlikely to happen while we are emitting on an
instance of that type (and, as an aside, never happens anymore anyway).

If we move the unlock below the loop up above it and remove the
acquire/release pair from the loop, we improve performance in the new
arg-collecting performance tests by ~15% (more like ~18% in the case
where we only emit to one handler -- where argument collection dominates
more).

https://bugzilla.gnome.org/show_bug.cgi?id=694380
This commit is contained in:
Ryan Lortie 2013-02-21 17:48:04 +00:00 committed by Matthias Clasen
parent 8bb6a4aec5
commit 3d1d49177b

View File

@ -3286,6 +3286,7 @@ g_signal_emit_valist (gpointer instance,
return;
}
}
SIGNAL_UNLOCK ();
n_params = node->n_params;
signal_return_type = node->return_type;
@ -3299,7 +3300,6 @@ g_signal_emit_valist (gpointer instance,
GType ptype = node->param_types[i] & ~G_SIGNAL_TYPE_STATIC_SCOPE;
gboolean static_scope = node->param_types[i] & G_SIGNAL_TYPE_STATIC_SCOPE;
SIGNAL_UNLOCK ();
G_VALUE_COLLECT_INIT (param_values + i, ptype,
var_args,
static_scope ? G_VALUE_NOCOPY_CONTENTS : 0,
@ -3317,9 +3317,7 @@ g_signal_emit_valist (gpointer instance,
return;
}
SIGNAL_LOCK ();
}
SIGNAL_UNLOCK ();
instance_and_params->g_type = 0;
g_value_init (instance_and_params, G_TYPE_FROM_INSTANCE (instance));