1 /* 2 * blktrace output analysis: generate a timeline & gather statistics 3 * 4 * Copyright (C) 2006 Alan D. Brunelle <Alan.Brunelle (at) hp.com> 5 * 6 * This program is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License as published by 8 * the Free Software Foundation; either version 2 of the License, or 9 * (at your option) any later version. 10 * 11 * This program is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 * GNU General Public License for more details. 15 * 16 * You should have received a copy of the GNU General Public License 17 * along with this program; if not, write to the Free Software 18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 19 * 20 */ 21 #include "globals.h" 22 23 struct bno_dump { 24 FILE *rfp, *wfp, *cfp; 25 }; 26 27 static FILE *bno_dump_open(struct d_info *dip, char rwc) 28 { 29 FILE *fp; 30 char *oname; 31 32 oname = malloc(strlen(bno_dump_name) + strlen(dip->dip_name) + 32); 33 sprintf(oname, "%s_%s_%c.dat", bno_dump_name, dip->dip_name, rwc); 34 if ((fp = my_fopen(oname, "w")) == NULL) { 35 perror(oname); 36 free(oname); 37 } else 38 add_file(fp, oname); 39 return fp; 40 } 41 42 static inline void bno_dump_write(FILE *fp, struct io *iop) 43 { 44 fprintf(fp, "%15.9lf %lld %lld\n", BIT_TIME(iop->t.time), 45 (long long)BIT_START(iop), (long long)BIT_END(iop)); 46 } 47 48 void *bno_dump_alloc(struct d_info *dip) 49 { 50 struct bno_dump *bdp; 51 52 if (bno_dump_name == NULL) return NULL; 53 54 bdp = malloc(sizeof(*bdp)); 55 bdp->rfp = bno_dump_open(dip, 'r'); 56 bdp->wfp = bno_dump_open(dip, 'w'); 57 bdp->cfp = bno_dump_open(dip, 'c'); 58 59 return bdp; 60 } 61 62 void bno_dump_free(void *param) 63 { 64 free(param); 65 } 66 67 void bno_dump_add(void *handle, struct io *iop) 68 { 69 struct bno_dump *bdp = handle; 70 71 if (bdp) { 72 FILE *fp = IOP_READ(iop) ? bdp->rfp : bdp->wfp; 73 74 if (fp) 75 bno_dump_write(fp, iop); 76 if (bdp->cfp) 77 bno_dump_write(bdp->cfp, iop); 78 } 79 } 80