diff options
Diffstat (limited to 'base/statistics.hh')
-rw-r--r-- | base/statistics.hh | 103 |
1 files changed, 46 insertions, 57 deletions
diff --git a/base/statistics.hh b/base/statistics.hh index 28c380602..e71380b90 100644 --- a/base/statistics.hh +++ b/base/statistics.hh @@ -2170,64 +2170,43 @@ class Temp operator NodePtr() { return node;} }; +} // namespace Detail + ////////////////////////////////////////////////////////////////////// // // Binning Interface // ////////////////////////////////////////////////////////////////////// - -class BinBase +struct MainBin { private: + std::string _name; char *mem; protected: off_t memsize; off_t size() const { return memsize; } - char *memory(); - - public: - BinBase(); - virtual ~BinBase(); -}; + char *memory(off_t off); -} // namespace Detail - -class GenBin : public Detail::BinBase -{ public: - GenBin() : BinBase() {} - virtual ~GenBin() {}; - - virtual void activate() = 0; - virtual std::string name() const = 0; - void regBin(GenBin *bin, std::string name); -}; - -template <class BinType> -struct StatBin : public GenBin -{ - private: - std::string _name; - - public: - std::string name() const { return _name;} - - static StatBin *&curBin() { - static StatBin *current = NULL; + static MainBin *&curBin() + { + static MainBin *current = NULL; return current; } - static void setCurBin(StatBin *bin) { curBin() = bin; } - static StatBin *current() { assert(curBin()); return curBin(); } + static void setCurBin(MainBin *bin) { curBin() = bin; } + static MainBin *current() { assert(curBin()); return curBin(); } - static off_t &offset() { + static off_t &offset() + { static off_t offset = 0; return offset; } - static off_t new_offset(size_t size) { + static off_t new_offset(size_t size) + { size_t mask = sizeof(u_int64_t) - 1; off_t off = offset(); @@ -2236,23 +2215,24 @@ struct StatBin : public GenBin return off; } - explicit StatBin(std::string name) : GenBin() { _name = name; this->regBin(this, name); } + public: + MainBin(const std::string &name); + ~MainBin(); - char *memory(off_t off) { - if (memsize == -1) { - memsize = CeilPow2((size_t) offset()); - } - assert(offset() <= size()); - return Detail::BinBase::memory() + off; + const std::string & + name() const + { + return _name; } - virtual void activate() { + void + activate() + { setCurBin(this); #ifdef FS_MEASURE DPRINTF(TCPIP, "activating %s Bin\n", name()); #endif } - static void activate(StatBin &bin) { setCurBin(&bin); } class BinBase { @@ -2261,10 +2241,12 @@ struct StatBin : public GenBin public: BinBase() : offset(-1) {} - void allocate(size_t size) { + void allocate(size_t size) + { offset = new_offset(size); } - char *access() { + char *access() + { assert(offset != -1); return current()->memory(offset); } @@ -2284,7 +2266,9 @@ struct StatBin : public GenBin int size() const { return 1; } - Storage *data(Params ¶ms) { + Storage * + data(Params ¶ms) + { assert(initialized()); char *ptr = access(); char *flags = ptr + sizeof(Storage); @@ -2294,7 +2278,9 @@ struct StatBin : public GenBin } return reinterpret_cast<Storage *>(ptr); } - void reset() + + void + reset() { char *ptr = access(); char *flags = ptr + size() * sizeof(Storage); @@ -2320,7 +2306,8 @@ struct StatBin : public GenBin VectorBin() : _size(0) {} bool initialized() const { return _size > 0; } - void init(int s, Params ¶ms) { + void init(int s, Params ¶ms) + { assert(!initialized()); assert(s > 0); _size = s; @@ -2329,7 +2316,8 @@ struct StatBin : public GenBin int size() const { return _size; } - Storage *data(int index, Params ¶ms) { + Storage *data(int index, Params ¶ms) + { assert(initialized()); assert(index >= 0 && index < size()); char *ptr = access(); @@ -2357,9 +2345,6 @@ struct StatBin : public GenBin }; }; -class MainBinType {}; -typedef StatBin<MainBinType> MainBin; - struct NoBin { template <class Storage> @@ -2379,11 +2364,13 @@ struct NoBin } bool initialized() const { return true; } - void init(Params ¶ms) { + void init(Params ¶ms) + { new (ptr) Storage(params); } int size() const{ return 1; } - Storage *data(Params ¶ms) { + Storage *data(Params ¶ms) + { assert(initialized()); return reinterpret_cast<Storage *>(ptr); } @@ -2420,7 +2407,8 @@ struct NoBin } bool initialized() const { return ptr != NULL; } - void init(int s, Params ¶ms) { + void init(int s, Params ¶ms) + { assert(s > 0 && "size must be positive!"); assert(!initialized()); _size = s; @@ -2431,7 +2419,8 @@ struct NoBin int size() const { return _size; } - Storage *data(int index, Params ¶ms) { + Storage *data(int index, Params ¶ms) + { assert(initialized()); assert(index >= 0 && index < size()); return reinterpret_cast<Storage *>(ptr + index * sizeof(Storage)); |