/* 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/Clock.h"
#include "probe/ProbeLinkStat.h"
ProbeLinkStat::ProbeLinkStat(): theConnCnt(0), theErrorCnt(0) {
}
void ProbeLinkStat::recordConn() {
theConnCnt++;
syncDur();
}
void ProbeLinkStat::recordError(const Error &) {
theErrorCnt++;
syncDur();
}
void ProbeLinkStat::recordRead(Size sz) {
theSockRdSzH.record(sz);
syncDur();
}
void ProbeLinkStat::recordWrite(Size sz) {
theSockWrSzH.record(sz);
syncDur();
}
void ProbeLinkStat::syncWith(const ProbeLinkStat &s) {
if (theSockRdSzH.stats().count() > s.theSockRdSzH.stats().count()) {
theSockRdSzH.reset();
theSockRdSzH += s.theSockRdSzH;
}
if (theSockWrSzH.stats().count() > s.theSockWrSzH.stats().count()) {
theSockWrSzH.reset();
theSockWrSzH += s.theSockWrSzH;
}
}
ProbeLinkStat &ProbeLinkStat::operator +=(const ProbeLinkStat &s) {
theSockRdSzH += s.theSockRdSzH;
theSockWrSzH += s.theSockWrSzH;
theConnCnt += s.theConnCnt;
theErrorCnt += s.theErrorCnt;
// XXX: pessimistic assumptions
if (theStart < 0 || (s.theStart >= 0 && s.theStart < theStart))
theStart = s.theStart;
if (theEnd < 0 || (s.theEnd >= 0 && s.theEnd > theEnd))
theEnd = s.theEnd;
return *this;
}
void ProbeLinkStat::syncDur() {
if (theStart < 0)
theStart = TheClock;
theEnd = TheClock;
}
void ProbeLinkStat::store(OLog &log) const {
log << theSockRdSzH << theSockWrSzH
<< theConnCnt << theErrorCnt
<< theStart << theEnd;
}
void ProbeLinkStat::load(ILog &log) {
log >> theSockRdSzH >> theSockWrSzH
>> theConnCnt >> theErrorCnt
>> theStart >> theEnd;
}
ostream &ProbeLinkStat::print(ostream &os, const String &pfx) const {
theSockRdSzH.print(os, pfx + "so_read.size.");
theSockWrSzH.print(os, pfx + "so_write.size.");
os << pfx << ".conn.count: " << theConnCnt << endl;
os << pfx << ".errors.count: " << theErrorCnt << endl;
os << pfx << ".duration: " << duration().secd() << endl;
return os;
}
syntax highlighted by Code2HTML, v. 0.9.1