summaryrefslogtreecommitdiff
path: root/gobject/gsignal.c
diff options
context:
space:
mode:
authorTim Janik <timj@gtk.org>2000-10-27 03:33:31 +0000
committerTim Janik <timj@src.gnome.org>2000-10-27 03:33:31 +0000
commit8a572c0da1be99527c52f620dc7fd04eb0775bde (patch)
tree32719eded2f56db9066da858af267e570efb1587 /gobject/gsignal.c
parent32ef70d4b27ac912188a47b6611d5e8c0516cc2f (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.c44
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)
{