/* 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 "base/StatIntvlRec.h"
#include "base/polyLogCats.h"
#include "pgl/PglCodeSym.h"
#include "pgl/EveryCodeSym.h"
#include "runtime/Goal.h"
#include "runtime/DutState.h"
#include "runtime/Script.h"
#include "runtime/LogComment.h"
#include "runtime/ErrorMgr.h"
#include "runtime/DutWatchdog.h"
bool DutWatchdog::IsEnabled = false;
int DutWatchdog::TheLastId = 0;
DutWatchdog::DutWatchdog(): theId(-1), theGoal(0), theScript(0), theStats(0) {
theId = ++TheLastId;
theStats = new StatIntvlRec;
}
DutWatchdog::~DutWatchdog() {
delete theGoal;
delete theScript;
}
void DutWatchdog::configure(const EveryCodeSym &cfg) {
theGoal = new Goal;
configureGoal(*cfg.goal());
const CodeSym *codeCfg = cfg.call();
Assert(codeCfg);
theScript = new Script(*codeCfg);
theScript->statsSampler(this);
}
// may be called run-time to reconfigure
void DutWatchdog::configureGoal(const GoalSym &goalCfg) {
Assert(theGoal);
theGoal->configure(goalCfg);
}
void DutWatchdog::start() {
if (IsEnabled) {
theStart = TheClock;
Comment(6) << "fyi: DUT watchdog(" << theId << ") is on:" << endl;
Comment << "\tsampling goal:" << endl;
theGoal->print(Comment, "\t\t");
Comment << "\tcode:" << endl <<
"\t\t" << theScript->code() << endc;
startListen();
nextSample();
checkpoint();
}
}
void DutWatchdog::stop() {
if (IsEnabled) {
stopListen();
Comment(6) << "fyi: DUT watchdog(" << theId << ") is off" << endc;
}
cancelAlarms();
}
void DutWatchdog::wakeUp(const Alarm &alarm) {
AlarmUser::wakeUp(alarm);
checkpoint();
}
StatIntvlRec &DutWatchdog::getRec(int cat) {
// XXX: we should change getRec() to return pointers to indicate absence of
// as record for a given log category
Assert(cat == lgcCltSide);
theStats->theDuration = duration();
return *theStats;
}
const StatIntvlRec &DutWatchdog::getRec(int cat) const {
Assert(cat == lgcCltSide);
return *theStats;
}
bool DutWatchdog::checkpoint() {
Assert(IsEnabled);
theStats->theDuration = duration();
if (!theGoal->reached(*this))
return false;
act();
nextSample();
return false;
}
void DutWatchdog::nextSample() {
cancelAlarms();
theStart = TheClock;
theStats->restart();
//theScript->reset();
if (theGoal->duration() >= 0)
sleepFor(theGoal->duration());
}
void DutWatchdog::act() {
// Comment(6) << "fyi: DUT watchdog(" << theId << ") acts" << endc;
// XXX: this should be an asynchronous call
theScript->run();
}
Time DutWatchdog::duration() const {
return TheClock - theStart;
}
int DutWatchdog::xactCnt() const {
return theStats->xactCnt();
}
BigSize DutWatchdog::fillSz() const {
return theStats->totFillSize();
}
int DutWatchdog::fillCnt() const {
return theStats->totFillCount();
}
int DutWatchdog::xactErrCnt() const {
return theStats->theXactErrCnt;
}
syntax highlighted by Code2HTML, v. 0.9.1