GtkObject: double destroys
- From: Owen Taylor <otaylor redhat com>
- To: Michael Meeks <michael ximian com>
- Cc: <gtk-devel-list gnome org>
- Subject: GtkObject: double destroys
- Date: 25 Sep 2001 09:58:28 -0400
Michael Meeks <michael ximian com> writes:
> Anyway, so having read the GtkObject compatibility code, I'm
> slightly intrigued as to why it is neccessary to allow 'double
> destroys' ( as mentioned in the Changes-2.0 ). This seems rather like
> a big pain in the neck for porting large projects.
>
> Would not removing the unset of GTK_OBJECT_DESTROYED in
> gtk_object_dispose, not provide a more pleasant compatibility path ?
Remember, while most of gtkobject.c is compatibility wrappers
GtkObject itself is not a compatibility wrapper. GtkObject still
provides significant functionality, in particular the float/sink
memory management.
For this reason, we won't be getting rid of GtkObject usage in
GTK+, and we need to make it do "the right thing", not
just "the most compatible thing".
The problem with the GTK_OBJECT_DESTROYED flag is that:
- It was poorly defined to start with; what could you do
with a destroyed-but-not-finalized widget? What should
go in destroy and what should go in finalize?
- Nobody ever got it right (if a double destroy hurts
you now, well, then method calls against the object
in the destroyed state will segfault you.)
- It was an easy way to segfault a language binding.
By redefining things so that ::destroy is not a state transition
notification but a request to release references to external
resources, we :
- remove the idea of having an "invalid" state for a widget,
which makes things easier for the user of the widget.
- remove the need for widget writers to feel guilty about
not checking GTK_WIDGET_DESTROYED() all over the place.
- make it possible to give a decent explanation of what
you should do in ::destroy and what in finalize().
[
In destroy: reset the state of the widget to the point
where it no longer has references to external object
leaving the widget in a valid state.
In finalize: free all memory
]
The fact that currently _all_ widgets are destroyed twice
is basically just there as a debugging tool. We'll add
an optimization at some point so that if a destroy happens
as a result of refcount => 0, and the object doesn't get
reincarnated, then it won't get destroyed _again_ before
finalization.
> Also, the comment in gtk_object_destroy:
>
> {
> /* need to hold a reference count around all class method
> * invocations.
> */
> g_object_run_dispose (G_OBJECT (object));
> }
>
> somewhat confuses me; since a reference isn't taken, is this a
> throwback to the equivilant 1.2 comment ?
Yeah, this looks like a leftover comment. The actual ref/unref is in
g_object_run_dispose. Feel free to commit a removal of the comment.
If you want to do a writeup of this, the best place is probably
in a section about converting GTK+-1.2 widgets in Havoc's
'intro to GTK+-2.0' document.
Regards,
Owen
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]