Messages in this thread Patch in this message | | | Date | Thu, 30 Nov 2017 16:30:22 -0300 | From | Arnaldo Carvalho de Melo <> | Subject | Re: [PATCH v4 01/12] perf util: Create rblist__reset() function |
| |
Em Thu, Nov 30, 2017 at 07:56:31PM +0800, Jin Yao escreveu: > Currently we have a rblist__delete() which is used to delete a rblist. > While rblist__delete() will free the pointer of rblist at the end. > > It's inconvenience for user to delete a rblist which is not allocated > by something like malloc(). For example, the rblist is defined in a > data structure.
> This patch creates a new function rblist__reset() which function is > similar as rblist__delete() but it will not free the rblist.
So, we've been using, mostly consistently:
int foo__init(struct foo *foo) { foo->a = 1; foo->b = malloc(10); if (foo->b == NULL) return -1; return 0; }
struct foo *foo__new(parameters) { struct foo *foo = zalloc(sizeof(*foo));
if (foo && foo__init(foo)) goto out_delete;
return foo; out_delete: foo__delete(foo); return NULL); }
void foo__exit(struct foo *foo) { zfree(&foo->b); }
void foo__delete(struct foo *foo) { if (!foo) return;
foo__exit(foo); free(foo); }
So, please use delete+exit and new+init, i.e. replace 'reset' with 'exit' and 'free' with 'delete' (I saw this case in another patch), for us to try and make all this more consistent, ok?
Thanks,
- Arnaldo > Signed-off-by: Jin Yao <yao.jin@linux.intel.com> > --- > tools/perf/util/rblist.c | 24 +++++++++++++++++------- > tools/perf/util/rblist.h | 1 + > 2 files changed, 18 insertions(+), 7 deletions(-) > > diff --git a/tools/perf/util/rblist.c b/tools/perf/util/rblist.c > index 0dfe27d..eafa663 100644 > --- a/tools/perf/util/rblist.c > +++ b/tools/perf/util/rblist.c > @@ -101,20 +101,30 @@ void rblist__init(struct rblist *rblist) > return; > } > > +static void remove_nodes(struct rblist *rblist) > +{ > + struct rb_node *pos, *next = rb_first(&rblist->entries); > + > + while (next) { > + pos = next; > + next = rb_next(pos); > + rblist__remove_node(rblist, pos); > + } > +} > + > void rblist__delete(struct rblist *rblist) > { > if (rblist != NULL) { > - struct rb_node *pos, *next = rb_first(&rblist->entries); > - > - while (next) { > - pos = next; > - next = rb_next(pos); > - rblist__remove_node(rblist, pos); > - } > + remove_nodes(rblist); > free(rblist); > } > } > > +void rblist__reset(struct rblist *rblist) > +{ > + remove_nodes(rblist); > +} > + > struct rb_node *rblist__entry(const struct rblist *rblist, unsigned int idx) > { > struct rb_node *node; > diff --git a/tools/perf/util/rblist.h b/tools/perf/util/rblist.h > index 4c8638a..048c285 100644 > --- a/tools/perf/util/rblist.h > +++ b/tools/perf/util/rblist.h > @@ -35,6 +35,7 @@ void rblist__remove_node(struct rblist *rblist, struct rb_node *rb_node); > struct rb_node *rblist__find(struct rblist *rblist, const void *entry); > struct rb_node *rblist__findnew(struct rblist *rblist, const void *entry); > struct rb_node *rblist__entry(const struct rblist *rblist, unsigned int idx); > +void rblist__reset(struct rblist *rblist); > > static inline bool rblist__empty(const struct rblist *rblist) > { > -- > 2.7.4
| |