00001 #include "timer.h"
00002 #include <stdio.h>
00003 #define N 100
00004 #include "xmem.h"
00005
00006 int maxtimer=0;
00007 static struct timeval first[N],second[N];
00008
00009
00010 static int nexttimer = 0;
00011
00012
00013
00014 void starttimer_(int *n)
00015 {
00016 StartTimer(*n);
00017 }
00018
00019 float stoptimer_(int *n)
00020 {
00021 return StopTimer(*n);
00022 }
00023
00024 void StartTimer(int n)
00025 {
00026 if (n<1 || n > N)
00027 fprintf(stderr,"StartTimer: Timer number should be between 1 and %d\n",N);
00028 else {
00029 n = n-1;
00030 gettimeofday (&first[n], NULL);
00031 }
00032 }
00033
00034 float StopTimer(int n)
00035 {
00036 if (n<1 || n > N)
00037 fprintf(stderr,"StopTimer: Timer number should be between 1 and %d\n",N);
00038 else {
00039 n = n-1;
00040 gettimeofday (&second[n], NULL);
00041 if (first[n].tv_usec > second[n].tv_usec) {
00042 second[n].tv_usec += 1000000;
00043 second[n].tv_sec--;
00044 }
00045 }
00046 return (float) (second[n].tv_sec-first[n].tv_sec) +
00047 (float) (second[n].tv_usec-first[n].tv_usec)/1000000.0;
00048 }
00049
00050
00051
00052 void PushTimer(void)
00053 {
00054 StartTimer(++nexttimer);
00055 }
00056
00057 float PopTimer(void)
00058 {
00059 return StopTimer(nexttimer--);
00060 }
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074 TIMER_t *CreateTimer()
00075 {
00076 TIMER_t *timer = NULL;
00077
00078 timer = malloc(sizeof(TIMER_t));
00079
00080 if (timer)
00081 {
00082 gettimeofday(&(timer->first), NULL);
00083 }
00084
00085 return timer;
00086 }
00087
00088 float GetElapsedTime(TIMER_t *timer)
00089 {
00090 float seconds = -1;
00091
00092 if (timer)
00093 {
00094 gettimeofday(&(timer->second), NULL);
00095
00096 if (timer->first.tv_usec > timer->second.tv_usec)
00097 {
00098 timer->second.tv_usec += 1000000;
00099 timer->second.tv_sec--;
00100 }
00101
00102 seconds = (float)(timer->second.tv_sec - timer->first.tv_sec) +
00103 (float)(timer->second.tv_usec - timer->first.tv_usec) / 1000000.0;
00104 }
00105
00106 return seconds;
00107 }
00108
00109 void ResetTimer(TIMER_t *timer)
00110 {
00111 if (timer)
00112 {
00113 gettimeofday(&(timer->first), NULL);
00114 }
00115 }
00116
00117 void DestroyTimer(TIMER_t **timer)
00118 {
00119 if (timer && *timer)
00120 {
00121 free(*timer);
00122 *timer = NULL;
00123 }
00124 }