dsdplog.c
Go to the documentation of this file.00001 #include "dsdpsys.h"
00002 #include <stdio.h>
00003 #include <stdlib.h>
00004
00005 #define DSDP_MAX_EVENT_NAME_LENGTH 50
00006 #define DSDP_MAX_EVENTS 30
00007
00012 FILE *dsdpoutputfile;
00013
00014 typedef struct {
00015 int counter;
00016 double begintime;
00017 double totaltime;
00018 char ename[DSDP_MAX_EVENT_NAME_LENGTH];
00019 } EventInfo;
00020
00021
00022 typedef struct{
00023 EventInfo event[DSDP_MAX_EVENTS];
00024 int nevents;
00025 int neventsmax;
00026 double time0;
00027 } EventLog;
00028
00029 static EventLog eventlog;
00030
00031
00032 #undef __FUNCT__
00033 #define __FUNCT__ "DSDPEventLogBegin"
00034 int DSDPEventLogBegin(int eventid){
00035 double tt;
00036 DSDPTime(&tt);
00037 if (eventid<=0){return 0;}
00038 if (eventlog.event[eventid].begintime!=0 && eventid!=DSDP_MAX_EVENTS-1){
00039 DSDPPrintf("Timing error: id: %d %s. Call begin without calling end.%4.4e\n",eventid,eventlog.event[eventid].ename,eventlog.event[eventid].begintime);
00040 };
00041 eventlog.event[eventid].begintime=tt;
00042 eventlog.event[eventid].counter++;
00043 return 0;
00044 }
00045
00046 #undef __FUNCT__
00047 #define __FUNCT__ "DSDPEventLogEnd"
00048 int DSDPEventLogEnd(int eventid){
00049 double tt;
00050 DSDPTime(&tt);
00051 if (eventid<=0){return 0;}
00052 tt=tt-eventlog.event[eventid].begintime;
00053 eventlog.event[eventid].totaltime+=tt;
00054 eventlog.event[eventid].begintime=0;
00055 return 0;
00056 }
00057
00058 #undef __FUNCT__
00059 #define __FUNCT__ "DSDPEventLogRegister"
00060 int DSDPEventLogRegister(const char *ename, int *eventid){
00061 int id;
00062 id=eventlog.nevents;
00063 if (id<0 || id>=DSDP_MAX_EVENTS){ *eventid=DSDP_MAX_EVENTS-1;return 0;}
00064 eventlog.event[id].begintime=0;
00065 eventlog.event[id].totaltime=0;
00066 eventlog.event[id].counter=0;
00067 strncpy(eventlog.event[id].ename,ename,DSDP_MAX_EVENT_NAME_LENGTH-1);
00068 eventlog.nevents++;
00069 *eventid=id;
00070 return 0;
00071 }
00072
00073 #undef __FUNCT__
00074 #define __FUNCT__ "DSDPEventLogInitialize"
00075 int DSDPEventLogInitialize(void){
00076 int i;
00077 double t0;
00078 DSDPTime(&t0);
00079 eventlog.time0=t0;
00080 for (i=0;i<DSDP_MAX_EVENTS;i++){
00081 eventlog.event[i].begintime=0;
00082 eventlog.event[i].totaltime=0;
00083 eventlog.event[i].counter=0;
00084 strncpy(eventlog.event[i].ename,"",DSDP_MAX_EVENT_NAME_LENGTH-1);
00085 }
00086 eventlog.nevents=1;
00087 return 0;
00088 }
00089
00090 #undef __FUNCT__
00091 #define __FUNCT__ "DSDPEventLogSummary"
00092 int DSDPEventLogSummary(void){
00093 int i;
00094 double etime,ttime,tfinal;
00095 DSDPTime(&tfinal);
00096 if (tfinal==0){
00097 DSDPPrintf("DSDP Timing is not turned on. Check installation and recompile. \n\n");
00098 }
00099 ttime=tfinal-eventlog.time0;
00100
00101 DSDPPrintf("PERFORMANCE SUMMARY\n");
00102 DSDPPrintf(" Event Calls Time(s) Time(%%)\n");
00103 DSDPPrintf("--------------------------------------------------------------------------\n");
00104 for (i=1;i<eventlog.nevents;i++){
00105 etime=eventlog.event[i].totaltime;
00106 if (etime==0 || eventlog.event[i].counter==0) continue;
00107 DSDPPrintf(" %40s %9d %4.4e %5.2f\n",eventlog.event[i].ename,eventlog.event[i].counter,etime,100*etime/ttime);
00108 }
00109 DSDPPrintf("--------------------------------------------------------------------------\n");
00110
00111 if (dsdpoutputfile){
00112 fprintf(dsdpoutputfile,"PERFORMANCE SUMMARY\n");
00113 fprintf(dsdpoutputfile," Event Calls Time(s) Time(%%)\n");
00114 fprintf(dsdpoutputfile,"--------------------------------------------------------------------------\n");
00115 for (i=1;i<eventlog.nevents;i++){
00116 etime=eventlog.event[i].totaltime;
00117 if (etime==0 || eventlog.event[i].counter==0) continue;
00118 fprintf(dsdpoutputfile," %40s %9d %4.4e %5.2f\n",eventlog.event[i].ename,eventlog.event[i].counter,etime,100*etime/ttime);
00119 }
00120 fprintf(dsdpoutputfile,"--------------------------------------------------------------------------\n");
00121 }
00122 fflush(NULL);
00123 return 0;
00124 }
00125