On Sunday, December 12, 2010 2:19:42 pm Louis Lenders wrote:
+#define USER_HZ_TO_TICKSPERSEC(x,y) (ULONGLONG)10000000 * x / y
I'd recommend adding proper parenthesis, to avoid potential problems with order-of-operations.
#define USER_HZ_TO_TICKSPERSEC(x,y) ((ULONGLONG)10000000 * (x) / (y))
That way it won't break if you do math in the argument for some reason, like with USER_HZ_TO_TICKSPERSEC(val+1, user_hz) or USER_HZ_TO_TICKSPERSEC(val, user_hz*2)
static long user_hz;
user_hz = sysconf(_SC_CLK_TCK);
There's no real point to making it static if you're always going to (re)set the variable. It would be better to just make the call once:
static long user_hz;
i(user_hz == 0) user_hz = sysconf(_SC_CLK_TCK);
You could also make it an inline function to avoid making user_hz a parameter:
/* Convert system clock to 100ns tics */ static long user_hz; static inline ULONGLONG ClockToTics(ULONGLONG val) { i(user_hz == 0) user_hz = sysconf(_SC_CLK_TCK); return val * 10000000 / user_hz; } ... sppi->IdleTime.QuadPart = ClockToTics(idle); sppi->KernelTime.QuadPart = ClockToTics(sys); ...etc...
Though I'll defer judgement to others as to what's better.