/* Web Polygraph http://www.web-polygraph.org/
* (C) 2003-2006 The Measurement Factory
* Licensed under the Apache License, Version 2.0 */
#include "base/polygraph.h"
#include "xstd/h/iomanip.h"
#include "runtime/StatPhase.h"
#include "runtime/StatPhaseMgr.h"
#include "xstd/Socket.h"
#include "runtime/LogComment.h"
#include "runtime/Notifier.h"
#include "runtime/PolyOLog.h"
#include "runtime/SharedOpts.h"
#include "runtime/StatCycle.h"
#include "xstd/gadgets.h"
#include "runtime/globals.h"
#include "base/polyLogTags.h"
#include "base/polyLogCats.h"
class StatCycleRec: public StatIntvlRec {
};
StatCycle::StatCycle(): theRecs(lgcEnd), theNotifier(0) {
for (int i = 0; i < theRecs.capacity(); ++i)
theRecs.push(new StatCycleRec);
}
StatCycle::~StatCycle() {
while (theRecs.count()) delete theRecs.pop();
}
void StatCycle::period(Time aPeriod) {
thePeriod = aPeriod;
}
void StatCycle::start() {
Assert(thePeriod > 0);
startListen();
nextIntvl(TheClock + thePeriod);
}
void StatCycle::notifier(Notifier *aNotifier) {
theNotifier = aNotifier;
}
void StatCycle::wakeUp(const Alarm &alarm) {
const Time wakeUpTime = Should(alarm.time() > 0) ?
alarm.time() : TheClock;
StatIntvl::wakeUp(alarm);
restart();
// absolute deadlines to detect overload conditions in best-effort tests
nextIntvl(wakeUpTime + thePeriod);
}
void StatCycle::nextIntvl(Time wakeUpTime) {
theIntvlStart = TheClock;
sleepTill(wakeUpTime);
}
void StatCycle::restart() {
Assert(theIntvlStart > 0);
setDuration(theIntvlStart);
storeAll(TheOLog, lgStatCycleRec);
if (TheReportCat > 0)
report(*theRecs[TheReportCat]);
for (int i = 0; i < theRecs.count(); ++i) {
StatCycleRec &rec = *theRecs[i];
if (theNotifier && IsActiveCat[i])
theNotifier->noteStats(rec, i);
rec.restart();
}
}
StatIntvlRec &StatCycle::getRec(int cat) {
Assert(0 < cat && cat < theRecs.count());
return *theRecs[cat];
}
const StatIntvlRec &StatCycle::getRec(int cat) const {
Assert(0 < cat && cat < theRecs.count());
return *theRecs[cat];
}
void StatCycle::report(const StatCycleRec &rec) const {
const String phase = TheStatPhaseMgr->name();
ostream &repAll = Comment(2) << "i-" << phase;
rec.linePrintAll(repAll, true);
repAll << endc;
if (rec.theSslStat.active()) {
ostream &repSsl = Comment(6) << "i-" << phase;
rec.linePrintSsl(repSsl, true);
repSsl << endc;
}
if (TheOpts.theDumpFlags(dumpEmbedStats)) {
Comment(2) << "embedded content stats:" << endl
<< "\ttags seen: " << TheEmbedStats.tagSeen
<< " matched: " << TheEmbedStats.tagMatched << endl
<< "\tattrs seen: " << TheEmbedStats.attrSeen
<< " matched: " << TheEmbedStats.attrMatched << endl
<< "\tURLs seen: " << TheEmbedStats.urlSeen
<< endc;
}
if (TheEmbedStats.foreignUrlRequested || TheEmbedStats.foreignUrlReceived) {
ostream &os = Comment(2) << "foreign URLs:"
<< " requested: " << TheEmbedStats.foreignUrlRequested;
if (TheEmbedStats.foreignUrlReceived)
os << " served: " << TheEmbedStats.foreignUrlReceived;
os << endc;
}
}
syntax highlighted by Code2HTML, v. 0.9.1