int QmcContext::lookupInDom(QmcDesc *descPtr, uint_t& indom) { int i, sts; QmcIndom *indomPtr; if ((sts = pmUseContext(my.context)) < 0) return sts; indom = UINT_MAX; if (descPtr->desc().indom != PM_INDOM_NULL) { for (i = 0; i < my.indoms.size(); i++) if (my.indoms[i]->id() == (int)descPtr->desc().indom) break; if (i == my.indoms.size()) { indomPtr = new QmcIndom(my.source->type(), *descPtr); if (indomPtr->status() < 0) { sts = indomPtr->status(); delete indomPtr; return sts; } my.indoms.append(indomPtr); indom = my.indoms.size() - 1; if (pmDebug & DBG_TRACE_PMC) { QTextStream cerr(stderr); cerr << "QmcContext::lookupInDom: Add indom for " << pmInDomStr(indomPtr->id()) << endl; } } else { indomPtr = my.indoms[i]; indom = i; if (pmDebug & DBG_TRACE_PMC) { QTextStream cerr(stderr); cerr << "QmcContext::lookupInDom: Reusing indom " << pmInDomStr(indomPtr->id()) << endl; } } } return 0; }
void QmcMetric::extractValues(pmValueSet const* set) { int i, j, index, inst; pmValue const *value = NULL; bool found; QmcIndom *indomPtr = indom(); Q_ASSERT(set->pmid == desc().id()); if (set->numval > 0) { if (hasIndom()) { // If the number of instances are not the expected number // then mark the indom as changed if (!my.explicitInst && (my.values.size() != set->numval)) { if (pmDebug & DBG_TRACE_INDOM) { QTextStream cerr(stderr); cerr << "QmcMetric::extractValues: implicit indom " << pmInDomStr(indomPtr->id()) << " changed (" << set->numval << " != " << my.values.size() << ')' << endl; } indomPtr->hasChanged(); updateIndom(); } for (i = 0; i < numInst(); i++) { QmcMetricValue &valueRef = my.values[i]; inst = my.values[i].instance(); index = indomPtr->index(inst); found = false; // If the index is within range, try it first if (index >= 0 && index < set->numval) { value = &(set->vlist[index]); // Found it in the same spot as last time if (value->inst == indomPtr->inst(inst)) found = true; } // Search for it from the top for (j = 0; found == false && j < set->numval; j++) { if (set->vlist[j].inst == indomPtr->inst(inst)) { index = j; value = &(set->vlist[j]); indomPtr->setIndex(inst, j); found = true; } } if (found) { if (real()) extractNumericMetric(set, value, valueRef); else if (!event()) extractArrayMetric(set, value, valueRef); else extractEventMetric(set, index, valueRef); } else { // Cannot find it if (pmDebug & DBG_TRACE_OPTFETCH) { QTextStream cerr(stderr); cerr << "QmcMetric::extractValues: " << spec(true, true, i) << ": " << pmErrStr(PM_ERR_VALUE) << endl; } if (valueRef.previousError() != PM_ERR_VALUE) indomPtr->hasChanged(); valueRef.setCurrentError(PM_ERR_VALUE); } } } else if (set->numval == 1) { // We have no instances at this point in time if (my.values.size() == 0 && hasInstances()) indomPtr->hasChanged(); else { QmcMetricValue &valueRef = my.values[0]; value = &(set->vlist[0]); if (real()) extractNumericMetric(set, value, valueRef); else if (!event()) extractArrayMetric(set, value, valueRef); else extractEventMetric(set, 0, valueRef); } } else { // Did not expect any instances if (pmDebug & DBG_TRACE_OPTFETCH) { QTextStream cerr(stderr); cerr << "QmcMetric::extractValues: " << spec(true) << " is a singular metric but result contained " << set->numval << " values" << endl; } setError(PM_ERR_VALUE); } } else if (set->numval == 0) { if (!(hasInstances() && numInst() == 0)) { if (pmDebug & DBG_TRACE_OPTFETCH) { QTextStream cerr(stderr); cerr << "QmcMetric::extractValues: numval == 0: " << spec(true, false) << ": " << pmErrStr(PM_ERR_VALUE) << endl; } setError(PM_ERR_VALUE); if (hasInstances()) indomPtr->hasChanged(); } } else { if (pmDebug & DBG_TRACE_OPTFETCH) { QTextStream cerr(stderr); cerr << "QmcMetric::extractValues: numval < 0: " << spec(true, false) << ": " << pmErrStr(set->numval) << endl; } setError(set->numval); if (hasInstances()) indomPtr->hasChanged(); } }