#ifndef LIBMICRO_H
#define LIBMICRO_H
#include <pthread.h>
#define LIBMICRO_VERSION "0.4.0"
#define STRSIZE 1024
typedef struct {
long long re_count;
long long re_errors;
long long re_t0;
long long re_t1;
} result_t;
typedef struct {
double sum;
long long count;
} histo_t;
#define HISTOSIZE 32
#define DATASIZE 100000
typedef struct stats {
double st_min;
double st_max;
double st_mean;
double st_median;
double st_stddev;
double st_stderr;
double st_99confidence;
double st_skew;
double st_kurtosis;
double st_timecorr;
} stats_t;
typedef struct {
int ba_hwm;
int ba_flag;
long long ba_deadline;
int ba_phase;
int ba_waiters;
#ifdef USE_SEMOP
int ba_semid;
#else
pthread_mutex_t ba_lock;
pthread_cond_t ba_cv;
#endif
long long ba_count;
long long ba_errors;
int ba_quant;
int ba_batches;
double ba_starttime;
double ba_endtime;
#ifdef NEVER
double ba_tmin;
double ba_tmax;
double ba_ctmax;
double ba_mean;
double ba_median;
double ba_rawmedian;
double ba_stddev;
double ba_stderr;
double ba_skew;
double ba_kurtosis;
#endif
stats_t ba_raw;
stats_t ba_corrected;
int ba_outliers;
long long ba_t0;
long long ba_t1;
long long ba_count0;
long long ba_errors0;
int ba_datasize;
double ba_data[1];
} barrier_t;
barrier_t *barrier_create(int hwm, int datasize);
int barrier_destroy(barrier_t *bar);
int barrier_queue(barrier_t *bar, result_t *res);
int benchmark(void *tsd, result_t *res);
int benchmark_init();
int benchmark_fini();
int benchmark_initrun();
int benchmark_finirun();
int benchmark_initworker();
int benchmark_finiworker();
int benchmark_initbatch(void *tsd);
int benchmark_finibatch(void *tsd);
int benchmark_optswitch(int opt, char *optarg);
char *benchmark_result();
extern int lm_argc;
extern char **lm_argv;
extern int lm_optB;
extern int lm_optD;
extern int lm_optH;
extern char *lm_optN;
extern int lm_optP;
extern int lm_optS;
extern int lm_optT;
extern int lm_defB;
extern int lm_defD;
extern int lm_defH;
extern char *lm_defN;
extern int lm_defP;
extern int lm_defS;
extern int lm_defT;
extern int lm_nsecs_per_op;
extern char *lm_procpath;
extern char lm_procname[STRSIZE];
extern char lm_usage[STRSIZE];
extern char lm_optstr[STRSIZE];
extern char lm_header[STRSIZE];
extern size_t lm_tsdsize;
int getpindex();
int gettindex();
void *gettsd(int p, int t);
#if defined(__APPLE__)
int gettsdindex(void *arg);
#endif
long long getusecs();
long long getnsecs();
int setfdlimit(int limit);
long long sizetoll();
int sizetoint();
int fit_line(double *, double *, int, double *, double *);
long long get_nsecs_resolution();
#ifdef NO_PORTMAPPER
#define TCP_SELECT -31233
#define TCP_XACT -31234
#define TCP_CONTROL -31235
#define TCP_DATA -31236
#define TCP_CONNECT -31237
#define UDP_XACT -31238
#define UDP_DATA -31239
#else
#define TCP_SELECT (u_long)404038
#define TCP_XACT (u_long)404039
#define TCP_CONTROL (u_long)404040
#define TCP_DATA (u_long)404041
#define TCP_CONNECT (u_long)404042
#define UDP_XACT (u_long)404032
#define UDP_DATA (u_long)404033
#define VERS (u_long)1
#endif
#define SOCKOPT_READ 0x0001
#define SOCKOPT_WRITE 0x0002
#define SOCKOPT_RDWR 0x0003
#define SOCKOPT_PID 0x0004
#define SOCKOPT_REUSE 0x0008
#define SOCKOPT_NONE 0
#ifndef SOCKBUF
#define SOCKBUF (1024*1024)
#endif
#ifndef XFERSIZE
#define XFERSIZE (64*1024)
#endif
typedef unsigned long iter_t;
int tcp_server(int prog, int rdwr);
int tcp_done(int prog);
int tcp_accept(int sock, int rdwr);
int tcp_connect(char *host, int prog, int rdwr);
void sock_optimize(int sock, int rdwr);
int sockport(int s);
#endif