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()21 Clock::Clock() {
22 	RegisterClock(this);
23 }
24 
~Clock()25 Clock::~Clock() {
26 	UnregisterClock(this);
27 }
28 
update(Time aCurTime)29 void 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)36 void 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)53 void 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)61 void 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