summaryrefslogtreecommitdiff
path: root/src/libpcp_qmc/src/qmc_indom.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/libpcp_qmc/src/qmc_indom.h')
-rw-r--r--src/libpcp_qmc/src/qmc_indom.h137
1 files changed, 137 insertions, 0 deletions
diff --git a/src/libpcp_qmc/src/qmc_indom.h b/src/libpcp_qmc/src/qmc_indom.h
new file mode 100644
index 0000000..265f3ad
--- /dev/null
+++ b/src/libpcp_qmc/src/qmc_indom.h
@@ -0,0 +1,137 @@
+/*
+ * Copyright (c) 1997-2005 Silicon Graphics, Inc. All Rights Reserved.
+ * Copyright (c) 2007 Aconex. All Rights Reserved.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation; either version 2.1 of the License, or
+ * (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+ * License for more details.
+ */
+#ifndef QMC_INDOM_H
+#define QMC_INDOM_H
+
+#include "qmc.h"
+
+#include <qlist.h>
+#include <qstring.h>
+#include <qtextstream.h>
+
+class QmcInstance
+{
+public:
+ QmcInstance();
+ QmcInstance(int id, const char* name);
+ QmcInstance const& operator=(QmcInstance const&);
+
+ void deactivate(int index);
+ int inst() const { return my.inst; }
+ bool null() const { return (my.inst == (int)PM_IN_NULL); }
+ QString name() const { return my.name; }
+ int refCount() const { return my.refCount; }
+ int refCountInc() { return ++my.refCount; }
+ int refCountDec() { return --my.refCount; }
+ bool active() const { return my.active; }
+ void setActive(bool active) { my.active = active; }
+ int index() const { return my.index; }
+ void setIndex(int index) { my.index = index; }
+
+private:
+ struct {
+ int inst; // Instance internal id
+ QString name; // Instance external id
+ int refCount;
+ int index; // Index into pmResult of last fetch
+ // May also be used to index the next NULL inst
+ bool active; // Instance was listed in last indom lookup
+ } my;
+};
+
+class QmcIndom
+{
+public:
+ QmcIndom(int type, QmcDesc &desc);
+
+ int status() const { return my.status; }
+ int id() const { return my.id; }
+
+ int numInsts() const { return my.instances.size() - my.nullCount; }
+ int numActiveInsts() const { return my.numActive; }
+
+ // Length of instance list - some of the instances may be NULL hence
+ // this may be larger than numInsts()
+ int listLen() const { return my.instances.size(); }
+
+ // Internal instance id for instance <index>
+ int inst(uint index) const { return my.instances[index].inst(); }
+
+ // External instance name for instance <index>
+ const QString name(uint index) const { return my.instances[index].name(); }
+
+ bool nullInst(uint index) const { return my.instances[index].null(); }
+
+ // Was this instance listed in the last update?
+ bool activeInst(uint index) const { return my.instances[index].active(); }
+
+ // Is this instance referenced by any metrics?
+ bool refInst(uint index) const { return my.instances[index].refCount()>0; }
+
+ // Return index into table for instance with external <name>
+ // Also adds a reference to this instance for the profile
+ int lookup(QString const& name);
+
+ // Add a reference to all instances in this indom
+ // Id <active> is set, only reference active instances
+ void refAll(bool active = false);
+
+ // Remove a reference to an instance
+ void removeRef(uint index);
+
+ // Number of instances referenced
+ uint refCount() const { return my.count; }
+
+ // Was the indom different on the last fetch?
+ bool changed() const { return my.changed; }
+
+ // About to fetch, so mark this indom as unchanged
+ void newFetch() { my.changed = false; my.updated = true; }
+
+ // Mark that the indom was different in a previous fetch
+ void hasChanged() { my.changed = true; my.updated = false; }
+
+ int update(); // Update indom with latest instances
+
+ // Has profile changed since last call to genProfile
+ bool diffProfile() const { return my.profile; }
+
+ int genProfile(); // Generate profile for current context
+
+ // Likely index into pmResult for instance <inst>
+ int index(uint inst) const { return my.instances[inst].index(); }
+ void setIndex(uint inst, int index) { my.instances[inst].setIndex(index); }
+
+ // Dump some debugging output for this indom
+ void dump(QTextStream &os) const;
+
+private:
+ struct {
+ int status;
+ int type;
+ pmInDom id;
+ QList<QmcInstance> instances; // Sparse list of instances
+ bool profile; // Does the profile need to be updated
+ bool changed; // Did indom change in the last fetch?
+ bool updated; // Has the indom been updated?
+ uint count; // Number of referenced instances
+ uint nullCount; // Count of NULL instances
+ uint nullIndex; // Index to first NULL instance
+ uint numActive; // Number of active instances
+ uint numActiveRef; // Number of active referenced insts
+ } my;
+};
+
+#endif // QMC_INDOM_H