00001
00002
00003
00004
00005
00006 #ifndef EQBASE_CLOCK_H
00007 #define EQBASE_CLOCK_H
00008
00009 #include <eq/base/base.h>
00010
00011 #ifdef Darwin
00012
00013 # include <mach/mach_time.h>
00014 #endif
00015
00016 #ifdef WIN32
00017 # include <Windows.h>
00018 #else
00019 # include <time.h>
00020 #endif
00021
00022 namespace eq
00023 {
00024 namespace base
00025 {
00029 class EQ_EXPORT Clock
00030 {
00031 public :
00035 Clock()
00036 {
00037 reset();
00038 #ifdef Darwin
00039 mach_timebase_info( &_timebaseInfo );
00040 #elif defined (WIN32)
00041 QueryPerformanceFrequency( &_frequency );
00042 #endif
00043 }
00044
00048 virtual ~Clock() {}
00049
00053 void reset()
00054 {
00055 #ifdef Darwin
00056 _start = mach_absolute_time();
00057 #elif defined (WIN32)
00058 QueryPerformanceCounter( &_start );
00059 #else
00060 clock_gettime( CLOCK_REALTIME, &_start );
00061 #endif
00062 }
00063
00072 void setAlarm( const float time )
00073 {
00074 reset();
00075 #ifdef Darwin
00076 _start += static_cast<uint64_t>(
00077 time / _timebaseInfo.numer * _timebaseInfo.denom *
00078 1000000.f );
00079 #elif defined (WIN32)
00080 _start.QuadPart += static_cast<long long>( 0.001f * time *
00081 _frequency.QuadPart);
00082 #else
00083 const int sec = static_cast<int>( time * 0.001f );
00084 _start.tv_sec += sec;
00085 _start.tv_nsec += (static_cast<int>(time) - sec) * 1000000;
00086 #endif
00087 }
00088
00094 float getTimef() const
00095 {
00096 #ifdef Darwin
00097 const int64_t elapsed = mach_absolute_time() - _start;
00098 return ( elapsed * _timebaseInfo.numer / _timebaseInfo.denom /
00099 1000000.f );
00100 #elif defined (WIN32)
00101 LARGE_INTEGER now;
00102 QueryPerformanceCounter( &now );
00103 return 1000.0f * (now.QuadPart - _start.QuadPart) /
00104 _frequency.QuadPart;
00105 #else
00106 struct timespec now;
00107 clock_gettime( CLOCK_REALTIME, &now );
00108 return ( 1000.0f * (now.tv_sec - _start.tv_sec) +
00109 0.000001f * (now.tv_nsec - _start.tv_nsec));
00110 #endif
00111 }
00112
00118 int64_t getTime64() const
00119 {
00120 #ifdef Darwin
00121 const int64_t elapsed = mach_absolute_time() - _start;
00122 return ( elapsed * _timebaseInfo.numer / _timebaseInfo.denom /
00123 1000000 );
00124 #elif defined (WIN32)
00125 LARGE_INTEGER now;
00126 QueryPerformanceCounter( &now );
00127 return 1000 * (now.QuadPart - _start.QuadPart) /
00128 _frequency.QuadPart;
00129 #else
00130 struct timespec now;
00131 clock_gettime( CLOCK_REALTIME, &now );
00132 return ( 1000 * (now.tv_sec - _start.tv_sec) +
00133 static_cast< int64_t >(0.000001f *
00134 (now.tv_nsec-_start.tv_nsec)));
00135 #endif
00136 }
00137
00143 double getTimed() const
00144 {
00145 #ifdef Darwin
00146 const int64_t elapsed = mach_absolute_time() - _start;
00147 return ( elapsed * _timebaseInfo.numer / _timebaseInfo.denom /
00148 1000000. );
00149 #elif defined (WIN32)
00150 LARGE_INTEGER now;
00151 QueryPerformanceCounter( &now );
00152 return 1000.0 * (now.QuadPart - _start.QuadPart) / _frequency.QuadPart;
00153 #else
00154 struct timespec now;
00155 clock_gettime( CLOCK_REALTIME, &now );
00156 return ( 1000.0 * (now.tv_sec - _start.tv_sec) +
00157 0.000001 * (now.tv_nsec - _start.tv_nsec));
00158 #endif
00159 }
00160
00169 float getMSf() const
00170 {
00171 #if defined (Darwin) || defined (WIN32)
00172 double time = getTimed();
00173 return static_cast<float>
00174 (time - static_cast<unsigned>(time/1000.) * 1000);
00175 #else
00176 struct timespec now;
00177 clock_gettime( CLOCK_REALTIME, &now );
00178
00179 if( now.tv_nsec < _start.tv_nsec )
00180 return ( 1000.f + 0.000001f*(now.tv_nsec - _start.tv_nsec));
00181
00182 return ( 0.000001f * ( now.tv_nsec - _start.tv_nsec ));
00183 #endif
00184 }
00185
00186 private:
00187 #ifdef Darwin
00188 uint64_t _start;
00189 mach_timebase_info_data_t _timebaseInfo;
00190 #elif defined (WIN32)
00191 LARGE_INTEGER _start;
00192 LARGE_INTEGER _frequency;
00193 #else
00194 struct timespec _start;
00195 #endif
00196 };
00197 }
00198 }
00199 #endif // EQBASE_CLOCK_H