driver.c

来自「disksim是一个非常优秀的磁盘仿真工具」· C语言 代码 · 共 155 行

C
155
字号
/* diskmodel (version 1.1) * Authors: John Bucy, Greg Ganger * Contributors: John Griffin, Jiri Schindler, Steve Schlosser * * Copyright (c) of Carnegie Mellon University, 2003-2005 * * This software is being provided by the copyright holders under the * following license. By obtaining, using and/or copying this * software, you agree that you have read, understood, and will comply * with the following terms and conditions: * * Permission to reproduce, use, and prepare derivative works of this * software is granted provided the copyright and "No Warranty" * statements are included with all reproductions and derivative works * and associated documentation. This software may also be * redistributed without charge provided that the copyright and "No * Warranty" statements are included in all redistributions. * * NO WARRANTY. THIS SOFTWARE IS FURNISHED ON AN "AS IS" BASIS. * CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, EITHER * EXPRESSED OR IMPLIED AS TO THE MATTER INCLUDING, BUT NOT LIMITED * TO: WARRANTY OF FITNESS FOR PURPOSE OR MERCHANTABILITY, EXCLUSIVITY * OF RESULTS OR RESULTS OBTAINED FROM USE OF THIS SOFTWARE. CARNEGIE * MELLON UNIVERSITY DOES NOT MAKE ANY WARRANTY OF ANY KIND WITH * RESPECT TO FREEDOM FROM PATENT, TRADEMARK, OR COPYRIGHT * INFRINGEMENT.  COPYRIGHT HOLDERS WILL BEAR NO LIABILITY FOR ANY USE * OF THIS SOFTWARE OR DOCUMENTATION.   */#include <diskmodel/dm.h>#include <diskmodel/modules/modules.h>#include <libparam/libparam.h>#include <libddbg/libddbg.h>#include <stdio.h>#include <stdlib.h>#include <sys/time.h>#include <time.h>extern doTests(struct dm_disk_if *, int, char **);extern void testsUsage(void);extern int minargs;struct timingbucket {  double tot;  int n;  double start;  char *name;};#define MAXBUCKETS 10struct timingbucket buckets[MAXBUCKETS];int buckets_len = 0;int addBucket(char *name) {  struct timingbucket *b;  ddbg_assert(buckets_len+1 < MAXBUCKETS);  b = &buckets[buckets_len];  b->name = name;  b->tot = 0.0;  b->n = 0;  buckets_len++;}double tv2d(struct timeval *tv) {  double result = tv->tv_usec;  result += tv->tv_sec * 1000000;  return result;}double now(void) {  struct timeval tv;  gettimeofday(&tv, 0);  return tv2d(&tv);}// one outstanding time per bucketint startClock(int b) {  buckets[b].start = now();}int stopClock(int b) {  buckets[b].tot += now() - buckets[b].start;  buckets[b].n++;}int printTimes(void) {  int i;  for(i = 0; i < buckets_len; i++) {    struct timingbucket *b = &buckets[i];    printf("%s: n %d mean %f\n", b->name, b->n, b->tot / b->n);  }}int main(int argc, char **argv) {  int c;  int badct;  FILE *modelfile;  struct dm_disk_if *disk;  char *modelname;    ddbg_assert_setfile(stderr);  if(argc < (minargs+2)) {    testsUsage();    exit(1);  }  modelfile = fopen(argv[1], "r");  if(!modelfile) {    fprintf(stderr, "*** error: failed to open \"%s\"\n", argv[1]);  }  for(c = 0; c <= DM_MAX_MODULE; c++) {    struct lp_mod *mod;    if(c == DM_MOD_DISK) {      mod = dm_mods[c];    }    else {      mod = dm_mods[c];    }    lp_register_module(mod);  }  lp_init_typetbl();  lp_loadfile(modelfile, 0, 0, argv[1], 0, 0);  fclose(modelfile);    modelname = argc >= 3 ? argv[2] : 0;    disk = (struct dm_disk_if *)lp_instantiate("foo", modelname);  //  printf("*** got a dm_disk with %d sectors!\n", disk->dm_sectors);  printf("*** %s starting\n", argv[0]);  badct = doTests(disk, argc, argv);  printf("*** %s finished: %d bad\n", argv[0], badct);  printTimes();  exit(0);  // NOTREACHED  return 0;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?