On Tue, 8 Aug 2023 12:11:54 -0400 Stevie Alvarez <stevie.6strings@xxxxxxxxx> wrote: > From: Stevie Alvarez (Google) <stevie.6strings@xxxxxxxxx> > > Initial header file for libtraceeval's histogram API. The interface > provides a simple way of aggregating trace data and reading through said > data. > > Signed-off-by: Stevie Alvarez (Google) <stevie.6strings@xxxxxxxxx> > --- > include/traceeval-hist.h | 130 +++++++++++++++++++++++++++++++++++++++ > 1 file changed, 130 insertions(+) > create mode 100644 include/traceeval-hist.h > > diff --git a/include/traceeval-hist.h b/include/traceeval-hist.h > new file mode 100644 > index 0000000..ebce94e > --- /dev/null > +++ b/include/traceeval-hist.h > @@ -0,0 +1,130 @@ > +/* SPDX-License-Identifier: MIT */ > +/* > + * libtraceeval histogram interface. > + * > + * Copyright (C) 2023 Google Inc, Steven Rostedt <rostedt@xxxxxxxxxxx> > + * Copyright (C) 2023 Google Inc, Stevie Alvarez <stevie.6strings@xxxxxxxxx> > + */ > +#ifndef __LIBTRACEEVAL_HIST_H__ > +#define __LIBTRACEEVAL_HIST_H__ > + > +#include <stdlib.h> > +#include <stddef.h> > +#include <stdbool.h> > + > +/* Data definition interfaces */ > + > +/* Field name/descriptor for number of hits */ > +#define TRACEEVAL_VAL_HITS ((const char *)(-1UL)) > + > +/* Data type distinguishers */ > +enum traceeval_data_type { > + TRACEEVAL_TYPE_NONE, > + TRACEEVAL_TYPE_NUMBER_64, > + TRACEEVAL_TYPE_NUMBER_32, > + TRACEEVAL_TYPE_NUMBER_16, > + TRACEEVAL_TYPE_NUMBER_8, Should be the other way around: TRACEEVAL_TYPE_NUMBER_8, TRACEEVAL_TYPE_NUMBER_16, TRACEEVAL_TYPE_NUMBER_32, TRACEEVAL_TYPE_NUMBER_64, So that _8 = 1, _16 = 2, _32 = 3 and _64 = 4 Which would allow for the: 2^(1 * (enum - 1)) algorithm. > + TRACEEVAL_TYPE_NUMBER, > + TRACEEVAL_TYPE_STRING, > + TRACEEVAL_TYPE_DYNAMIC > +}; > + > +/* Statistics specification flags */ > +enum traceeval_flags { > + TRACEEVAL_FL_SIGNED = (1 << 0), > + TRACEEVAL_FL_TIMESTAMP = (1 << 1), > +}; > + > +/* > + * Trace data entry for a traceeval histogram > + * Constitutes keys and values. > + */ > +union traceeval_data { > + char *string; > + struct traceeval_dynamic *dyn_data; > + unsigned long long number_64; > + unsigned long number; As this is a union, order doesn't matter (for sizes). But for aesthetics, perhaps switch the _64 with the number. unsigned long number; unsigned long long number_64; To keep all the "number_*" together. > + unsigned int number_32; > + unsigned short number_16; > + unsigned char number_8; > +}; > + -- Steve