1/* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License, Version 1.0 only 6 * (the "License"). You may not use this file except in compliance 7 * with the License. 8 * 9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10 * or http://www.opensolaris.org/os/licensing. 11 * See the License for the specific language governing permissions 12 * and limitations under the License. 13 * 14 * When distributing Covered Code, include this CDDL HEADER in each 15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16 * If applicable, add the following below this CDDL HEADER, with the 17 * fields enclosed by brackets "[]" replaced with your own identifying 18 * information: Portions Copyright [yyyy] [name of copyright owner] 19 * 20 * CDDL HEADER END 21 */ 22 23/* 24 * Copyright 2007 Sun Microsystems, Inc. All rights reserved. 25 * Use is subject to license terms. 26 */ 27 28#ifndef LIBMICRO_H 29#define LIBMICRO_H 30 31#include <pthread.h> 32 33#define LIBMICRO_VERSION "0.4.0" 34 35#define STRSIZE 1024 36 37#define STREQ(a,b) (strcmp(a,b) == 0) 38 39typedef struct { 40 long long re_count; 41 long long re_errors; 42 long long re_t0; 43 long long re_t1; 44} result_t; 45 46typedef struct { 47 double sum; 48 long long count; 49} histo_t; 50 51#define HISTOSIZE 32 52#define DATASIZE 100000 53 54/* 55 * stats we compute on data sets 56 */ 57 58typedef struct stats { 59 double st_min; 60 double st_max; 61 double st_mean; 62 double st_median; 63 double st_stddev; 64 double st_stderr; 65 double st_99confidence; 66 double st_skew; 67 double st_kurtosis; 68 double st_timecorr; /* correlation with respect to time */ 69} stats_t; 70 71/* 72 * Barrier stuff 73 */ 74 75typedef struct { 76 int ba_hwm; /* barrier setpoint */ 77 int ba_flag; /* benchmark while true */ 78 long long ba_deadline; /* when to stop */ 79 int ba_phase; /* number of time used */ 80 int ba_waiters; /* how many are waiting */ 81 82#ifdef USE_SEMOP 83 int ba_semid; 84#else 85 pthread_mutex_t ba_lock; 86 pthread_cond_t ba_cv; 87#endif 88 89 long long ba_count; /* how many ops */ 90 long long ba_errors; /* how many errors */ 91 92 int ba_quant; /* how many quant errors */ 93 int ba_batches; /* how many samples */ 94 95 double ba_starttime; /* test time start */ 96 double ba_endtime; /* test time end */ 97 98#ifdef NEVER 99 double ba_tmin; /* min time taken */ 100 double ba_tmax; /* max time taken */ 101 double ba_ctmax; /* max after outliers */ 102 double ba_mean; /* average value */ 103 double ba_median; /* median value */ 104 double ba_rawmedian; /* raw median value */ 105 double ba_stddev; /* standard deviation */ 106 double ba_stderr; /* standard error */ 107 double ba_skew; /* skew */ 108 double ba_kurtosis; /* kurtosis */ 109#endif 110 stats_t ba_raw; /* raw stats */ 111 stats_t ba_corrected; /* corrected stats */ 112 113 int ba_outliers; /* outlier count */ 114 115 long long ba_t0; /* first thread/proc */ 116 long long ba_t1; /* time of last thread */ 117 long long ba_count0; 118 long long ba_errors0; 119 120 int ba_datasize; /* possible #items data */ 121 double ba_data[1]; /* start of data ararry */ 122} barrier_t; 123 124 125/* 126 * Barrier interfaces 127 */ 128 129barrier_t *barrier_create(int hwm, int datasize); 130int barrier_destroy(barrier_t *bar); 131int barrier_queue(barrier_t *bar, result_t *res); 132 133 134/* 135 * Functions that can be provided by the user 136 */ 137 138int benchmark(void *tsd, result_t *res); 139int benchmark_init(); 140int benchmark_fini(); 141int benchmark_initrun(); 142int benchmark_finirun(); 143int benchmark_initworker(); 144int benchmark_finiworker(); 145int benchmark_initbatch(void *tsd); 146int benchmark_finibatch(void *tsd); 147int benchmark_optswitch(int opt, char *optarg); 148char *benchmark_result(); 149 150 151/* 152 * Globals exported to the user 153 */ 154 155extern int lm_argc; 156extern char **lm_argv; 157 158extern int lm_optB; 159extern int lm_optD; 160extern int lm_optH; 161extern char *lm_optN; 162extern int lm_optP; 163extern int lm_optS; 164extern int lm_optT; 165 166extern int lm_defB; 167extern int lm_defD; 168extern int lm_defH; 169extern char *lm_defN; 170extern int lm_defP; 171extern int lm_defS; 172extern int lm_defT; 173extern int lm_nsecs_per_op; 174 175extern char *lm_procpath; 176extern char lm_procname[STRSIZE]; 177extern char lm_usage[STRSIZE]; 178extern char lm_optstr[STRSIZE]; 179extern char lm_header[STRSIZE]; 180extern size_t lm_tsdsize; 181 182 183/* 184 * Utility functions 185 */ 186 187int getpindex(); 188int gettindex(); 189void *gettsd(int p, int t); 190#if defined(__APPLE__) 191int gettsdindex(void *arg); 192#endif /* __APPLE__ */ 193long long getusecs(); 194long long getnsecs(); 195int setfdlimit(int limit); 196long long sizetoll(); 197int sizetoint(); 198int fit_line(double *, double *, int, double *, double *); 199long long get_nsecs_resolution(); 200 201 202/* Apple Mods Here */ 203 204 205 206#ifdef NO_PORTMAPPER 207#define TCP_SELECT -31233 208#define TCP_XACT -31234 209#define TCP_CONTROL -31235 210#define TCP_DATA -31236 211#define TCP_CONNECT -31237 212#define UDP_XACT -31238 213#define UDP_DATA -31239 214#else 215#define TCP_SELECT (u_long)404038 /* XXX - unregistered */ 216#define TCP_XACT (u_long)404039 /* XXX - unregistered */ 217#define TCP_CONTROL (u_long)404040 /* XXX - unregistered */ 218#define TCP_DATA (u_long)404041 /* XXX - unregistered */ 219#define TCP_CONNECT (u_long)404042 /* XXX - unregistered */ 220#define UDP_XACT (u_long)404032 /* XXX - unregistered */ 221#define UDP_DATA (u_long)404033 /* XXX - unregistered */ 222#define VERS (u_long)1 223#endif 224 225/* 226* socket send/recv buffer optimizations 227*/ 228#define SOCKOPT_READ 0x0001 229#define SOCKOPT_WRITE 0x0002 230#define SOCKOPT_RDWR 0x0003 231#define SOCKOPT_PID 0x0004 232#define SOCKOPT_REUSE 0x0008 233#define SOCKOPT_NONE 0 234 235#ifndef SOCKBUF 236#define SOCKBUF (1024*1024) 237#endif 238 239#ifndef XFERSIZE 240#define XFERSIZE (64*1024) /* all bandwidth I/O should use this */ 241#endif 242 243typedef unsigned long iter_t; 244 245int tcp_server(int prog, int rdwr); 246int tcp_done(int prog); 247int tcp_accept(int sock, int rdwr); 248int tcp_connect(char *host, int prog, int rdwr); 249void sock_optimize(int sock, int rdwr); 250int sockport(int s); 251 252/* end Apple Mods */ 253 254 255#endif /* LIBMICRO_H */ 256