/* 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 "base/StatIntvlRec.h"
#include "base/polyLogCats.h"
#include "pgl/PglStringSym.h"
#include "pgl/PglListSym.h"
#include "pgl/PglCodeSym.h"
#include "pgl/PglNumSym.h"
#include "pgl/GoalSym.h"
#include "pgl/StatSampleSym.h"
#include "runtime/StatIntvl.h"
#include "runtime/DutWatchdog.h"
#include "runtime/LogComment.h"
#include "runtime/StatPhaseMgr.h"
#include "runtime/StatPhase.h"
#include "runtime/Script.h"
Script::Script(const SynSym &aCode): theCode(aCode.clone()) {
}
Script::~Script() {
delete theCode;
theCode = 0;
}
void Script::statsSampler(Sampler *aSampler) {
Should(!aSampler ^ !theSampler);
theSampler = aSampler;
}
const SynSym &Script::code() const {
Assert(theCode);
return *theCode;
}
void Script::run() {
if (!DutWatchdog::IsEnabled)
return;
if (Should(theCode)) {
openContext(theCode->loc().fname()); // add lineno
interpret(*theCode);
closeContext();
}
}
ExpressionSym *Script::callFunc(const String &cname, const ListSym &args) {
if (cname == "currentLoadFactor") {
checkArgs(cname, 0, args);
const double factor = TheStatPhaseMgr->loadFactor().current();
return new NumSym(factor); // Place
}
if (cname == "currentPopulusFactor") {
checkArgs(cname, 0, args);
const double factor = TheStatPhaseMgr->populusFactor().current();
return new NumSym(factor);
}
if (cname == "currentSample" && Should(theSampler)) {
checkArgs(cname, 0, args);
const StatIntvlRec &s = theSampler->getRec(lgcCltSide);
return new StatSampleSym(s);
}
if (cname == "currentPhase") {
checkArgs(cname, 0, args);
const StatIntvlRec &s = TheStatPhaseMgr->getRec(lgcCltSide);
return new StatSampleSym(s);
}
return PglSemx::callFunc(cname, args);
}
void Script::callProc(const String &cname, const ListSym &args) {
if (cname == "changeLoadFactorBy") {
checkArgs(cname, 1, args);
const NumSym &ratios = (const NumSym&)
extractArg(cname, 0, args, NumSym::TheType);
const double ratio = ratios.val();
TheStatPhaseMgr->loadFactor().changeBy(ratio);
return;
}
if (cname == "setLoadFactorTo") {
checkArgs(cname, 1, args);
const NumSym &ratios = (const NumSym&)
extractArg(cname, 0, args, NumSym::TheType);
const double ratio = ratios.val();
TheStatPhaseMgr->loadFactor().setTo(ratio);
return;
}
if (cname == "changePopulusFactorBy") {
checkArgs(cname, 1, args);
const NumSym &ratios = (const NumSym&)
extractArg(cname, 0, args, NumSym::TheType);
const double ratio = ratios.val();
TheStatPhaseMgr->populusFactor().changeBy(ratio);
return;
}
if (cname == "setPopulusFactorTo") {
checkArgs(cname, 1, args);
const NumSym &ratios = (const NumSym&)
extractArg(cname, 0, args, NumSym::TheType);
const double ratio = ratios.val();
TheStatPhaseMgr->populusFactor().setTo(ratio);
return;
}
if (cname == "setSamplingGoalTo") {
checkArgs(cname, 1, args);
const GoalSym &goal = (const GoalSym&)
extractArg(cname, 0, args, GoalSym::TheType);
theSampler->configureGoal(goal);
return;
}
if (cname == "print") {
ostream &os = Comment(5) << "script output: ";
for (int i = 0; i < args.count(); ++i) {
const SynSym *s = args[i];
if (s->isA(StringSym::TheType)) // remove quotes
os << ((const StringSym&)s->cast(StringSym::TheType)).val();
else
s->print(os);
}
os << endc;
return;
}
PglSemx::callProc(cname, args);
}
void Script::execEveryCode(const EveryCodeSym &ecode) {
DutWatchdog *dog = new DutWatchdog;
dog->configure(ecode);
TheStatPhaseMgr->addWatchdog(dog);
dog->start();
}
syntax highlighted by Code2HTML, v. 0.9.1