/* Copyright (c) 2013 The Regents of the University of California
 * Barret Rhoden <brho@cs.berkeley.edu>
 * See LICENSE for details.
 *
 * Userspace functions for various measurements.
 *
 * For now, this is built into parlib.  We can pull it out in the future.  Many
 * of the larger functions are in flux (interfaces, options, etc). */

/* Basic stats computation and printing.
 *
 * All of these expect a 2D collection of samples, where the first array is an
 * array of arrays of samples.  The first array's members are something like
 * per-thread samples, where each thread fills in its
 * data[thread_id][sample_number].  The samples should be ordered in
 * chronological order.  Ultimately, the sample needs to produce a uint64_t
 * (e.g. TSC tick). */

#pragma once

__BEGIN_DECLS

struct sample_stats {
	int (*get_sample)(void **data, int i, int j, uint64_t *sample);
	uint64_t					avg_time;
	uint64_t					var_time;
	uint64_t					max_time;
	uint64_t					min_time;
	unsigned int				lat_50;
	unsigned int				lat_75;
	unsigned int				lat_90;
	unsigned int				lat_99;
	uint64_t					total_samples;
};

/* Computes basic stats and prints histograms, stats returned via *stats */
void compute_stats(void **data, int nr_i, int nr_j, struct sample_stats *stats);

/* Prints the throughput of events in **data */
void print_throughput(void **data, unsigned int nr_steps, uint64_t interval,
                      unsigned int nr_print_steps, uint64_t start_time,
                      int nr_i, int nr_j,
                      int (*get_sample)(void **data, int i, int j,
                                        uint64_t *sample));

__END_DECLS
