From: charles@code.rebelbase.com
Date: Tue Aug 29 2000 - 12:21:24 EDT
Hi Glade people,
I'm having trouble destroying UIs that are built with Glade.
The root of the problem seems to be the reference-counted widgets
attached to other widgets via gtk_object_set_data_full by Glade.
When I close the top-level widget, goes into its finalize phase.
gtk_object_finalize() in turn calls glib's g_datalist_clear():
void
g_datalist_clear (GData **datalist)
{
g_return_if_fail (datalist != NULL);
G_LOCK (g_dataset_global);
if (!g_dataset_location_ht)
g_data_initialize ();
while (*datalist)
g_datalist_clear_i (datalist);
G_UNLOCK (g_dataset_global);
}
So g_datalist_clear() gets the g_dataset_global lock and starts
clearing out items in its list. One of these turns out to be a
widget that we've attached to, whose _full delete function is
gtk_object_unref(). The attached widget gets unreffed, destroyed,
and finalized, and we wind up back in g_datalist_clear() for
widget #2. This time, though, we can't get the g_dataset_global
lock, because widget #1 still has the lock. We stop dead:
Here's a pstack of what I just described:
feb3c5c8 _mutex_adaptive_lock (febdc078, 4c00, feb5c55c, 1, 4d58, fffeffff) + 120
feb3c378 _cmutex_lock (febdc078, ff, feab3938, febab77c, 0, 0) + 50
febab77c g_datalist_clear (19bdb4, 0, ff3dd574, 3400, feb5c55c, 0) + d8
ff0e3dbc gtk_object_finalize (19bda8, ff0e3db0, 19bda8, 3400, feb5c55c, ff3bffac) + c
ff159b90 gtk_widget_finalize (19bda8, ff159a18, 1, 3400, ff3dc7ac, 109) + 178
ff0e701c gtk_object_unref (19bda8, ba15, 10, 5800, 16afa8, 11) + 1bc
ff15b520 gtk_widget_unref (19bda8, bc680, feab3938, feab3938, 1a7500, 39) + f0
febab7fc g_datalist_clear (18aa04, 0, feab3938, 3400, 1, 0) + 158
ff0e3dbc gtk_object_finalize (18a9f8, ff0e3db0, 18a9f8, c5efc, a3000, a3000) + c
ff159b90 gtk_widget_finalize (18a9f8, ff159a18, 0, 5c00, 18a9f8, 90000) + 178
ff15e180 gtk_window_finalize (18a9f8, ff15e040, 0, 3400, ff264360, 1) + 140
ff0e701c gtk_object_unref (18a9f8, 18a9f8, 87, ffbedb18, 0, ff176318) + 1bc
ff10be8c gtk_signal_real_emit (18a9f8, 87, ffbedb18, 1, ffbede78, ff176318) + 5b8
ff108d08 gtk_signal_emit (18a9f8, 87, ec484, ffbedb18, ff161cd0, 0) + 248
ff26669c gnome_dialog_button_clicked (19bd60, 18a9f8, ffbee610, 1, ffbee96c, 10000) + 188
It's possible that this hasn't popped up before because G_LOCK is
#defined to whitespace in glib.h if G_THREADS_ENABLED isn't turned on.
I like glade a lot, and am/was in the middle of moving the newsreader
Pan to glade, but this is a showstopper for me. (And I'd rather not
redo the GUIs I've built with Glade. :) Do you have any suggestions,
work arounds, CVS fixes? Please CC them to my mail address, as I'm
not subscribed to this list.
cheers,
Charles
+---------------------------------------------------------------------+
To unsubscribe from this list, send a message to majordomo@ncis.pn.org
with the line "unsubscribe glade-devel" in the body of the message.
This archive was generated by hypermail 2b29 : Tue Aug 29 2000 - 09:53:01 EDT