diff options
author | Tim Janik <timj@gtk.org> | 2000-10-27 03:33:31 +0000 |
---|---|---|
committer | Tim Janik <timj@src.gnome.org> | 2000-10-27 03:33:31 +0000 |
commit | 8a572c0da1be99527c52f620dc7fd04eb0775bde (patch) | |
tree | 32719eded2f56db9066da858af267e570efb1587 /gobject/gsignal.c | |
parent | 32ef70d4b27ac912188a47b6611d5e8c0516cc2f (diff) |
fixed deadlock scenarion where g_signal_lookup() would be called with the
Fri Oct 27 05:35:14 2000 Tim Janik <timj@gtk.org>
* 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.
Diffstat (limited to 'gobject/gsignal.c')
-rw-r--r-- | gobject/gsignal.c | 44 |
1 files changed, 21 insertions, 23 deletions
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) { |