/* 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
