This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] MI: Free values when updating


 > > OK, it's not the right patch but I do think that release_values shouldn't
 > > be called when updating;
 > 
 > Why? If we're about to store a value in varobj->value, we must call
 > release_value on that value, otherwise the value is going to be deleted at a
 > random point in time, and our varobj will be rather useless.

Because there wasn't a call there before your changes.

 > > it's just that this patch stops calling it at other times 
 > > when it's needed.  Without any change, do enable timings (if you have that
 > > patch), create a variable object of a large array and all its children then
 > > repeatedly do "-var-update *".  It should take longer and longer to execute.
 > 
 > Why? Is it because the memory consumption of gdb grows, or because the list
 > of released values grows without ever being cleared, or for some other
 > reason?

The latter, I think.

 >...
 > As I've said, we need to do it to avoid the value to be deleted at random
 > point in time.  So there must be something else? Does you free_values patch
 > makes any difference here?

I think the permanence of values are already guaranteed through value_of_root
and value_of_child.  Maybe trying to release them the second time takes
longer because GDB has to go all the way through the list to find out they're
not there.


 > - Volodya
 > Index: varobj.c
 > ===================================================================
 > RCS file: /cvs/src/src/gdb/varobj.c,v
 > retrieving revision 1.79
 > diff -u -p -r1.79 varobj.c
 > --- varobj.c	16 Jan 2007 02:12:49 -0000	1.79
 > +++ varobj.c	23 Jan 2007 09:12:07 -0000
 > @@ -1987,11 +1987,7 @@ c_value_of_root (struct varobj **var_han
 >        /* We need to catch errors here, because if evaluate
 >           expression fails we just want to make val->error = 1 and
 >           go on */

This comment is not applicable anymore.

 > -      if (gdb_evaluate_expression (var->root->exp, &new_val))
 > -	{
 > -	  release_value (new_val);
 > -	}
 > -
 > +      gdb_evaluate_expression (var->root->exp, &new_val);
 >        return new_val;
 >      }

I think if you also remove the (3) calls to release_value in c_value_of_child
and cplus_value_of_child this is equivalent to my change (and more tidy).


-- 
Nick                                           http://www.inet.net.nz/~nickrob


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]