diff mbox series

traceeval: Add way to extract the number of elements

Message ID 20230928102434.58e08f78@rorschach.local.home (mailing list archive)
State Superseded
Headers show
Series traceeval: Add way to extract the number of elements | expand

Commit Message

Steven Rostedt Sept. 28, 2023, 2:24 p.m. UTC
From: "Steven Rostedt (Google)" <rostedt@goodmis.org>

Add traceeval_count() that will return the number of elements in the
traceeval. This can be useful for allocating an array to store the
elements. By getting the count, the allocation can be done first and
then iterated to load the elements into the array.

Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
---
 include/traceeval-hist.h |  2 ++
 src/histograms.c         | 11 +++++++++++
 2 files changed, 13 insertions(+)

Comments

Ross Zwisler Oct. 2, 2023, 8:40 p.m. UTC | #1
On Thu, Sep 28, 2023 at 10:24:34AM -0400, Steven Rostedt wrote:
> From: "Steven Rostedt (Google)" <rostedt@goodmis.org>
> 
> Add traceeval_count() that will return the number of elements in the
> traceeval. This can be useful for allocating an array to store the
> elements. By getting the count, the allocation can be done first and
> then iterated to load the elements into the array.
> 
> Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
> ---
>  include/traceeval-hist.h |  2 ++
>  src/histograms.c         | 11 +++++++++++
>  2 files changed, 13 insertions(+)
> 
> diff --git a/include/traceeval-hist.h b/include/traceeval-hist.h
> index eefa48d..44d071f 100644
> --- a/include/traceeval-hist.h
> +++ b/include/traceeval-hist.h
> @@ -204,6 +204,8 @@ int traceeval_query_size(struct traceeval *teval, const struct traceeval_data *k
>  void traceeval_results_release(struct traceeval *teval,
>  			       const struct traceeval_data *results);
>  
> +size_t traceeval_count(struct traceeval *teval);
> +
>  #define traceeval_stat(teval, keys, type)				\
>  	traceeval_stat_size(teval, keys, TRACEEVAL_ARRAY_SIZE(keys), type)
>  
> diff --git a/src/histograms.c b/src/histograms.c
> index 2456342..ac3f7f7 100644
> --- a/src/histograms.c
> +++ b/src/histograms.c
> @@ -1006,6 +1006,17 @@ int traceeval_remove_size(struct traceeval *teval,
>  	return 1;
>  }
>  
> +/**
> + * traceeval_count - Return the number of elements in the traceeval
> + * @teval: The traceeval handle to get the count from
> + *
> + * Returns the number of elements stored by unique keys in the @teval.
> + */
> +size_t traceeval_count(struct traceeval *teval)
> +{
> +	return teval->update_counter;

I don't think this is going to do what you want.  'teval->update_counter'
is a generation number, is monotonically increasing, and is incremented any
time an element is added or removed from the hash.

I think we either need to actually keep an element count (increment in
create_entry(), decrement in traceeval_remove_size() and
traceeval_iterator_remove()), or else we're going to have to count the
elements by walking the 'struct hash_table' buckets.  Probably easier to just
keep an explicit element count.

> +}
> +
>  /**
>   * traceeval_iterator_put - release a given iterator
>   * @iter: The iterartor to release
> -- 
> 2.40.1
>
diff mbox series

Patch

diff --git a/include/traceeval-hist.h b/include/traceeval-hist.h
index eefa48d..44d071f 100644
--- a/include/traceeval-hist.h
+++ b/include/traceeval-hist.h
@@ -204,6 +204,8 @@  int traceeval_query_size(struct traceeval *teval, const struct traceeval_data *k
 void traceeval_results_release(struct traceeval *teval,
 			       const struct traceeval_data *results);
 
+size_t traceeval_count(struct traceeval *teval);
+
 #define traceeval_stat(teval, keys, type)				\
 	traceeval_stat_size(teval, keys, TRACEEVAL_ARRAY_SIZE(keys), type)
 
diff --git a/src/histograms.c b/src/histograms.c
index 2456342..ac3f7f7 100644
--- a/src/histograms.c
+++ b/src/histograms.c
@@ -1006,6 +1006,17 @@  int traceeval_remove_size(struct traceeval *teval,
 	return 1;
 }
 
+/**
+ * traceeval_count - Return the number of elements in the traceeval
+ * @teval: The traceeval handle to get the count from
+ *
+ * Returns the number of elements stored by unique keys in the @teval.
+ */
+size_t traceeval_count(struct traceeval *teval)
+{
+	return teval->update_counter;
+}
+
 /**
  * traceeval_iterator_put - release a given iterator
  * @iter: The iterartor to release