void ProcStats::update() { if (likely(lastUpdatePhase == zinfo->numPhases)) return; assert(lastUpdatePhase < zinfo->numPhases); uint64_t* endBuf = DumpWalk(coreStats, buf); assert(buf + bufSize == endBuf); for (uint64_t i = 0; i < bufSize; i++) { lastBuf[i] = buf[i] - lastBuf[i]; } std::swap(lastBuf, buf); // Now lastBuf has been updated and buf has the differences of all the counters uint64_t start = 0; for (uint32_t i = 0; i < coreStats->size(); i++) { AggregateStat* as = dynamic_cast<AggregateStat*>(coreStats->get(i)); for (uint32_t c = 0; c < as->size(); c++) { AggregateStat* cs = dynamic_cast<AggregateStat*>(as->get(c)); uint32_t p = zinfo->sched->getScheduledPid(c); if (p == (uint32_t)-1) p = zinfo->lineSize - 1; // FIXME else p = zinfo->procArray[p]->getGroupIdx(); Stat* ps = dynamic_cast<AggregateStat*>(procStats->get(p))->get(i); assert(StatSize(cs) == StatSize(ps)); IncWalk(ps, buf + start); start += StatSize(cs); } } assert(start == bufSize); lastUpdatePhase = zinfo->numPhases; }
ProcStats::ProcStats(AggregateStat* parentStat, AggregateStat* _coreStats) : coreStats(_coreStats) { uint32_t maxProcs = zinfo->lineSize; lastUpdatePhase = 0; // Check that coreStats are appropriate assert(coreStats); for (uint32_t i = 0; i < coreStats->size(); i++) { Stat* s = coreStats->get(i); AggregateStat* as = dynamic_cast<AggregateStat*>(s); auto err = [s](const char* reason) { panic("Stat %s is not per-core (%s)", s->name(), reason); }; if (!as) err("not aggregate stat"); if (!as->isRegular()) err("irregular aggregate"); if (as->size() != zinfo->numCores) err("elems != cores"); } // Initialize all the buffers bufSize = StatSize(coreStats); buf = gm_calloc<uint64_t>(bufSize); lastBuf = gm_calloc<uint64_t>(bufSize); // Create the procStats procStats = new AggregateStat(true); procStats->init("procStats", "Per-process stats"); for (uint32_t p = 0; p < maxProcs; p++) { AggregateStat* ps = new AggregateStat(false); const char* name = gm_strdup(("procStats-" + Str(p)).c_str()); ps->init(name, "Per-process stats"); for (uint32_t i = 0; i < coreStats->size(); i++) { AggregateStat* as = dynamic_cast<AggregateStat*>(coreStats->get(i)); assert(as && as->isRegular()); ps->append(replStat(as->get(0), as->name(), as->desc())); } procStats->append(ps); } parentStat->append(procStats); }