From owner-freebsd-current Thu May 17 15:48: 9 2001 Delivered-To: freebsd-current@freebsd.org Received: from critter.freebsd.dk (critter.freebsd.dk [212.242.86.163]) by hub.freebsd.org (Postfix) with ESMTP id 93BA637B423 for ; Thu, 17 May 2001 15:47:53 -0700 (PDT) (envelope-from phk@critter.freebsd.dk) Received: from critter (localhost [127.0.0.1]) by critter.freebsd.dk (8.11.3/8.11.3) with ESMTP id f4HBCtL12323; Thu, 17 May 2001 13:12:55 +0200 (CEST) (envelope-from phk@critter.freebsd.dk) To: osa@freebsd.org.ru Cc: freebsd-current@FreeBSD.ORG Subject: Re: new function for libdevstat In-Reply-To: Your message of "Sat, 12 May 2001 17:42:01 +0400." <20010512174201.A58243@freebsd.org.ru> Date: Thu, 17 May 2001 13:12:55 +0200 Message-ID: <12321.990097975@critter> From: Poul-Henning Kamp Sender: owner-freebsd-current@FreeBSD.ORG Precedence: bulk List-ID: X-Loop: FreeBSD.ORG Looks OK to me. In message <20010512174201.A58243@freebsd.org.ru>, "Sergey A. Osokin" writes: > >--9amGYk9869ThD9tj >Content-Type: text/plain; charset=us-ascii >Content-Disposition: inline > >On Fri, May 11, 2001 at 07:35:50PM +0200, Poul-Henning Kamp wrote: >> In message <20010511193907.A49316@freebsd.org.ru>, "Sergey A. Osokin" writes: >> >> >Hello. >> >2 monthes ago I talked in -current about new features for libdevstat. >> >Here is a new function, which calculate more statistics then >> >existing compute_stats(). (compute_stats() calculate only average >> >results, not read/write results). >> >Please see my first step. Comments are welcome. >> >> I really don't think this is the way... >> >> I would far rather see: >> >> enum DEVSTAT_METRIC { >> DEVSTAT_BYTES, >> DEVSTAT_BYTES_READ, >> DEVSTAT_BYTES_WRITE, >> ... >> } >> >> int >> devstat_compute_statistics( >> struct devstat *current, >> struct devstat *previous, >> enum DEVSTAT_METRIC metric, >> double *destination); >> >> Since that can be extended with new metrics without changing >> the ABI... > >OK. Please see attachment. >Thanks. >-- > >Rgdz, /"\ >Sergey Osokin aka oZZ, \ / ASCII RIBBON CAMPAIGN >osa@freebsd.org.ru X AGAINST HTML MAIL >http://freebsd.org.ru/~osa/ / \ > >--9amGYk9869ThD9tj >Content-Type: text/plain; charset=us-ascii >Content-Disposition: attachment; filename="newstat2.c" > >enum DEVSTAT_METRIC { > DEVSTAT_TOTAL_BYTES, > DEVSTAT_TOTAL_BYTES_READ, > DEVSTAT_TOTAL_BYTES_WRITE, > DEVSTAT_TOTAL_TRANSFERS, > DEVSTAT_TOTAL_TRANSFERS_READ, > DEVSTAT_TOTAL_TRANSFERS_WRITE, > DEVSTAT_TOTAL_TRANSFERS_OTHER, > DEVSTAT_TOTAL_BLOCKS, > DEVSTAT_TOTAL_BLOCKS_READ, > DEVSTAT_TOTAL_BLOCKS_WRITE, > DEVSTAT_KB_PER_TRANSFER, > DEVSTAT_KB_PER_TRANSFER_READ, > DEVSTAT_KB_PER_TRANSFER_WRITE, > DEVSTAT_TRANSFERS_PER_SECOND, > DEVSTAT_TRANSFERS_PER_SECOND_READ, > DEVSTAT_TRANSFERS_PER_SECOND_WRITE, > DEVSTAT_TRANSFERS_PER_SECOND_OTHER, > DEVSTAT_MB_PER_SECOND, > DEVSTAT_MB_PER_SECOND_READ, > DEVSTAT_MB_PER_SECOND_WRITE, > DEVSTAT_BLOCKS_PER_SECOND, > DEVSTAT_BLOCKS_PER_SECOND_READ, > DEVSTAT_BLOCKS_PER_SECOND_WRITE, > DEVSTAT_MS_PER_TRANSACTION, > DEVSTAT_MS_PER_TRANSACTION_READ, > DEVSTAT_MS_PER_TRANSACTION_WRITE >}; > >int >devstat_compute_statistics(struct devstat *current, struct devstat *previous, > long double etime, enum DEVSTAT_METRIC metric, > long double *destination) >{ > u_int64_t totalbytes, totalbytes_read, totalbytes_write; > u_int64_t totaltransfers, totaltransfers_read, totaltransfers_write, totaltransfers_other; > u_int64_t totalblocks, totalblocks_read, totalblocks_write; > char *func_name = "devstat_compute_statistics"; > > /* > * current is the only mandatory field. > */ > > if (current == NULL) { > sprintf(devstat_errbuf, "%s: current stats structure was NULL", > func_name); > return(-1); > } > > totalbytes_read = current->bytes_read - ((previous) ? previous->bytes_read : 0); > > if (metric == DEVSTAT_TOTAL_BYTES_READ) { > *destination = totalbytes_read; > return 0; > } > > totalbytes_write = current->bytes_written - ((previous) ? previous->bytes_written : 0); > > if (metric == DEVSTAT_TOTAL_BYTES_WRITE) { > *destination = totalbytes_write; > return 0; > } > >/* > totalbytes = (current->bytes_written + current->bytes_read) - > ((previous) ? (previous->bytes_written + > previous->bytes_read) : 0); >*/ > > totalbytes = totalbytes_read + totalbytes_write; > > if (metric == DEVSTAT_TOTAL_BYTES) { > *destination = totalbytes; > return 0; > } > > totaltransfers_read = current->num_reads - ((previous) ? (previous->num_reads) : 0); > > if (metric == DEVSTAT_TOTAL_TRANSFERS_READ) { > *destination = totaltransfers_read; > return 0; > } > > totaltransfers_write = current->num_writes - ((previous) ? (previous->num_writes) : 0); > > if (metric == DEVSTAT_TOTAL_TRANSFERS_WRITE) { > *destination = totaltransfers_write; > return 0; > } > > totaltransfers_other = current->num_other - ((previous) ? (previous->num_other) : 0); > > if (metric == DEVSTAT_TOTAL_TRANSFERS_OTHER) { > *destination = totaltransfers_other; > return 0; > } >/* > totaltransfers = (current->num_reads + > current->num_writes + > current->num_other) - > ((previous) ? > (previous->num_reads + > previous->num_writes + > previous->num_other) : 0); >*/ > > totaltransfers = totaltransfers_read + totaltransfers_write + totaltransfers_other; > > if (metric == DEVSTAT_TOTAL_TRANSFERS) { > *destination = totaltransfers; > return 0; > } > > if (metric == DEVSTAT_TRANSFERS_PER_SECOND) { > if (etime > 0.0) { > *destination = totaltransfers; > *destination /= etime; > return 0; > } else { > *destination = 0.0; > return 0; > } > } > > if (metric == DEVSTAT_TRANSFERS_PER_SECOND_READ) { > if (etime > 0.0) { > *destination = totaltransfers_read; > *destination /= etime; > return 0; > } else { > *destination = 0.0; > return 0; > } > } > > if (metric == DEVSTAT_TRANSFERS_PER_SECOND_WRITE) { > if (etime > 0.0) { > *destination = totaltransfers_write; > *destination /= etime; > return 0; > } else { > *destination = 0.0; > return 0; > } > } > > if (metric == DEVSTAT_TRANSFERS_PER_SECOND_OTHER) { > if (etime > 0.0) { > *destination = totaltransfers_other; > *destination /= etime; > return 0; > } else { > *destination = 0.0; > return 0; > } > } > > if (metric == DEVSTAT_KB_PER_TRANSFER) { > *destination = totalbytes; > *destination /= 1024; > if (totaltransfers > 0) { > *destination /= totaltransfers; > return 0; > } else { > *destination = 0.0; > return 0; > } > } > > if (metric == DEVSTAT_KB_PER_TRANSFER_READ) { > *destination = totalbytes_read; > *destination /= 1024; > if (totaltransfers_read > 0) { > *destination /= totaltransfers_read; > return 0; > } else { > *destination = 0.0; > return 0; > } > } > > if (metric == DEVSTAT_KB_PER_TRANSFER_WRITE) { > *destination = totalbytes_write; > *destination /= 1024; > if (totaltransfers_write > 0) { > *destination /= totaltransfers_write; > return 0; > } else { > *destination = 0.0; > return 0; > } > } > > if (metric == DEVSTAT_MB_PER_SECOND) { > *destination = totalbytes; > *destination /= 1024 * 1024; > if (etime > 0.0) { > *destination /= etime; > return 0; > } else { > *destination = 0.0; > return 0; > } > } > > if (metric == DEVSTAT_MB_PER_SECOND_READ) { > *destination = totalbytes_read; > *destination /= 1024 * 1024; > if (etime > 0.0) { > *destination /= etime; > return 0; > } else { > *destination = 0.0; > return 0; > } > } > > if (metric == DEVSTAT_MB_PER_SECOND_WRITE) { > *destination = totalbytes_write; > *destination /= 1024 * 1024; > if (etime > 0.0) { > *destination /= etime; > return 0; > } else { > *destination = 0.0; > return 0; > } > } > > totalblocks = totalbytes; > totalblocks_read = totalbytes_read; > totalblocks_write = totalbytes_write; > > if (current->block_size > 0) { > totalblocks /= current->block_size; > totalblocks_read /= current->block_size; > totalblocks_write /= current->block_size; > } > else { > totalblocks /= 512; > totalblocks_read /= 512; > totalblocks_write /= 512; > } > > if (metric == DEVSTAT_TOTAL_BLOCKS) { > *destination = totalblocks; > return 0; > } > > if (metric == DEVSTAT_TOTAL_BLOCKS_READ) { > *destination = totalblocks_read; > return 0; > } > > if (metric == DEVSTAT_TOTAL_BLOCKS_WRITE) { > *destination = totalblocks_write; > return 0; > } > > if (metric == DEVSTAT_BLOCKS_PER_SECOND) { > *destination = totalblocks; > if (etime > 0.0) { > *destination /= etime; > return 0; > } else { > *destination = 0.0; > return 0; > } > } > > if (metric == DEVSTAT_BLOCKS_PER_SECOND_READ) { > *destination = totalblocks_read; > if (etime > 0.0) { > *destination /= etime; > return 0; > } else { > *destination = 0.0; > return 0; > } > } > > if (metric == DEVSTAT_BLOCKS_PER_SECOND_WRITE) { > *destination = totalblocks_write; > if (etime > 0.0) { > *destination /= etime; > return 0; > } else { > *destination = 0.0; > return 0; > } > } > > if (metric == DEVSTAT_MS_PER_TRANSACTION) { > if (totaltransfers > 0) { > *destination = etime; > *destination /= totaltransfers; > *destination *= 1000; > return 0; > } else { > *destination = 0.0; > return 0; > } > } > > if (metric == DEVSTAT_MS_PER_TRANSACTION_READ) { > if (totaltransfers_read > 0) { > *destination = etime; > *destination /= totaltransfers_read; > *destination *= 1000; > return 0; > } else { > *destination = 0.0; > return 0; > } > } > > if (metric == DEVSTAT_MS_PER_TRANSACTION_WRITE) { > if (totaltransfers_write > 0) { > *destination = etime; > *destination /= totaltransfers_write; > *destination *= 1000; > return 0; > } else { > *destination = 0.0; > return 0; > } > } > > return(0); >} > >--9amGYk9869ThD9tj-- > >To Unsubscribe: send mail to majordomo@FreeBSD.org >with "unsubscribe freebsd-current" in the body of the message > -- Poul-Henning Kamp | UNIX since Zilog Zeus 3.20 phk@FreeBSD.ORG | TCP/IP since RFC 956 FreeBSD committer | BSD since 4.3-tahoe Never attribute to malice what can adequately be explained by incompetence. To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-current" in the body of the message