Re: Gtk-- refcounting question




Tero Pulkkinen <terop@students.cc.tut.fi> writes:

> Brian Alexander Martin <briam@cats.ucsc.edu> writes:
> > I've got a question about the current status of refcounting in gtk--. 
> 
> It could be better :)
> 
> I think current situation is that the C++-parts of the gtk objects are
> not destroyed when container keeping the objects is destroyed. This is
> something that absolutely needs to be fixed. (This is why there's
> message in the web page asking people to use new instead of local
> scope for storing objects that are inserted to containers - that use
> of the objects can certainly be preserved when the refcounting is
> fixed, it might break the objects in local scopes)
> 
> I dunno exactly how it should be solved... We'll see. Probably should
> make some way for C++ to handle all the refcounts...

If you are content to make people explicitely do reference counting
for C++ objects. (And I don't see a better way of doing it),
Then I believe there is a simple way of doing it.

When you add the "cpp" object data for a widget, do that with:

void gtk_object_set_data_full (GtkObject   *object,
			       const gchar *key,
			       gpointer     data,
			       GtkDestroyNotify destroy);

Then, have the GtkDestroyNotify function delete the C++ object.


If somebody does an explicit delete on an C++ object that was
was not created in C++, then everything is OK - you just remove
the "cpp" object data. However, explicit deletes on objects created
in C++ are unacceptable. So you probably should disallow them
completely.


Note that you may want to provide automatic pointers to make
all this easier - i.e.,

{
  Gtk_Button_var button = new Gtk_Button ("Hello");

  container->add(button);

  container->remove(button);
  container2->add(button);
}

Works fine, though the C equivalent wouldn't, because a
reference count is held by Gtk_Button_var until the end
of the scope.

(Probably it would be:

 typedef Gtk_Var<Gtk_Button> Gtk_Button_var;

You could get an implementation of the automatic pointer from any
CORBA ORB, e.g., MICO, if you aren't already familiar with how they
work)

Regards,
                                        Owen
  



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]