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