diff --git a/src/utils/smallut.cpp b/src/utils/smallut.cpp index 304df3cd..0d924a3a 100644 --- a/src/utils/smallut.cpp +++ b/src/utils/smallut.cpp @@ -1,5 +1,5 @@ #ifndef lint -static char rcsid[] = "@(#$Id: smallut.cpp,v 1.14 2006-01-23 13:32:28 dockes Exp $ (C) 2004 J.F.Dockes"; +static char rcsid[] = "@(#$Id: smallut.cpp,v 1.15 2006-01-26 12:29:20 dockes Exp $ (C) 2004 J.F.Dockes"; #endif /* * This program is free software; you can redistribute it and/or modify @@ -18,14 +18,18 @@ static char rcsid[] = "@(#$Id: smallut.cpp,v 1.14 2006-01-23 13:32:28 dockes Exp * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef TEST_SMALLUT -#include +#include +#include +#include #include #include #include - +#include #include #include +#include + #include "smallut.h" #include "debuglog.h" #include "pathut.h" @@ -346,6 +350,92 @@ string escapeHtml(const string &in) return out; } +//////////////////// +// Internal redefinition of system time interface to help with dependancies +struct m_timespec { + time_t tv_sec; + long tv_nsec; +}; + +#ifndef CLOCK_REALTIME +#define CLOCK_REALTIME 1 +#endif + +#define MILLIS(TV) ( (long)(((TV).tv_sec - m_secs) * 1000 + \ + ((TV).tv_nsec - m_nsecs) / 1000000)) + +#define MICROS(TV) ( (long)(((TV).tv_sec - m_secs) * 1000000 + \ + ((TV).tv_nsec - m_nsecs) / 1000)) + + +// We use gettimeofday instead of clock_gettime for now and get only +// uS resolution, because clock_gettime is more configuration trouble +// than it's worth +static void gettime(int, struct m_timespec *ts) +{ + struct timeval tv; + gettimeofday(&tv, 0); + ts->tv_sec = tv.tv_sec; + ts->tv_nsec = tv.tv_usec * 1000; +} +///// End system interface + +static m_timespec frozen_tv; +void Chrono::refnow() +{ + gettime(CLOCK_REALTIME, &frozen_tv); +} + +Chrono::Chrono() +{ + restart(); +} + +// Reset and return value before rest in milliseconds +long Chrono::restart() +{ + struct m_timespec tv; + gettime(CLOCK_REALTIME, &tv); + long ret = MILLIS(tv); + m_secs = tv.tv_sec; + m_nsecs = tv.tv_nsec; + return ret; +} + +// Get current timer value, milliseconds +long Chrono::millis(int frozen) +{ + if (frozen) { + return MILLIS(frozen_tv); + } else { + struct m_timespec tv; + gettime(CLOCK_REALTIME, &tv); + return MILLIS(tv); + } +} + +// +long Chrono::micros(int frozen) +{ + if (frozen) { + return MICROS(frozen_tv); + } else { + struct m_timespec tv; + gettime(CLOCK_REALTIME, &tv); + return MICROS(tv); + } +} + +float Chrono::secs(int frozen) +{ + struct m_timespec tv; + gettime(CLOCK_REALTIME, &tv); + float secs = (float)(frozen?frozen_tv.tv_sec:tv.tv_sec - m_secs); + float nsecs = (float)(frozen?frozen_tv.tv_nsec:tv.tv_nsec - m_nsecs); + //fprintf(stderr, "secs %.2f nsecs %.2f\n", secs, nsecs); + return secs + nsecs * 1e-9; +} + #else #include diff --git a/src/utils/smallut.h b/src/utils/smallut.h index 14f09a32..7d3b07b0 100644 --- a/src/utils/smallut.h +++ b/src/utils/smallut.h @@ -1,6 +1,6 @@ #ifndef _SMALLUT_H_INCLUDED_ #define _SMALLUT_H_INCLUDED_ -/* @(#$Id: smallut.h,v 1.13 2006-01-26 07:03:35 dockes Exp $ (C) 2004 J.F.Dockes */ +/* @(#$Id: smallut.h,v 1.14 2006-01-26 12:29:20 dockes Exp $ (C) 2004 J.F.Dockes */ #include #include @@ -40,6 +40,30 @@ extern bool stringToBool(const string &s); tab}) at beginning and end of input string */ extern void trimstring(string &s, const char *ws = " \t"); +/** Escape things like < or & by turining them to entities */ extern string escapeHtml(const string &in); + +class Chrono { + public: + Chrono(); + /** Reset origin */ + long restart(); + /** Snapshot current time */ + static void refnow(); + /** Get current elapsed since creation or restart + * + * @param frozen give time since the last refnow call (this is to + * allow for using one actual system call to get values from many + * chrono objects, like when examining timeouts in a queue) + */ + long millis(int frozen = 0); + long micros(int frozen = 0); + float secs(int frozen = 0); + private: + long m_secs; + long m_nsecs; +}; + + #endif /* _SMALLUT_H_INCLUDED_ */