Go to the documentation of this file.00001 #include <stdio.h>
00002 #include <stdlib.h>
00003 #include <string.h>
00004 #include "debug.h"
00005 #include "trace.h"
00006 #ifdef WIN32
00007 #define inline __inline
00008 #endif
00009
00010
00011
00012
00013 inline int is_valid_mode(int mode) {
00014 if(mode == DISKMON_TRACE) return 1;
00015
00016 return 0;
00017 }
00018
00019
00020
00021
00022 inline int is_valid_op(int op) {
00023 if(op == INV) return 0;
00024 else if(op == READ || op == WRITE || op == TRIM)
00025 return 1;
00026 return 0;
00027 }
00028
00029
00030
00031
00032 inline int is_valid_traceio(struct traceio *traceio){
00033 if(is_valid_mode(traceio->mode)) {
00034 if(traceio->fp != NULL) return 1;
00035 }
00036
00037 return 0;
00038 }
00039
00040
00041
00042
00043 traceio_handler open_traceio(char *filename, int mode){
00044 #ifdef WIN32
00045 int err;
00046 #endif
00047 struct traceio *ret;
00048 FILE *fp = NULL;
00049 ret = (struct traceio *)malloc(sizeof(struct traceio));
00050 if(ret == NULL){
00051 error("trace file open filaed: out of memory");
00052 goto err1;
00053 }
00054
00055 {
00056 if(!is_valid_mode(mode)){
00057 error("trace file open failed: invalid mode");
00058 goto err;
00059 }
00060
00061 #ifdef WIN32
00062 err = fopen_s(&fp, filename, "r");
00063 if(err != 0) {
00064 #else
00065 fp = fopen(filename, "r");
00066 if(fp == NULL) {
00067 #endif
00068 error("trace file open failed: (%s)", filename);
00069 goto err;
00070 }
00071
00072
00073 ret->fp = fp;
00074 }
00075 ret->mode = mode;
00076
00077 return ret;
00078
00079 err1:
00080 fclose(fp);
00081 err:
00082 return NULL;
00083
00084 }
00085
00086
00087
00088
00089 void close_traceio(traceio_handler handler){
00090 struct traceio *traceio;
00091
00092 traceio = (struct traceio *)handler;
00093
00094 if(!is_valid_traceio(traceio)){
00095 error("trace close failed: invalid handler");
00096 return;
00097 }
00098
00099 fclose(traceio->fp);
00100
00101 free(traceio);
00102 return;
00103 }
00104
00105
00106
00107
00108 _u32 str2op(char *op){
00109 if(op[0] == 'R') return READ;
00110 else if(op[0] == 'W') return WRITE;
00111
00112
00113 return INV;
00114 }
00115
00116 struct op_unit __next_op_diskmon(struct traceio *traceio){
00117 char op[8];
00118 struct op_unit eofret = {END, 0, 0}, ret;
00119 double temp1, temp2, temp3, temp4;
00120
00121 if(fscanf(traceio->fp,
00122 "%lf\t%lf\t%lf\t%lf\t%s\t%u\t%u\n",
00123 &temp1, &temp2, &temp3, &temp4, op, &ret.sector, &ret.length) == EOF){
00124 return eofret;
00125 }
00126
00127 ret.op = str2op(op);
00128
00129 return ret;
00130 }
00131
00132
00133
00134
00135 struct op_unit next_op(traceio_handler handler){
00136 struct traceio *traceio;
00137 struct op_unit invret = {INV, 0, 0};
00138
00139 traceio = (struct traceio *)handler;
00140 if(!is_valid_traceio(traceio)){
00141 error("trace next failed: invalid handler");
00142 return invret;
00143 }
00144
00145 switch(traceio->mode) {
00146 case DISKMON_TRACE: return __next_op_diskmon(traceio); break;
00147 }
00148
00149 return invret;
00150 }
00151
00152 int is_valid_op_unit(struct op_unit op_unit){
00153 return is_valid_op(op_unit.op);
00154 }
00155
00156
00157
00158
00159 int is_last(struct op_unit op_unit){
00160 if(op_unit.op == END) return 1;
00161
00162 return 0;
00163 }