Normal build: main.cpp
Server build: servermain.cpp
*/
+enum TimePrecision {
+ PRECISION_SECONDS,
+ PRECISION_MILLI,
+ PRECISION_MICRO,
+ PRECISION_NANO
+};
+
extern u32 getTimeMs();
+extern u32 getTime(TimePrecision prec);
/*
Timestamp stuff
u32 getTimeMs()
{
/* Use imprecise system calls directly (from porting.h) */
- return porting::getTimeMs();
+ return porting::getTime(PRECISION_MILLI);
+}
+
+u32 getTime(TimePrecision prec)
+{
+ return porting::getTime(prec);
}
#else
class TimeGetter
{
public:
- virtual u32 getTime() = 0;
+ virtual u32 getTime(TimePrecision prec) = 0;
};
// A precise irrlicht one
IrrlichtTimeGetter(IrrlichtDevice *device):
m_device(device)
{}
- u32 getTime()
+ u32 getTime(TimePrecision prec)
{
- if(m_device == NULL)
- return 0;
- return m_device->getTimer()->getRealTime();
+ if (prec == PRECISION_MILLI) {
+ if(m_device == NULL)
+ return 0;
+ return m_device->getTimer()->getRealTime();
+ } else {
+ return porting::getTime(prec);
+ }
}
private:
IrrlichtDevice *m_device;
class SimpleTimeGetter: public TimeGetter
{
public:
- u32 getTime()
+ u32 getTime(TimePrecision prec)
{
- return porting::getTimeMs();
+ return porting::getTime(prec);
}
};
{
if(g_timegetter == NULL)
return 0;
- return g_timegetter->getTime();
+ return g_timegetter->getTime(PRECISION_MILLI);
+}
+
+u32 getTime(TimePrecision prec) {
+ if (g_timegetter == NULL)
+ return 0;
+ return g_timegetter->getTime(prec);
}
#endif
}
}
// Do at least 10ms
- while(timer.getTime() < 10);
+ while(timer.getTimerTime() < 10);
u32 dtime = timer.stop();
u32 per_ms = n / dtime;
#include "irrlichttypes.h" // u32
#include "debug.h"
#include "constants.h"
+#include "gettime.h"
#ifdef _MSC_VER
#define SWPRINTF_CHARSTRING L"%S"
*/
#ifdef _WIN32 // Windows
#include <windows.h>
+
+ inline u32 getTimeS()
+ {
+ return GetTickCount() / 1000;
+ }
+
inline u32 getTimeMs()
{
return GetTickCount();
}
+
+ inline u32 getTimeUs()
+ {
+ LARGE_INTEGER freq, t;
+ QueryPerformanceFrequency(&freq);
+ QueryPerformanceCounter(&t);
+ return (double)(t.QuadPart) / ((double)(freq.QuadPart) / 1000000.0);
+ }
+
+ inline u32 getTimeNs()
+ {
+ LARGE_INTEGER freq, t;
+ QueryPerformanceFrequency(&freq);
+ QueryPerformanceCounter(&t);
+ return (double)(t.QuadPart) / ((double)(freq.QuadPart) / 1000000000.0);
+ }
+
#else // Posix
#include <sys/time.h>
+ #include <time.h>
+
+ inline u32 getTimeS()
+ {
+ struct timeval tv;
+ gettimeofday(&tv, NULL);
+ return tv.tv_sec;
+ }
+
inline u32 getTimeMs()
{
struct timeval tv;
gettimeofday(&tv, NULL);
return tv.tv_sec * 1000 + tv.tv_usec / 1000;
}
+
+ inline u32 getTimeUs()
+ {
+ struct timeval tv;
+ gettimeofday(&tv, NULL);
+ return tv.tv_sec * 1000000 + tv.tv_usec;
+ }
+
+ inline u32 getTimeNs()
+ {
+ struct timespec ts;
+ clock_gettime(CLOCK_REALTIME, &ts);
+ return ts.tv_sec * 1000000000 + ts.tv_nsec;
+ }
+
/*#include <sys/timeb.h>
inline u32 getTimeMs()
{
}*/
#endif
+inline u32 getTime(TimePrecision prec)
+{
+ switch (prec) {
+ case PRECISION_SECONDS:
+ return getTimeS();
+ case PRECISION_MILLI:
+ return getTimeMs();
+ case PRECISION_MICRO:
+ return getTimeUs();
+ case PRECISION_NANO:
+ return getTimeNs();
+ }
+ return 0;
+}
+
+
} // namespace porting
#endif // PORTING_HEADER
#include "../log.h"
#include <ostream>
-TimeTaker::TimeTaker(const char *name, u32 *result)
+TimeTaker::TimeTaker(const char *name, u32 *result, TimePrecision prec)
{
m_name = name;
m_result = result;
m_running = true;
- m_time1 = getTimeMs();
+ m_precision = prec;
+ m_time1 = getTime(prec);
}
u32 TimeTaker::stop(bool quiet)
{
if(m_running)
{
- u32 time2 = getTimeMs();
+ u32 time2 = getTime(m_precision);
u32 dtime = time2 - m_time1;
if(m_result != NULL)
{
return 0;
}
-u32 TimeTaker::getTime()
+u32 TimeTaker::getTimerTime()
{
- u32 time2 = getTimeMs();
+ u32 time2 = getTime(m_precision);
u32 dtime = time2 - m_time1;
return dtime;
}
#define UTIL_TIMETAKER_HEADER
#include "../irrlichttypes.h"
+#include "../gettime.h"
/*
TimeTaker
class TimeTaker
{
public:
- TimeTaker(const char *name, u32 *result=NULL);
+ TimeTaker(const char *name, u32 *result=NULL,
+ TimePrecision=PRECISION_MILLI);
~TimeTaker()
{
u32 stop(bool quiet=false);
- u32 getTime();
+ u32 getTimerTime();
private:
const char *m_name;
u32 m_time1;
bool m_running;
+ TimePrecision m_precision;
u32 *m_result;
};