QmcMetric::QmcMetric(QmcGroup *group, const char *string, double scale, bool active) { pmMetricSpec *metricSpec; char *msg; my.status = 0; my.group = group; my.scale = scale; my.idIndex = UINT_MAX; my.indomIndex = UINT_MAX; my.contextIndex = UINT_MAX; my.explicitInst = false; my.active = active; my.status = pmParseMetricSpec(string, 0, NULL, &metricSpec, &msg); if (my.status < 0) { pmprintf("%s: Error: Unable to parse metric spec:\n%s\n", pmProgname, msg); my.name = QString::null; free(msg); } else { my.name = QString(metricSpec->metric); setup(group, metricSpec); free(metricSpec); } }
static int traverse(const char *str, double scale) { pmMetricSpec *theMetric; char *msg; int sts = 0; sts = pmParseMetricSpec((char *)str, 0, (char *)0, &theMetric, &msg); if (sts < 0) { pmprintf("%s: Error: Unable to parse metric spec:\n%s\n", pmProgname, msg); free(msg); return sts; } // If the metric has instances, then it cannot be traversed if (theMetric->ninst) { QmcMetric *metric = group->addMetric(theMetric, scale); if (metric->status() >= 0) { checkUnits(metric); metrics.append(metric); numValues += metric->numValues(); } else sts = -1; } else { if (theMetric->isarch == 0) doMetricType = PM_CONTEXT_HOST; else if (theMetric->isarch == 1) doMetricType = PM_CONTEXT_ARCHIVE; else if (theMetric->isarch == 2) doMetricType = PM_CONTEXT_LOCAL; else { pmprintf("%s: Error: invalid metric source (%d): %s\n", pmProgname, theMetric->isarch, theMetric->metric); sts = -1; } doMetricSource = theMetric->source; if (sts >= 0) sts = group->use(doMetricType, doMetricSource); if (sts >= 0) { doMetricScale = scale; sts = pmTraversePMNS(theMetric->metric, dometric); if (sts >= 0 && doMetricFlag == false) sts = -1; else if (sts < 0) { pmprintf("%s: Error: %s: %s\n", pmProgname, theMetric->metric, pmErrStr(sts)); } } } free(theMetric); return sts; }