/* 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 "xstd/h/sstream.h" #include "runtime/StatPhase.h" #include "runtime/StatPhaseMgr.h" #include "runtime/polyBcastChannels.h" StatPhaseMgr TheStatPhaseMgr; StatPhaseMgr::StatPhaseMgr(): thePhase(0), thePhaseIdx(-1) { } StatPhaseMgr::~StatPhaseMgr() { thePhase = 0; while (thePhases.count()) delete thePhases.pop(); } void StatPhaseMgr::addPhase(StatPhase *ph) { Assert(ph); Assert(!ph->used()); thePhases.append(ph); } int StatPhaseMgr::phaseSyncPos() const { return thePhaseIdx + (thePhase->unlockToStop() ? 1 : 0); } void StatPhaseMgr::start() { nextPhase(); } void StatPhaseMgr::forceFlush() { for (int i = 0; i < thePhases.count(); ++i) if (thePhases[i]->used()) thePhases[i]->flush(); } void StatPhaseMgr::noteDone(StatPhase *ph) { Assert(thePhase == ph); nextPhase(); } void StatPhaseMgr::nextPhase() { const StatPhase *prevPhase = thePhase; if (thePhaseIdx >= thePhases.count() - 1) { // all phases have finished ostringstream s; s << "all " << thePhases.count() << " phases met their goals" << ends; Broadcast(ThePhasesEndChannel, s.str().c_str()); streamFreeze(s, false); // add a never-finishing phase when all official phases are over // so that agents do not have to check for some phase to exist // note: this phase is never deleted, but that's OK thePhase = new StatPhase; thePhase->name("cold"); thePhase->statsLogged(false); ++thePhaseIdx; } else { thePhase = thePhases[++thePhaseIdx]; } Assert(thePhase); thePhase->start(this, prevPhase); } void StatPhaseMgr::reportCfg(ostream &os) const { // header os << setw(10) << "phase" << ' ' << setw(8) << "pop_beg" << ' ' << setw(8) << "pop_end" << ' ' << setw(8) << "load_beg" << ' ' << setw(8) << "load_end" << ' ' << setw(8) << " rec_beg" << ' ' << setw(8) << " rec_end" << ' ' << setw(8) << "smsg_beg" << ' ' << setw(8) << "smsg_end" << ' ' << setw(8) << "goal" << "\t flags" << endl; for (int i = 0; i < thePhases.count(); ++i) thePhases[i]->reportCfg(os); }