Statistics.h

Go to the documentation of this file.
00001 //===-- Statistics.h --------------------------------------------*- C++ -*-===//
00002 //
00003 //                     The KLEE Symbolic Virtual Machine
00004 //
00005 // This file is distributed under the University of Illinois Open Source
00006 // License. See LICENSE.TXT for details.
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); /* null to reset */
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

Generated on Fri Jun 5 03:31:31 2009 for klee by  doxygen 1.5.8