00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include "timer.h"
00026
00027 Timer::Timer()
00028 {
00029 #if defined( IRIX ) || defined( IRIX64 )
00030
00031 __psunsigned_t phys_addr, raddr;
00032 int poffmask = getpagesize() - 1;
00033 int counterSize = syssgi(SGI_CYCLECNTR_SIZE);
00034
00035 phys_addr = syssgi(SGI_QUERY_CYCLECNTR, &(cycleval));
00036 if (phys_addr == ENODEV) {
00037 Severe( "Sorry, this SGI doesn't support timers." );
00038 }
00039
00040 raddr = phys_addr & ~poffmask;
00041 fd = open("/dev/mmem", O_RDONLY);
00042
00043 if (counterSize == 64) {
00044 iotimer_addr64 =
00045 (volatile iotimer64_t *)mmap(0, poffmask, PROT_READ,
00046 MAP_PRIVATE, fd, (off_t)raddr);
00047 unmapLocation = (void *)iotimer_addr64;
00048 unmapSize = poffmask;
00049 iotimer_addr64 = (iotimer64_t *)((__psunsigned_t)iotimer_addr64 +
00050 (phys_addr & poffmask));
00051 }
00052 else if (counterSize == 32) {
00053 iotimer_addr32 = (volatile iotimer32_t *)mmap(0, poffmask, PROT_READ,
00054 MAP_PRIVATE, fd,
00055 (off_t)raddr);
00056 unmapLocation = (void *)iotimer_addr32;
00057 unmapSize = poffmask;
00058 iotimer_addr32 = (iotimer32_t *)((__psunsigned_t)iotimer_addr32 +
00059 (phys_addr & poffmask));
00060 }
00061 else {
00062 Severe( "Fatal timer init error" );
00063 }
00064 #elif defined( WIN32 )
00065
00066 QueryPerformanceFrequency( &performance_frequency );
00067 one_over_frequency = 1.0/((double)performance_frequency.QuadPart);
00068 #endif
00069 time0 = elapsed = 0;
00070 running = 0;
00071 }
00072
00073
00074 double Timer::GetTime()
00075 {
00076 #if defined( IRIX ) || defined( IRIX64 )
00077
00078 if (iotimer_addr64) {
00079 volatile iotimer64_t counter_value;
00080 counter_value = *(iotimer_addr64);
00081 return ((double) counter_value * .000000000001) * (double) cycleval;
00082 }
00083 else {
00084 volatile iotimer32_t counter_value;
00085 counter_value = *(iotimer_addr32);
00086 return ((double) counter_value * .000000000001) * (double) cycleval;
00087 }
00088 #elif defined( WIN32 )
00089
00090 QueryPerformanceCounter( &performance_counter );
00091 return (double) performance_counter.QuadPart * one_over_frequency;
00092 #else
00093
00094 gettimeofday( &timeofday, NULL );
00095 return timeofday.tv_sec + timeofday.tv_usec / 1000000.0;
00096 #endif
00097 }
00098
00099 Timer::~Timer()
00100 {
00101 #if defined( IRIX ) || defined( IRIX64 )
00102 close( fd );
00103 #endif
00104 }
00105
00106 void Timer::Start()
00107 {
00108 Assert( !running );
00109 running = 1;
00110 time0 = GetTime();
00111 }
00112
00113 void Timer::Stop()
00114 {
00115 Assert( running );
00116 running = 0;
00117
00118 elapsed += GetTime() - time0;
00119 }
00120
00121 void Timer::Reset()
00122 {
00123 running = 0;
00124 elapsed = 0;
00125 }
00126
00127 double Timer::Time()
00128 {
00129 if (running) {
00130 Stop();
00131 Start();
00132 }
00133 return elapsed;
00134 }