Re: GObject and floating reference count
- From: Chris Vine <chris cvine freeserve co uk>
- To: gtk-app-devel-list gnome org
- Cc: 
- Subject: Re: GObject and floating reference count
- Date: Fri, 2 Jun 2006 10:25:42 +0100
On Wednesday 31 May 2006 15:15, Tristan Van Berkom wrote:
Hannes Mayr wrote:
Hello,
I'm a little bit confused about the explanation of the floating
reference count.
The documentation says about GObject:
"The initial reference a GObject is created with is flagged as a
floating reference. This means that it is not specifically claimed to be
"owned" by any code portion."
http://developer.gnome.org/doc/API/2.0/gobject/gobject-The-Base-Object-Ty
pe.html#floating-ref
And about GtkObject:
"The most interesting difference between GtkObject and GObject is the
"floating" reference count. A GObject is created with a reference count
of 1, owned by the creator of the GObject. (The owner of a reference is
the code section that has the right to call g_object_unref() in order to
remove that reference.) A GtkObject is created with a reference count of
1 also, but it isn't owned by anyone;"
http://developer.gnome.org/doc/API/2.0/gtk/GtkObject.html
So, the part of GtkObject says GObject is owned by the creator and the
docs about GObject itself says it isn't owned by anyone (until
g_object_sink() is called).
Who is wrong here? Or maybe I unterstood something wrong...
This is a whole new can of bugs waiting to spill, the answer to your
question is that both are created floating in GTK+-2.10, before that
GObjects were never floating and floating widgets were the main incentive
to keep GtkObject around.
The documentation in Glib-2.10 is wrong.  Plain GObjects are still not created 
with a floating reference (if they were, existing code would be broken).  
Only GInitiallyUnowned objects (or objects sub-classed from 
GInitiallyUnowned) are created with a floating reference.  At present, the 
only objects in GDK/GTK+ deriving from GInitiallyUnowned are GtkObjects.  So 
existing code works as normal.  The inheritance tree is:
  GObject
     |
     |
GInitiallyUnowned 
     |
     |
 GtkObject
In effect the floating reference count code has been moved from GtkObject to 
GObject but floating references are only given to GIniatiallyUnowned objects; 
accordingly, with GTK+-2.9 the
  g_object_ref(G_OBJECT(obj);
  gtk_object_sink(GTK_OBJECT(obj));
sequence is deprecated (but will still work correctly) in favour of
  g_object_ref_sink(G_OBJECT(obj));
I posted a bug on this a few months ago and the documentation was corrected 
for Glib-2.11, but for some reason not for Glib-2.10.  I suggest someone 
posts another one to get the documentation corrected in Glib-2.10.
I have to say that moving the floating reference handling code to a class that 
does not in fact use it in its interface breaks all my training on writing 
object orientated code, and furthermore calling g_object_ref_sink() on a 
newly created plain GObject would be lgeal but positively wrong as the 
GObject would end up with a reference count of 2 and not 1 (because it 
started with a (non-floating) reference count of 1).  But no doubt the 
maintainers had their reasons (but they managed to confuse themselves 
sufficiently to get the documentation wrong).
Chris
[
Date Prev][
Date Next]   [
Thread Prev][
Thread Next]   
[
Thread Index]
[
Date Index]
[
Author Index]