[FFmpeg-cvslog] r22119 - in trunk/libavutil: tree.c tree.h
Vitor Sessak
vitor1001
Tue Mar 2 20:37:38 CET 2010
Michael Niedermayer wrote:
> On Tue, Mar 02, 2010 at 07:18:09PM +0100, Vitor Sessak wrote:
>> Michael Niedermayer wrote:
>>> On Tue, Mar 02, 2010 at 06:40:03AM +0100, Vitor Sessak wrote:
>>>> Michael Niedermayer wrote:
>>>>> On Sun, Feb 28, 2010 at 09:48:42PM +0100, vitor wrote:
>>>>>> Author: vitor
>>>>>> Date: Sun Feb 28 21:48:42 2010
>>>>>> New Revision: 22119
>>>>>>
>>>>>> Log:
>>>>>> Implement av_tree_destroy_free_elem() to destroy a tree and free all
>>>>>> the values stored on it.
>>>>>>
>>>>>> Modified:
>>>>>> trunk/libavutil/tree.c
>>>>>> trunk/libavutil/tree.h
>>>>>>
>>>>>> Modified: trunk/libavutil/tree.c
>>>>>> ==============================================================================
>>>>>> --- trunk/libavutil/tree.c Sun Feb 28 20:58:26 2010 (r22118)
>>>>>> +++ trunk/libavutil/tree.c Sun Feb 28 21:48:42 2010 (r22119)
>>>>>> @@ -135,6 +135,15 @@ void av_tree_destroy(AVTreeNode *t){
>>>>>> }
>>>>>> }
>>>>>> +void av_tree_destroy_free_elem(AVTreeNode *t){
>>>>>> + if(t){
>>>>>> + av_tree_destroy_free_elem(t->child[0]);
>>>>>> + av_tree_destroy_free_elem(t->child[1]);
>>>>>> + av_free(t->elem);
>>>>>> + av_free(t);
>>>>>> + }
>>>>>> +}
>>>>>> +
>>>>>> #if 0
>>>>>> void av_tree_enumerate(AVTreeNode *t, void *opaque, int (*cmp)(void
>>>>>> *opaque, void *elem), int (*enu)(void *opaque, void *elem)){
>>>>>> if(t){
>>>>>>
>>>>>> Modified: trunk/libavutil/tree.h
>>>>>> ==============================================================================
>>>>>> --- trunk/libavutil/tree.h Sun Feb 28 20:58:26 2010 (r22118)
>>>>>> +++ trunk/libavutil/tree.h Sun Feb 28 21:48:42 2010 (r22119)
>>>>>> @@ -78,5 +78,6 @@ void *av_tree_find(const struct AVTreeNo
>>>>>> */
>>>>>> void *av_tree_insert(struct AVTreeNode **rootp, void *key, int
>>>>>> (*cmp)(void *key, const void *b), struct AVTreeNode **next);
>>>>>> void av_tree_destroy(struct AVTreeNode *t);
>>>>>> +void av_tree_destroy_free_elem(struct AVTreeNode *t);
>>>>> argh, ive missed this part of your patch
>>>>> minor api bump & doxy missing and its the wrong way to do it
>>>>> you dont know at all if avfree() is correct and sufficient to free the
>>>>> opaque elements.
>>>>> av_tree_enumerate() is likely the correct way to free
>>>> Ok, but current version of av_tree_enumerate() is commented out and does
>>>> not do what one would expect. What do you think of this patch?
>>>>
>>>> -Vitor
>>>> libavformat/nut.c | 11 +++++++++++
>>>> libavformat/nut.h | 1 +
>>>> libavformat/nutdec.c | 1 +
>>>> libavformat/nutenc.c | 1 +
>>>> libavutil/avutil.h | 2 +-
>>>> libavutil/tree.c | 14 ++++++--------
>>>> libavutil/tree.h | 7 +++++++
>>>> 7 files changed, 28 insertions(+), 9 deletions(-)
>>>> 073f43adb2344cede149943eef2ce2cae50d7930 nuttree.diff
>>>> Index: libavutil/tree.c
>>>> ===================================================================
>>>> --- libavutil/tree.c (revision 22135)
>>>> +++ libavutil/tree.c (working copy)
>>>> @@ -135,16 +135,14 @@
>>>> }
>>>> }
>>>> -#if 0
>>>> -void av_tree_enumerate(AVTreeNode *t, void *opaque, int (*cmp)(void
>>>> *opaque, void *elem), int (*enu)(void *opaque, void *elem)){
>>>> - if(t){
>>>> - int v= cmp ? cmp(opaque, t->elem) : 0;
>>>> - if(v>=0) av_tree_enumerate(t->child[0], opaque, cmp, enu);
>>>> - if(v==0) enu(opaque, t->elem);
>>>> - if(v<=0) av_tree_enumerate(t->child[1], opaque, cmp, enu);
>>>> +void av_tree_enumerate(AVTreeNode *t, void *opaque,
>>>> + void (*enu)(void *opaque, void **elem)){
>>>> + if (t) {
>>>> + av_tree_enumerate(t->child[0], opaque, enu);
>>>> + enu(opaque, &t->elem);
>>>> + av_tree_enumerate(t->child[1], opaque, enu);
>>>> }
>>> no, this is broken
>>> the only question on the API i had IIRC was if we should allow elements
>>> to be removed based on the return code of enu()
>>> ruining the API by droping 2/3 of the features is not an option
>> Ok, so since there is no documentation for it, can you please explain me
>> what av_tree_enumerate() is supposed to do and in what way it is different
>> from
>>
>> {
>> void *elem = av_tree_find(t, opaque, cmp, NULL);
>> if (elem)
>> enu(opaque, elem);
>> }
>
> av_tree_enumerate() is able to enumerate() ranges not just individual
> elements
> cmp returns <0 or >0 -> tested element is outside the range to the specified
> side, otherwise cmp=0 element is inside the range
>
> suggestions for improvments are welcome
Ok, thanks. Attached patch fixes the function and use it to plug the
memleak.
-Vitor
More information about the ffmpeg-cvslog
mailing list