diff options
Diffstat (limited to 'ACE/apps/JAWS/clients/WebSTONE/src/bench.c')
-rw-r--r-- | ACE/apps/JAWS/clients/WebSTONE/src/bench.c | 635 |
1 files changed, 635 insertions, 0 deletions
diff --git a/ACE/apps/JAWS/clients/WebSTONE/src/bench.c b/ACE/apps/JAWS/clients/WebSTONE/src/bench.c new file mode 100644 index 00000000000..54e6147ba4d --- /dev/null +++ b/ACE/apps/JAWS/clients/WebSTONE/src/bench.c @@ -0,0 +1,635 @@ +/* $Id$ */ +/************************************************************************** + * * + * Copyright (C) 1995 Silicon Graphics, Inc. * + * * + * These coded instructions, statements, and computer programs were * + * developed by SGI for public use. If any changes are made to this code* + * please try to get the changes back to the author. Feel free to make * + * modifications and changes to the code and release it. * + * * + **************************************************************************/ + +/* FUZZ: disable check_for_math_include */ + +#include <stdio.h> +#include <errno.h> +#include <stdlib.h> +#include <string.h> +#include <sys/types.h> +#include <math.h> +#include <limits.h> +#include <float.h> +#ifndef WIN32 +#include <unistd.h> +#include <sys/time.h> +#include <sys/uio.h> +#include <sys/param.h> +#include <netdb.h> +#else +#include <windows.h> +#include <winsock.h> +#endif /* WIN32 */ +#include "sysdep.h" +#include "bench.h" + + +/* allocate memory and exit if out of memory */ +void *mymalloc(size_t size) { +void *ptr; + + ptr = malloc(size); + if (ptr == NULL) + errexit("Call to malloc() failed\n"); + return ptr; +} + +/* + * Receive n bytes from a socket + */ +int +recvdata(SOCKET sock, char *ptr, int nbytes) { + + int nleft, nread; + + nleft = nbytes; + while (nleft > 0) + { + D_PRINTF( "In recvdata(%d, %d)\n", sock, nleft ); + nread = NETREAD(sock, ptr, nleft); + D_PRINTF( "NETREAD() returned %d\n", nread ); + if (BADSOCKET(nread) || nread == 0) + { + /* return error value NETWRITE */ + D_PRINTF( "Error in recvdata(): %s\n",neterrstr() ); + return(nread); + } + + D_PRINTF( "NETREAD() data: \"%.*s\"\n", nread, ptr); + nleft -= nread; + ptr += nread; + } /* end while */ + + /* return >= 0 */ + return(nbytes - nleft); + +} /* end recvdata */ + + +/* + * Send n bytes to a socket + */ +int +senddata(SOCKET sock, char *ptr, int nbytes) { + int nleft, nwritten; + + D_PRINTF( "In senddata(%d, \"%.*s\", %d)\n", sock, nbytes, ptr, nbytes ); + nleft = nbytes; + while (nleft > 0) + { + nwritten = NETWRITE(sock, ptr, nleft); + D_PRINTF( "senddata() returned %d\n", nwritten ); + if (BADSOCKET(nwritten)) + { + /* return error value from NETWRITE */ + D_PRINTF( "Error in senddata(): %s\n", neterrstr() ); + return(nwritten); + } + nleft -= nwritten; + ptr += nwritten; + } + return(nbytes - nleft); + +} /* end senddata */ + +/* GENERAL NOTE: the conversion routines that follow pass their results + * back in a static arrays. A second call to the same routine overwrites + * the previous buffer value for that routine. If you want to save the + * value in the buffer copy it to another variable. + */ + +char * +timeval_to_text(const struct timeval *the_timeval) { + /* + * given a timeval (seconds and microseconds), put the text + * "seconds.microseconds" into timeval_as_text + */ + THREAD static char timeval_as_text[SIZEOF_TIMEVALTEXT+1]; + int seconds, microseconds; + int returnval = 0; + + seconds = the_timeval->tv_sec; + microseconds = the_timeval->tv_usec; + returnval = sprintf(timeval_as_text, + "%10d.%6.6d\t", seconds, microseconds); + return timeval_as_text; +} + + +char * +double_to_text(const double the_double) { + /* + * given a double, return text + */ + THREAD static char double_as_text[SIZEOF_DOUBLETEXT + 1]; + int returnval = 0; + + returnval = sprintf(double_as_text, "%17.01f\t", the_double); + return(double_as_text); +} + +struct timeval +text_to_timeval(char *timeval_as_text) { + int returnval = 0; + long int seconds, microseconds; + struct timeval the_timeval; + + D_PRINTF("T/%d %s\n", (int)timeval_as_text, timeval_as_text); + returnval = sscanf(timeval_as_text, "%ld.%ld", + &seconds, µseconds); + the_timeval.tv_sec = seconds; + the_timeval.tv_usec = microseconds; + return the_timeval; +} + +double +text_to_double(char *double_as_text) { + double the_double = 0; + int returnval = 0; + + D_PRINTF("D/%d %s\n", (int)double_as_text, double_as_text); + returnval = sscanf(double_as_text, "%lf", &the_double); + return(the_double); +} + + +rqst_stats_t * +text_to_rqst_stats(char *rqst_stats_as_text) { + THREAD static rqst_stats_t rqst_stats; + rqst_stats_t *the_rqst_stats = &rqst_stats; + + the_rqst_stats->totalresponsetime = + text_to_timeval(strtok(rqst_stats_as_text, "\t")); + + the_rqst_stats->totalresponsetimesq = + text_to_double(strtok((char *)NULL, "\t")); + + the_rqst_stats->minresponsetime = + text_to_timeval(strtok((char *)NULL, "\t")); + + the_rqst_stats->maxresponsetime = + text_to_timeval(strtok((char *)NULL, "\t")); + + the_rqst_stats->totalconnecttime = + text_to_timeval(strtok((char *)NULL, "\t")); + + the_rqst_stats->totalconnecttimesq = + text_to_double(strtok((char *)NULL, "\t")); + + the_rqst_stats->minconnecttime = + text_to_timeval(strtok((char *)NULL, "\t")); + + the_rqst_stats->maxconnecttime = + text_to_timeval(strtok((char *)NULL, "\t")); + + the_rqst_stats->totalconnects = (unsigned long) + text_to_double(strtok((char *)NULL, "\t")); + + the_rqst_stats->totalerrs = (unsigned long) + text_to_double(strtok((char *)NULL, "\t")); + + the_rqst_stats->totalerrortime = + text_to_timeval(strtok((char *)NULL, "\t")); + + the_rqst_stats->totalbytes = + text_to_double(strtok((char *)NULL, "\t")); + + the_rqst_stats->totalbytessq = + text_to_double(strtok((char *)NULL, "\t")); + + the_rqst_stats->minbytes = + text_to_double(strtok((char *)NULL, "\t")); + + the_rqst_stats->maxbytes = + text_to_double(strtok((char *)NULL, "\t")); + + the_rqst_stats->totalbody = + text_to_double(strtok((char *)NULL, "\t")); + + the_rqst_stats->totalbodysq = + text_to_double(strtok((char *)NULL, "\t")); + + the_rqst_stats->minbody = + text_to_double(strtok((char *)NULL, "\t")); + + the_rqst_stats->maxbody = + text_to_double(strtok((char *)NULL, "\t")); + + return(the_rqst_stats); +} /* end text_to_rqst_stats */ + + +char * +rqst_stats_to_text(rqst_stats_t *the_rqst_stats) { + THREAD static char rqst_stats_as_text[SIZEOF_RQSTSTATSTEXT]; + char *tmpbuf; + + *rqst_stats_as_text = 0; + + tmpbuf = timeval_to_text(&(the_rqst_stats->totalresponsetime)); + strcat(rqst_stats_as_text, tmpbuf); + + tmpbuf = double_to_text((the_rqst_stats->totalresponsetimesq)); + strcat(rqst_stats_as_text, tmpbuf); + + tmpbuf = timeval_to_text(&(the_rqst_stats->minresponsetime)); + strcat(rqst_stats_as_text, tmpbuf); + + tmpbuf = timeval_to_text(&(the_rqst_stats->maxresponsetime)); + strcat(rqst_stats_as_text, tmpbuf); + + tmpbuf = timeval_to_text(&(the_rqst_stats->totalconnecttime)); + strcat(rqst_stats_as_text, tmpbuf); + + tmpbuf = double_to_text((the_rqst_stats->totalconnecttimesq)); + strcat(rqst_stats_as_text, tmpbuf); + + tmpbuf = timeval_to_text(&(the_rqst_stats->minconnecttime)); + strcat(rqst_stats_as_text, tmpbuf); + + tmpbuf = timeval_to_text(&(the_rqst_stats->maxconnecttime)); + strcat(rqst_stats_as_text, tmpbuf); + + tmpbuf = double_to_text((the_rqst_stats->totalconnects)); + strcat(rqst_stats_as_text, tmpbuf); + + tmpbuf = double_to_text((the_rqst_stats->totalerrs)); + strcat(rqst_stats_as_text, tmpbuf); + + tmpbuf = timeval_to_text(&(the_rqst_stats->totalerrortime)); + strcat(rqst_stats_as_text, tmpbuf); + + tmpbuf = double_to_text((the_rqst_stats->totalbytes)); + strcat(rqst_stats_as_text, tmpbuf); + + tmpbuf = double_to_text((the_rqst_stats->totalbytessq)); + strcat(rqst_stats_as_text, tmpbuf); + + tmpbuf = double_to_text((the_rqst_stats->minbytes)); + strcat(rqst_stats_as_text, tmpbuf); + + tmpbuf = double_to_text((the_rqst_stats->maxbytes)); + strcat(rqst_stats_as_text, tmpbuf); + + tmpbuf = double_to_text((the_rqst_stats->totalbody)); + strcat(rqst_stats_as_text, tmpbuf); + + tmpbuf = double_to_text((the_rqst_stats->totalbodysq)); + strcat(rqst_stats_as_text, tmpbuf); + + tmpbuf = double_to_text((the_rqst_stats->minbody)); + strcat(rqst_stats_as_text, tmpbuf); + + tmpbuf = double_to_text((the_rqst_stats->maxbody)); + strcat(rqst_stats_as_text, tmpbuf); + + D_PRINTF( "rqst_stats_to_text returning %d: %s\n", + strlen(rqst_stats_as_text), + rqst_stats_as_text ); + + return(rqst_stats_as_text); +} + + +stats_t * +text_to_stats(char *stats_as_text) { + int i; + rqst_stats_t *the_rqst_stats; + THREAD static stats_t stats; + stats_t *the_stats = &stats; + + D_PRINTF( "Parsing stats: %s\n", stats_as_text ); + /* grab stats.rs */ + the_rqst_stats = text_to_rqst_stats(stats_as_text); + the_stats->rs = *the_rqst_stats; + + /* grab main structure */ + the_stats->starttime = text_to_timeval(strtok((char *)NULL, "\t")); + the_stats->endtime = text_to_timeval(strtok((char *)NULL, "\t")); + the_stats->datatime = text_to_timeval(strtok((char *)NULL, "\t")); + the_stats->totalpages = (unsigned long) text_to_double(strtok((char *)NULL, "\t")); + the_stats->total_num_of_files = (unsigned int) text_to_double(strtok((char *)NULL, "\t")); + for (i = 0; i < number_of_pages; i++) + { + the_stats->page_numbers[i] = (unsigned int) text_to_double(strtok((char *)NULL, "\t")); + } + /* return bytes read */ + D_PRINTF( "Returning stats\n"); + return(the_stats); +} /* end text_to_stats */ + + + +char * +stats_to_text(const stats_t *the_stats) { + int i; + THREAD static char stats_as_text[SIZEOF_STATSTEXT]; + char *tmpbuf; + rqst_stats_t the_rqst_stats; + + *stats_as_text = 0; + + /* stats.rs */ + the_rqst_stats = the_stats->rs; + tmpbuf = rqst_stats_to_text(&the_rqst_stats); + strcat(stats_as_text, tmpbuf); + + /* main structure */ + + tmpbuf = timeval_to_text(&(the_stats->starttime)); + strcat(stats_as_text, tmpbuf); + + tmpbuf = timeval_to_text(&(the_stats->endtime)); + strcat(stats_as_text, tmpbuf); + + tmpbuf = timeval_to_text(&(the_stats->datatime)); + strcat(stats_as_text, tmpbuf); + + tmpbuf = double_to_text((the_stats->totalpages)); + strcat(stats_as_text, tmpbuf); + + tmpbuf = double_to_text((the_stats->total_num_of_files)); + strcat(stats_as_text, tmpbuf); + + for (i = 0; i < number_of_pages; i++) + { + tmpbuf = double_to_text((the_stats->page_numbers[i])); + strcat(stats_as_text, tmpbuf); + } + + strcat(stats_as_text, "\n"); + + return(stats_as_text); +} /* end stats_to_text */ + + + +page_stats_t * +text_to_page_stats(char *page_stats_as_text) { + rqst_stats_t *the_rqst_stats; + THREAD static page_stats_t pagestat; + page_stats_t *pagestats = &pagestat; + + /* grab stats.rs */ + the_rqst_stats = text_to_rqst_stats(page_stats_as_text); + + /* grab main structure */ + pagestats->totalpages = (unsigned long) text_to_double(strtok((char *)NULL, "\t")); + + pagestats->page_size = (unsigned int) text_to_double(strtok((char *)NULL, "\t")); + + pagestats->page_valid = (int) text_to_double(strtok((char *)NULL, "\t")); + + pagestats->rs = *the_rqst_stats; + /* return bytes read */ + + return(pagestats); +} /* end text_to_page_stats */ + + + +char * +page_stats_to_text(const page_stats_t *pagestats) { + THREAD static char page_stats_as_text[SIZEOF_PAGESTATSTEXT]; + char *tmpbuf; + rqst_stats_t the_rqst_stats; + + *page_stats_as_text = 0; + + /* stats.rs */ + the_rqst_stats = pagestats->rs; + tmpbuf = rqst_stats_to_text(&the_rqst_stats); + strcat(page_stats_as_text, tmpbuf); + + /* main structure */ + tmpbuf = double_to_text(pagestats->totalpages); + strcat(page_stats_as_text, tmpbuf); + + tmpbuf = double_to_text(pagestats->page_size); + strcat(page_stats_as_text, tmpbuf); + + tmpbuf = double_to_text(pagestats->page_valid); + strcat(page_stats_as_text, tmpbuf); + + strcat(page_stats_as_text, "\n"); + + return(page_stats_as_text); +} /* end page_stats_to_text */ + +void +rqtimer_init(rqst_timer_t *p) { + memset(p, 0, sizeof(*p)); +} + +void +rqstat_init(rqst_stats_t *p) { + memset(p, 0, sizeof(*p)); + + p->minbytes = DBL_MAX; + p->minbody = DBL_MAX; + p->minconnecttime.tv_sec = LONG_MAX; + p->minconnecttime.tv_usec = LONG_MAX; + p->minresponsetime.tv_sec = LONG_MAX; + p->minresponsetime.tv_usec = LONG_MAX; +} + +void +stats_init(stats_t *p) { + + memset(p, 0, sizeof(*p)); + + p->rs.minbytes = DBL_MAX; + p->rs.minbody = DBL_MAX; + p->rs.minconnecttime.tv_sec = LONG_MAX; + p->rs.minconnecttime.tv_usec = LONG_MAX; + p->rs.minresponsetime.tv_sec = LONG_MAX; + p->rs.minresponsetime.tv_usec = LONG_MAX; +} + +void +page_stats_init(page_stats_t *p) { + + memset(p, 0, sizeof(*p)); + + /* commented out so that unread pages result in + page_stats_as_text buffer overflow + p->rs.minbytes = DBL_MAX; + p->rs.minbody = DBL_MAX; + p->rs.minconnecttime.tv_sec = LONG_MAX; + p->rs.minconnecttime.tv_usec = LONG_MAX; + p->rs.minresponsetime.tv_sec = LONG_MAX; + p->rs.minresponsetime.tv_usec = LONG_MAX; + + */ +} + +void +rqstat_times(rqst_stats_t *rs, rqst_timer_t *rt) +{ + double t; + + compdifftime(&(rt->exittime), &(rt->entertime), + &(rs->totalresponsetime)); + t = timevaldouble(&(rs->totalresponsetime)); + rs->totalresponsetimesq = t * t; + + rs->minresponsetime = rs->totalresponsetime; + rs->maxresponsetime = rs->totalresponsetime; + + compdifftime(&(rt->afterconnect), &(rt->beforeconnect), + &(rs->totalconnecttime)); + + t = timevaldouble(&(rs->totalconnecttime)); + rs->totalconnecttimesq = t * t; + + rs->minconnecttime = rs->totalconnecttime; + rs->maxconnecttime = rs->totalconnecttime; + + rs->totalbody = rt->bodybytes; + rs->totalbodysq = ((double)(rt->bodybytes)) * ((double)(rt->bodybytes)); + rs->minbody = rt->bodybytes; + rs->maxbody = rt->bodybytes; + + rs->totalbytes = rt->totalbytes; + rs->totalbytessq = ((double)(rt->totalbytes)) * ((double)(rt->totalbytes)); + rs->minbytes = rt->totalbytes; + rs->maxbytes = rt->totalbytes; + + rs->totalconnects = 1; + rs->totalerrs = 0; + rs->totalerrortime.tv_sec = 0; + rs->totalerrortime.tv_usec = 0; +} + +void +rqstat_sum(rqst_stats_t *sum, rqst_stats_t *incr) +{ + addtime( &(sum->totalresponsetime), &(incr->totalresponsetime)); + mintime( &(sum->minresponsetime), &(incr->minresponsetime)); + maxtime( &(sum->maxresponsetime), &(incr->maxresponsetime)); + sum->totalresponsetimesq += incr->totalresponsetimesq; + + addtime( &(sum->totalconnecttime), &(incr->totalconnecttime)); + mintime( &(sum->minconnecttime), &(incr->minconnecttime)); + maxtime( &(sum->maxconnecttime), &(incr->maxconnecttime)); + sum->totalconnecttimesq += incr->totalconnecttimesq; + + sum->totalconnects += incr->totalconnects; + sum->totalerrs += incr->totalerrs; + addtime( &(sum->totalerrortime), &(incr->totalerrortime)); + + sum->totalbytes += incr->totalbytes; + + sum->totalbytessq += incr->totalbytessq; + sum->minbytes = min(sum->minbytes, incr->minbytes); + sum->maxbytes = max(sum->maxbytes, incr->maxbytes); + + sum->totalbody += incr->totalbody; + + sum->totalbodysq += incr->totalbodysq; + sum->minbody = min(sum->minbody, incr->minbody); + sum->maxbody = max(sum->maxbody, incr->maxbody); + +} + + +void +rqstat_print(rqst_stats_t *stats) +{ + rqstat_fprint(stdout, stats); +} + + +void +rqstat_fprint(FILE *f, rqst_stats_t *stats) +{ + struct timeval meantime, /*vartime,*/ stdtime; + + fprintf(f, "%d connection(s) to server, %d errors\n", + stats->totalconnects, stats->totalerrs); + + if (stats->totalconnects == 0) { + fprintf(f,"NO CONNECTIONS, THEREFORE NO STATISTICS\n" + "IS YOUR WEBSERVER RUNNING?\n" + "DO THE PAGES EXIST ON THE SERVER?\n"); + return; + } + + /* title */ + fprintf(f, "\n\t\t\t Average Std Dev Minimum Maximum\n\n"); + + /* first line (connect time) */ + avgtime(&(stats->totalconnecttime), + stats->totalconnects, &meantime); + + /* variancetime(&(stats->totalconnecttime), + stats->totalconnecttimesq, + stats->totalconnects, &vartime); */ + + stddevtime(&(stats->totalconnecttime), + stats->totalconnecttimesq, + stats->totalconnects, &stdtime); + + fprintf(f, "Connect time (sec) \t%3d.%6.6d %3d.%6.6d %3d.%6.6d %3d.%6.6d\n", + meantime.tv_sec, + meantime.tv_usec, + stdtime.tv_sec, + stdtime.tv_usec, + stats->minconnecttime.tv_sec, + stats->minconnecttime.tv_usec, + stats->maxconnecttime.tv_sec, + stats->maxconnecttime.tv_usec); + + /* second line (response time) */ + avgtime(&(stats->totalresponsetime), + stats->totalconnects, &meantime); + + /* variancetime(&(stats->totalresponsetime), + stats->totalresponsetimesq, + stats->totalconnects, &vartime); */ + + stddevtime(&(stats->totalresponsetime), + stats->totalresponsetimesq, + stats->totalconnects, &stdtime); + + fprintf(f, "Response time (sec) \t%3d.%6.6d %3d.%6.6d %3d.%6.6d %3d.%6.6d\n", + meantime.tv_sec, + meantime.tv_usec, + stdtime.tv_sec, + stdtime.tv_usec, + stats->minresponsetime.tv_sec, + stats->minresponsetime.tv_usec, + stats->maxresponsetime.tv_sec, + stats->maxresponsetime.tv_usec); + + /* 3rd-5th lines (response size, body size, # bytes moved */ + fprintf(f, "Response size (bytes) \t%10.0lf %10.0lf %10.0lf %10.0lf\n", + mean(stats->totalbytes, stats->totalconnects), + stddev(stats->totalbytes, stats->totalbytessq, + stats->totalconnects), + stats->minbytes, + stats->maxbytes); + + fprintf(f, "Body size (bytes) \t%10.0lf %10.0lf %10.0lf %10.0lf\n\n", + mean(stats->totalbody, stats->totalconnects), + stddev(stats->totalbody, stats->totalbodysq, + stats->totalconnects), + stats->minbody, + stats->maxbody); + + fprintf(f, "%.0lf body bytes moved + %.0lf header bytes moved = %.0lf total\n", + stats->totalbody, + stats->totalbytes - stats->totalbody, + stats->totalbytes); + +} |