From: Ross Zwisler <zwisler@google.com>
To: Steven Rostedt <rostedt@goodmis.org>
Cc: linux-trace-devel@vger.kernel.org,
Stevie Alvarez <stevie.6strings@gmail.com>
Subject: Re: [PATCH 4/9] libtraceeval: Add traceeval_iterator_remove()
Date: Thu, 24 Aug 2023 14:23:24 -0600 [thread overview]
Message-ID: <20230824202324.GE110858@google.com> (raw)
In-Reply-To: <20230824201906.GD110858@google.com>
On Thu, Aug 24, 2023 at 02:19:06PM -0600, Ross Zwisler wrote:
> On Thu, Aug 17, 2023 at 06:24:17PM -0400, Steven Rostedt wrote:
> > From: "Steven Rostedt (Google)" <rostedt@goodmis.org>
> >
> > Add an API traceeval_iterator_remove() that is safe to call in the
> > traceeval_iterator_next() loop. Currently, traceeval_remove() can also be
> > called "safely", but that may change in the future.
> >
> > The main difference between traceeval_remove() and traceeval_iterator_remove()
> > is that that traceeval_iterator_remove() will NULL out the entry in the
> > sort array, and use this in the other iterator functions. If the entry is
> > NULL, it will not be returned.
> >
> > Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
> > ---
> > include/traceeval-hist.h | 1 +
> > src/histograms.c | 48 ++++++++++++++++++++++++++++++++++++----
> > 2 files changed, 45 insertions(+), 4 deletions(-)
> >
> > diff --git a/include/traceeval-hist.h b/include/traceeval-hist.h
> > index d511c9c5f14c..7d67673ce7e5 100644
> > --- a/include/traceeval-hist.h
> > +++ b/include/traceeval-hist.h
> > @@ -190,5 +190,6 @@ int traceeval_iterator_query(struct traceeval_iterator *iter,
> > const union traceeval_data **results);
> > struct traceeval_stat *traceeval_iterator_stat(struct traceeval_iterator *iter,
> > struct traceeval_type *type);
> > +int traceeval_iterator_remove(struct traceeval_iterator *iter);
> >
> > #endif /* __LIBTRACEEVAL_HIST_H__ */
> > diff --git a/src/histograms.c b/src/histograms.c
> > index fddd0f3587e2..0fbd9e0a353e 100644
> > --- a/src/histograms.c
> > +++ b/src/histograms.c
> > @@ -1305,10 +1305,13 @@ int traceeval_iterator_next(struct traceeval_iterator *iter,
> > iter->next = 0;
> > }
> >
> > - if (iter->next >= iter->nr_entries)
> > - return 0;
> > + do {
> > + if (iter->next >= iter->nr_entries)
> > + return 0;
> > +
> > + entry = iter->entries[iter->next++];
> > + } while (!entry);
> >
> > - entry = iter->entries[iter->next++];
> > *keys = entry->keys;
> > return 1;
> > }
> > @@ -1338,6 +1341,9 @@ int traceeval_iterator_query(struct traceeval_iterator *iter,
> > return 0;
> >
> > entry = iter->entries[iter->next - 1];
> > + if (!entry)
> > + return 0;
> > +
> > *results = entry->vals;
> >
> > return 1;
> > @@ -1363,5 +1369,39 @@ struct traceeval_stat *traceeval_iterator_stat(struct traceeval_iterator *iter,
> > return NULL;
> >
> > entry = iter->entries[iter->next - 1];
> > - return &entry->val_stats[type->index];
> > + return entry ? &entry->val_stats[type->index] : NULL;
> > +}
> > +
> > +/**
> > + * traceeval_iterator_remove - remove the current iterator entry
> > + * @iter: The iterator to remove the entry from
> > + *
> > + * This will remove the current entry from the histogram.
> > + * This is useful if the current entry should be removed. It will not
> > + * affect the traceeval_iterator_next().
> > + *
> > + * Returns 1 if it successfully removed the entry, 0 if for some reason
> > + * there was no "current entry" (called before traceeval_iterator_next()).
> > + * or -1 on error.
Nit: we never actually return -1. Only 1 and 0.
> > + */
> > +int traceeval_iterator_remove(struct traceeval_iterator *iter)
> > +{
> > + struct traceeval *teval = iter->teval;
> > + struct hash_table *hist = teval->hist;
> > + struct entry *entry;
> > +
> > + if (iter->next < 1 || iter->next > iter->nr_entries)
> > + return 0;
> > +
> > + entry = iter->entries[iter->next - 1];
> > + if (!entry)
> > + return 0;
> > +
> > + hash_remove(hist, &entry->hash);
>
> Are we leaking 'entry' after we've removed it from the hash?
>
> I think we need to call free_entry() in both traceeval_iterator_remove() as
> well as traceeval_remove(), just like we do in the loop in
> hist_table_release().
>
> > +
> > + /* The entry no longer exists */
> > + iter->entries[iter->next - 1] = NULL;
> > + teval->update_counter++;
> > +
> > + return 1;
> > }
> > --
> > 2.40.1
> >
next prev parent reply other threads:[~2023-08-24 20:24 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-08-17 22:24 [PATCH 0/9] libtraceeval: Even more updates! Steven Rostedt
2023-08-17 22:24 ` [PATCH 1/9] libtraceeval: Add check for updates to know to recreate iter array Steven Rostedt
2023-08-24 19:41 ` Ross Zwisler
2023-08-17 22:24 ` [PATCH 2/9] libtraceeval: Add traceeval_iterator_query() Steven Rostedt
2023-08-17 22:50 ` Steven Rostedt
2023-08-20 18:18 ` Stevie Alvarez
2023-08-21 14:33 ` Steven Rostedt
2023-08-24 19:57 ` Ross Zwisler
2023-08-17 22:24 ` [PATCH 3/9] libtraceeval: Add traceeval_iterator_stat() Steven Rostedt
2023-08-24 20:07 ` Ross Zwisler
2023-08-17 22:24 ` [PATCH 4/9] libtraceeval: Add traceeval_iterator_remove() Steven Rostedt
2023-08-24 20:19 ` Ross Zwisler
2023-08-24 20:23 ` Ross Zwisler [this message]
2023-09-27 9:51 ` Steven Rostedt
2023-09-27 9:09 ` Steven Rostedt
2023-08-17 22:24 ` [PATCH 5/9] libtraceeval histogram: Add type to traceeval_data and make it a structure Steven Rostedt
2023-08-24 21:09 ` Ross Zwisler
2023-08-17 22:24 ` [PATCH 6/9] libtraceveal: Add type checks to traceeval_data vals and keys Steven Rostedt
2023-08-24 21:23 ` Ross Zwisler
2023-08-17 22:24 ` [PATCH 7/9] libtraceeval: Add size checks to insert and query functions Steven Rostedt
2023-08-17 22:39 ` Steven Rostedt
2023-08-17 22:24 ` [PATCH 8/9] libtraceeval: Add checks to traceeval_insert() and query() Steven Rostedt
2023-08-24 21:36 ` Ross Zwisler
2023-08-17 22:24 ` [PATCH 9/9] libtraceeval: Only do stats on values marked with the STAT flag Steven Rostedt
2023-08-24 22:02 ` Ross Zwisler
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20230824202324.GE110858@google.com \
--to=zwisler@google.com \
--cc=linux-trace-devel@vger.kernel.org \
--cc=rostedt@goodmis.org \
--cc=stevie.6strings@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.