Statistics.h
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #ifndef KLEE_STATISTICS_H
00011 #define KLEE_STATISTICS_H
00012
00013 #include "Statistic.h"
00014
00015 #include <vector>
00016 #include <string>
00017 #include <string.h>
00018
00019 namespace klee {
00020 class Statistic;
00021 class StatisticRecord {
00022 friend class StatisticManager;
00023
00024 private:
00025 uint64_t *data;
00026
00027 public:
00028 StatisticRecord();
00029 StatisticRecord(const StatisticRecord &s);
00030 ~StatisticRecord() { delete[] data; }
00031
00032 void zero();
00033
00034 uint64_t getValue(const Statistic &s) const;
00035 void incrementValue(const Statistic &s, uint64_t addend) const;
00036 StatisticRecord &operator =(const StatisticRecord &s);
00037 StatisticRecord &operator +=(const StatisticRecord &sr);
00038 };
00039
00040 class StatisticManager {
00041 private:
00042 bool enabled;
00043 std::vector<Statistic*> stats;
00044 uint64_t *globalStats;
00045 uint64_t *indexedStats;
00046 StatisticRecord *contextStats;
00047 unsigned index;
00048
00049 public:
00050 StatisticManager();
00051 ~StatisticManager();
00052
00053 void useIndexedStats(unsigned totalIndices);
00054
00055 StatisticRecord *getContext();
00056 void setContext(StatisticRecord *sr);
00057
00058 void setIndex(unsigned i) { index = i; }
00059 unsigned getIndex() { return index; }
00060 unsigned getNumStatistics() { return stats.size(); }
00061 Statistic &getStatistic(unsigned i) { return *stats[i]; }
00062
00063 void registerStatistic(Statistic &s);
00064 void incrementStatistic(Statistic &s, uint64_t addend);
00065 uint64_t getValue(const Statistic &s) const;
00066 void incrementIndexedValue(const Statistic &s, unsigned index,
00067 uint64_t addend) const;
00068 uint64_t getIndexedValue(const Statistic &s, unsigned index) const;
00069 void setIndexedValue(const Statistic &s, unsigned index, uint64_t value);
00070 int getStatisticID(const std::string &name) const;
00071 Statistic *getStatisticByName(const std::string &name) const;
00072 };
00073
00074 extern StatisticManager *theStatisticManager;
00075
00076 inline void StatisticManager::incrementStatistic(Statistic &s,
00077 uint64_t addend) {
00078 if (enabled) {
00079 globalStats[s.id] += addend;
00080 if (indexedStats) {
00081 indexedStats[index*stats.size() + s.id] += addend;
00082 if (contextStats)
00083 contextStats->data[s.id] += addend;
00084 }
00085 }
00086 }
00087
00088 inline StatisticRecord *StatisticManager::getContext() {
00089 return contextStats;
00090 }
00091 inline void StatisticManager::setContext(StatisticRecord *sr) {
00092 contextStats = sr;
00093 }
00094
00095 inline void StatisticRecord::zero() {
00096 ::memset(data, 0, sizeof(*data)*theStatisticManager->getNumStatistics());
00097 }
00098
00099 inline StatisticRecord::StatisticRecord()
00100 : data(new uint64_t[theStatisticManager->getNumStatistics()]) {
00101 zero();
00102 }
00103
00104 inline StatisticRecord::StatisticRecord(const StatisticRecord &s)
00105 : data(new uint64_t[theStatisticManager->getNumStatistics()]) {
00106 ::memcpy(data, s.data,
00107 sizeof(*data)*theStatisticManager->getNumStatistics());
00108 }
00109
00110 inline StatisticRecord &StatisticRecord::operator=(const StatisticRecord &s) {
00111 ::memcpy(data, s.data,
00112 sizeof(*data)*theStatisticManager->getNumStatistics());
00113 return *this;
00114 }
00115
00116 inline void StatisticRecord::incrementValue(const Statistic &s,
00117 uint64_t addend) const {
00118 data[s.id] += addend;
00119 }
00120 inline uint64_t StatisticRecord::getValue(const Statistic &s) const {
00121 return data[s.id];
00122 }
00123
00124 inline StatisticRecord &
00125 StatisticRecord::operator +=(const StatisticRecord &sr) {
00126 unsigned nStats = theStatisticManager->getNumStatistics();
00127 for (unsigned i=0; i<nStats; i++)
00128 data[i] += sr.data[i];
00129 return *this;
00130 }
00131
00132 inline uint64_t StatisticManager::getValue(const Statistic &s) const {
00133 return globalStats[s.id];
00134 }
00135
00136 inline void StatisticManager::incrementIndexedValue(const Statistic &s,
00137 unsigned index,
00138 uint64_t addend) const {
00139 indexedStats[index*stats.size() + s.id] += addend;
00140 }
00141
00142 inline uint64_t StatisticManager::getIndexedValue(const Statistic &s,
00143 unsigned index) const {
00144 return indexedStats[index*stats.size() + s.id];
00145 }
00146
00147 inline void StatisticManager::setIndexedValue(const Statistic &s,
00148 unsigned index,
00149 uint64_t value) {
00150 indexedStats[index*stats.size() + s.id] = value;
00151 }
00152 }
00153
00154 #endif