Re: Confusing about memory leak and GtkTreeView, GtkCellRendererCombo & GtkCellRendererSpin



On Fri, 2008-12-12 at 15:18 +0900, Keedi Kim wrote:
Thanks Yu,

Now I could understand a little bit about floating and reference
count. :-)

I'm sorry to bother you, but..

Not a problem. I couldn't get asleep anyways.

then are the following answers right?

1.
If I use GtkCellRenderSpin and make new GtkAdjustment
which is saved in the **Renderer**, then do I have to do
g_object_unref(adj) ?

-> DO NOT g_object_unref()
since GtkCellRenderSpin will eliminates floating and it will free
GtkAdjustment.

This is definitely true.
2.
If I use GtkCellRenderSpin and make new GtkAdjustment
which is saved in the **GtkTreeModel** with setting attribute,
then do I have to do g_object_unref(adj) ?

-> DO g_object_ref()
If you are working with GtkTreeStore, and the property is declared as
G_TYPE_POINTER(perhaps also G_TYPE_OBJECT, depending on the
implementation of gtktreestore.c), this is yes. But remember you are now
aiding GtkTreeStore for handling the reference to the GtkAdjustment.
Logically that reference still belongs to the treestore.

If you are writing your own GtkTreeModel then you can put the reference
handling code into your model.


3.
If I use GtkCellRenderCombo and make new Gtk{Tree|List}Store
which is saved in the **Renderer**, then do I have to do
g_object_unref(model) ?

-> DO g_object_ref_sink() then g_object_ref() <-- Is this right?

I can't anwser 3 and 4 because I don't understand how a GtkTreeStore can
be set to a property of the Renderer. 

I am not particularly familiar with GtkTreeStore stuff; get the source
code of gtkcellrenderercombo.c will always help, they are available at 

http://svn.gnome.org/viewvc/gtk%2B/trunk/gtk/

Good Luck.

Yu

4.
If I use GtkCellRenderCombo and make new Gtk{Tree|List}Store
which is saved in the **GtkTreeModel** with setting attribute,
then do I have to do g_object_unref(model) ?

-> DO g_object_ref()

Thanks again, :-)


