Exemple #1
0
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;
}
Exemple #2
0
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);
}