1 2 /* Web Polygraph http://www.web-polygraph.org/ 3 * Copyright 2003-2011 The Measurement Factory 4 * Licensed under the Apache License, Version 2.0 */ 5 6 #include "xstd/xstd.h" 7 8 #include "xstd/Array.h" 9 #include "xstd/Clock.h" 10 11 static void RegisterClock(Clock *clock); 12 static void UnregisterClock(Clock *clock); 13 14 Clock &TheClock = *new Clock; 15 static Array<Clock*> *TheClocks = 0; 16 17 /* Clock */ 18 19 Time Clock::TheStartTime; 20 Clock()21Clock::Clock() { 22 RegisterClock(this); 23 } 24 ~Clock()25Clock::~Clock() { 26 UnregisterClock(this); 27 } 28 update(Time aCurTime)29void Clock::update(Time aCurTime) { 30 // gettimeofday(2) on FreeBSD-3.3 is buggy 31 // make sure clocks never go backwards 32 if (aCurTime > theCurTime && aCurTime.tv_usec >= 0) 33 theCurTime = aCurTime; 34 } 35 Update(bool advanceAll)36void Clock::Update(bool advanceAll) { 37 TheClock.update(Time::Now()); 38 39 if (TheStartTime < 0) 40 TheStartTime = TheClock; 41 42 if (advanceAll) { 43 for (int i = TheClocks->count()-1; i >=0 ; --i) { 44 Clock *&c = TheClocks->item(i); 45 if (c && c != &TheClock) 46 TheClocks->item(i)->update(TheClock); 47 } 48 } 49 } 50 51 52 static RegisterClock(Clock * clock)53void RegisterClock(Clock *clock) { 54 Assert(clock); 55 if (!TheClocks) 56 TheClocks = new Array<Clock*>; 57 TheClocks->append(clock); 58 } 59 60 static UnregisterClock(Clock * clock)61void UnregisterClock(Clock *clock) { 62 for (int i = TheClocks->count()-1; i >=0 ; --i) { 63 if ((*TheClocks)[i] == clock) { 64 (*TheClocks)[i] = (*TheClocks)[TheClocks->count()-1]; 65 TheClocks->pop(1); 66 return; 67 } 68 } 69 Assert(false); // clock not found 70 } 71