2008/12/12 Yu Feng <rainwoodman gmail com>
        Hi Kim,
        
        Usually if a property of a GObject is G_TYPE_OBJECT, the
        GObject will
        hold a reference count of that property.
        
        And because your GtkAdjustment is created in a floating state,
        you don't
        need to unref it after setting it as a property value of a
        GObject.
        
        refer to line 209:gtkcellrendererspin.c
          if (obj)
           priv->adjustment = g_object_ref_sink (obj);
             break;
        
        and line 150:gtkcellrendererspin.c
         if (priv && priv->adjustment)
           g_object_unref (priv->adjustment);
        
        > >       adj = GTK_ADJUSTMENT (gtk_adjustment_new (50.0, 0.0,
        100.0, 5.0,
        > 10.0, 0.0));
        
        
          adj->ref_count = unknown,
          adj->is_floating = true.
        
              renderer = gtk_cell_renderer_spin_new ();
        
          renderer->ref_count = unknown
          renderer->is_floating = true
        > >
        > >       g_object_set (renderer, "editable", TRUE,
        "adjustment", adj,
        > "digits", 0, NULL);
        > >
        
          renderer->ref_count = unknown
          renderer->is_floating = true
          adj->ref_count = 1
          adj->is_floating = -1
        
        
        the remaining ref_count of adj shouldn't be freed by you. It
        will be
        freed in  GObjectClass->dispose of renderer. (that's why that
        reference
        is owned by renderer: who frees, who owns)
        
        Yu
        
        
        On Fri, 2008-12-12 at 14:10 +0900, Keedi Kim wrote:
        > HI, :-)
        >
        > Memory leak and reference counts are very confused.
        > I am using GtkTreeView with GtkCellRendererCombo and
        GtkCellRenderSpin.
        > So, I use Adjustment for GtkCellRendererSpin
        > and GtkListStore(or GtkTreeStore) for GtkCellRenderCombo.
        >
        > Some of columns uses same Adj, and TreeModel, so saved them
        in renderer.
        > Rest of columns uses different so I saved them in
        GtkTreeModel and set
        > attributes.
        >
        > Anyway, I'm very confusing about memory management.
        >
        > I have understood I have to decrease reference count to
        avoid memory leak
        > when I use following API because they increase reference
        count:
        >
        > g_object_set()
        > gtk_tree_store_set()
        >
        > Now I have some question about those API, and
        GtkCellRenderer{Combo|Spin}.
        >
        > 1.
        > If I use GtkCellRenderSpin and make new GtkAdjustment
        > which is saved in the **Renderer**, then do I have to do
        g_object_unref(adj)
        > ?
        >
        > 2.
        > If I use GtkCellRenderSpin and make new GtkAdjustment
        > which is saved in the **GtkTreeModel** with setting
        attribute,
        > then do I have to do g_object_unref(adj) ?
        >
        > 3.
        > If I use GtkCellRenderCombo and make new Gtk{Tree|List}Store
        > which is saved in the **Renderer**, then do I have to do
        > g_object_unref(model) ?
        >
        > 4.
        > If I use GtkCellRenderCombo and make new Gtk{Tree|List}Store
        > which is saved in the **GtkTreeModel** with setting
        attribute,
        > then do I have to do g_object_unref(adj) ?
        >
        > 5.
        > Is there any connection with floating issues?
        > When I save GtkAdjustment in Renderer
        > before saving, floating value is true
        > and after saving floating value is false,
        > But I save GtkAdjustment in GtkTreeModel,
        > before saving, and after saving floating value is still
        true.
        >
        > And here is some code snippets for asking this issues.
        >
        > * code snippet which saves GtkAdjustment in Renderer
        > code:
        > >     {
        > >       GtkAdjustment *adj;
        > >       GtkCellRenderer *renderer;
        > >       GtkTreeViewColumn *column;
        > >
        > >       adj = GTK_ADJUSTMENT (gtk_adjustment_new (50.0, 0.0,
        100.0, 5.0,
        > 10.0, 0.0));
        > >       renderer = gtk_cell_renderer_spin_new ();
        > >
        > >         {
        > >           gboolean colorness_float;
        > >           colorness_float = g_object_is_floating (adj);
        > >           g_debug ("=========> float: colorness(%d)\n",
        colorness_float);
        > >         }
        > >
        > >       g_object_set (renderer, "editable", TRUE,
        "adjustment", adj,
        > "digits", 0, NULL);
        > >
        > >         {
        > >           gboolean colorness_float;
        > >           colorness_float = g_object_is_floating (adj);
        > >           g_debug ("=========> float: colorness(%d)\n",
        colorness_float);
        > >         }
        > >
        > >       g_object_unref (adj); <----- /* DO I NEED THIS? */
        > >
        > >       g_signal_connect (G_OBJECT (renderer), "edited",
        G_CALLBACK
        > (brightness_edited), window);
        > >
        > >       column = gtk_tree_view_column_new_with_attributes
        > (_(column_titles[VIEW_CAMERA_BRIGHTNESS]),
        > >
         renderer,
        > >
         "text",
        > MODEL_CAMERA_BRIGHTNESS,
        > >
         "visible",
        > MODEL_SUPPORT_CAMERA_PROPERTY,
        > >
         "sensitive",
        > MODEL_ONLINE,
        > >
         NULL);
        > >       gtk_tree_view_column_set_resizable (column, FALSE);
        > >       gtk_tree_view_column_set_clickable (column, FALSE);
        > >       gtk_tree_view_append_column (GTK_TREE_VIEW
        (tree_view), column);
        > >     }
        >
        > result:
        > > =========> float: colorness(1)
        > > =========> float: colorness(0)
        >
        > * code snippet which saves GtkAdjustment and GtkListStore in
        GtkTreeModel.
        > code:
        > >     {
        > >       GtkAdjustment *bitrate_adj, *gop_size_adj;
        > >       GtkListStore *quality_model;
        > >       gchar quality_str[1024];
        > >
        > >       bitrate_adj = GTK_ADJUSTMENT (gtk_adjustment_new
        (10.0, 10.0, 100.0,
        > 10.0, 20.0, 0.0));
        > >       gop_size_adj = GTK_ADJUSTMENT (gtk_adjustment_new
        (10.0, 10.0,
        > 100.0, 10.0, 20.0, 0.0));
        > >
        > >       quality_model = gtk_list_store_new (2,
        G_TYPE_STRING, G_TYPE_INT);
        > >         {
        > >           GtkTreeIter combo_iter;
        > >           gchar str[1024];
        > >           gint value;
        > >
        > >           value = 1;
        > >           g_snprintf (str, 1024, _("%d (Highest)"),
        value);
        > >           g_strlcpy (quality_str, str, 1024);
        > >           gtk_list_store_append (quality_model,
        &combo_iter);
        > >           gtk_list_store_set (quality_model, &combo_iter,
        0, str, 1,
        > value, -1);
        > >
        > >           value = 2;
        > >           g_snprintf (str, 1024, "%d", value);
        > >           gtk_list_store_append (quality_model,
        &combo_iter);
        > >           gtk_list_store_set (quality_model, &combo_iter,
        0, str, 1,
        > value, -1);
        > >
        > >           value = 3;
        > >           g_snprintf (str, 1024, _("%d (Lowest)"), value);
        > >           gtk_list_store_append (quality_model,
        &combo_iter);
        > >           gtk_list_store_set (quality_model, &combo_iter,
        0, str, 1,
        > value, -1);
        > >         }
        > >
        > >         {
        > >           gboolean bitrate_float, gop_size_float,
        quality_float;
        > >
        > >           bitrate_float = g_object_is_floating
        (bitrate_adj);
        > >           gop_size_float = g_object_is_floating
        (gop_size_adj);
        > >           quality_float = g_object_is_floating
        (quality_model);
        > >
        > >           g_debug ("=========> float: bitrate(%d),
        gop_size(%d),
        > quality(%d)\n", bitrate_float, gop_size_float,
        quality_float);
        > >         }
        > >
        > >       g_object_ref_sink (bitrate_adj);
        > >       g_object_ref_sink (gop_size_adj);
        > >
        > >       gtk_tree_store_set (GTK_TREE_STORE (model), iter,
        > >                           MODEL_VIDEO_FRAME_RATE, 1,
        > >                           MODEL_VIDEO_BITRATE, 10,
        > >                           MODEL_VIDEO_GOP_SIZE, 10,
        > >                           MODEL_VIDEO_QUALITY, 1,
        > >                           MODEL_VIDEO_QUALITY_STRING,
        quality_str,
        > >                           MODEL_VIDEO_BITRATE_ADJ,
        bitrate_adj,
        > >                           MODEL_VIDEO_GOP_SIZE_ADJ,
        gop_size_adj,
        > >                           MODEL_VIDEO_QUALITY_MODEL,
        quality_model,
        > >                           -1);
        > >         {
        > >           gboolean bitrate_float, gop_size_float,
        quality_float;
        > >
        > >           bitrate_float = g_object_is_floating
        (bitrate_adj);
        > >           gop_size_float = g_object_is_floating
        (gop_size_adj);
        > >           quality_float = g_object_is_floating
        (quality_model);
        > >
        > >           g_debug ("=========> float: bitrate(%d),
        gop_size(%d),
        > quality(%d)\n", bitrate_float, gop_size_float,
        quality_float);
        > >         }
        > >
        > >       g_object_unref (bitrate_adj); <----- /* DO I NEED
        THIS? */
        > >       g_object_unref (gop_size_adj); <----- /* DO I NEED
        THIS? */
        > >       g_object_unref (quality_model); <----- /* DO I NEED
        THIS? */
        > >     }
        >
        > result:
        > > =========> float: bitrate(1), gop_size(1), quality(0)
        > > =========> float: bitrate(0), gop_size(0), quality(0)
        >
        >
        > Any suggestions and help will be appreciated.
        > Thanks, :-)
        >
        > P.S.
        > If there are documentations for this issues.
        > Could you please recommand the url please?
        >
        
        



-- 
Best regards,

Keedi Kim





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