From 8a572c0da1be99527c52f620dc7fd04eb0775bde Mon Sep 17 00:00:00 2001 From: Tim Janik Date: Fri, 27 Oct 2000 03:33:31 +0000 Subject: fixed deadlock scenarion where g_signal_lookup() would be called with the Fri Oct 27 05:35:14 2000 Tim Janik * gsignal.c (g_signal_newv): fixed deadlock scenarion where g_signal_lookup() would be called with the signal lock being held. reported by james henstridge. * gclosure.c (g_closure_set_meta_marshal): fixed memcpy/overwrite bug reported by owen. --- gobject/gsignal.c | 44 +++++++++++++++++++++----------------------- 1 file changed, 21 insertions(+), 23 deletions(-) (limited to 'gobject/gsignal.c') diff --git a/gobject/gsignal.c b/gobject/gsignal.c index 5006ebfed..5beb947b6 100644 --- a/gobject/gsignal.c +++ b/gobject/gsignal.c @@ -209,14 +209,23 @@ static inline guint signal_id_lookup (GQuark quark, GType itype) { - SignalKey key, *signal_key; - - key.itype = itype; - key.quark = quark; - - signal_key = g_bsearch_array_lookup (&g_signal_key_bsa, &key); + do + { + SignalKey key, *signal_key; + + key.itype = itype; + key.quark = quark; + + signal_key = g_bsearch_array_lookup (&g_signal_key_bsa, &key); + + if (signal_key) + return signal_key->signal_id; + + itype = g_type_parent (itype); + } + while (itype); - return signal_key ? signal_key->signal_id : 0; + return 0; } static gint @@ -601,27 +610,16 @@ guint g_signal_lookup (const gchar *name, GType itype) { - GQuark quark; - + guint signal_id; + g_return_val_if_fail (name != NULL, 0); g_return_val_if_fail (G_TYPE_IS_INSTANTIATABLE (itype) || G_TYPE_IS_INTERFACE (itype), 0); G_LOCK (g_signal_mutex); - quark = g_quark_try_string (name); - if (quark) - do - { - guint signal_id = signal_id_lookup (quark, itype); - - if (signal_id) - return signal_id; - - itype = g_type_parent (itype); - } - while (itype); + signal_id = signal_id_lookup (g_quark_try_string (name), itype); G_UNLOCK (g_signal_mutex); - return 0; + return signal_id; } gchar* @@ -690,7 +688,7 @@ g_signal_newv (const gchar *signal_name, G_LOCK (g_signal_mutex); - signal_id = g_signal_lookup (name, itype); + signal_id = signal_id_lookup (g_quark_try_string (name), itype); node = LOOKUP_SIGNAL_NODE (signal_id); if (node && !node->destroyed) { -- cgit v1.2.3-70-g09d2