00001
00014
00015 #ifndef NET_INSTAWEB_UTIL_PUBLIC_SHARED_MEM_STATISTICS_H_
00016 #define NET_INSTAWEB_UTIL_PUBLIC_SHARED_MEM_STATISTICS_H_
00017
00018 #include <cstddef>
00019 #include "base/scoped_ptr.h"
00020 #include "net/instaweb/util/public/abstract_mutex.h"
00021 #include "net/instaweb/util/public/basictypes.h"
00022 #include "net/instaweb/util/public/statistics.h"
00023 #include "net/instaweb/util/public/statistics_template.h"
00024 #include "net/instaweb/util/public/string.h"
00025 #include "net/instaweb/util/public/string_util.h"
00026
00027 namespace net_instaweb {
00028
00029 class MessageHandler;
00030 class AbstractSharedMem;
00031 class AbstractSharedMemSegment;
00032
00051 class SharedMemVariable : public Variable {
00052 public:
00053 int64 Get64() const;
00054 virtual int Get() const;
00055 virtual void Set(int newValue);
00056 virtual void Add(int delta);
00057
00058 private:
00059 friend class SharedMemTimedVariable;
00060 friend class SharedMemStatistics;
00061
00062 explicit SharedMemVariable(const StringPiece& name);
00063
00064 void AttachTo(AbstractSharedMemSegment* segment_, size_t offset,
00065 MessageHandler* message_handler);
00066
00069 void Reset();
00070
00072 const GoogleString name_;
00073
00075 scoped_ptr<AbstractMutex> mutex_;
00076
00078 volatile int64* value_ptr_;
00079
00080 DISALLOW_COPY_AND_ASSIGN(SharedMemVariable);
00081 };
00082
00083 class SharedMemHistogram : public Histogram {
00084 public:
00085 virtual ~SharedMemHistogram();
00086 virtual void Add(double value);
00087 virtual void Clear();
00088 virtual int MaxBuckets();
00092 virtual void EnableNegativeBuckets();
00094 virtual void SetMinValue(double value);
00098 virtual void SetMaxValue(double value);
00101 virtual void SetMaxBuckets(int i);
00105 size_t AllocationSize() {
00106 size_t total = sizeof(HistogramBody) + sizeof(double) * MaxBuckets();
00107 return total;
00108 }
00109
00110 protected:
00111 virtual AbstractMutex* lock() {
00112 return mutex_.get();
00113 }
00114 virtual double AverageInternal();
00115 virtual double PercentileInternal(const double perc);
00116 virtual double StandardDeviationInternal();
00117 virtual double CountInternal();
00118 virtual double MaximumInternal();
00119 virtual double MinimumInternal();
00120 virtual double BucketStart(int index);
00121 virtual double BucketCount(int index);
00122
00123 private:
00124 friend class SharedMemStatistics;
00125 SharedMemHistogram();
00126 void AttachTo(AbstractSharedMemSegment* segment_, size_t offset,
00127 MessageHandler* message_handler);
00128 double BucketWidth();
00129 int FindBucket(double value);
00130 void Init();
00131 void Reset();
00132 void ClearInternal();
00133 const GoogleString name_;
00134 scoped_ptr<AbstractMutex> mutex_;
00136 struct HistogramBody {
00138 bool enable_negative_;
00140 double min_value_;
00143 double max_value_;
00145 double min_;
00147 double max_;
00148 double count_;
00149 double sum_;
00150 double sum_of_squares_;
00152 double values_[1];
00153 };
00155 int max_buckets_;
00156 HistogramBody* buffer_;
00157 DISALLOW_COPY_AND_ASSIGN(SharedMemHistogram);
00158 };
00159
00160 class SharedMemStatistics : public StatisticsTemplate<SharedMemVariable,
00161 SharedMemHistogram, FakeTimedVariable> {
00162 public:
00163 SharedMemStatistics(AbstractSharedMem* shm_runtime,
00164 const GoogleString& filename_prefix);
00165 virtual ~SharedMemStatistics();
00166
00173 void Init(bool parent, MessageHandler* message_handler);
00174
00177 void GlobalCleanup(MessageHandler* message_handler);
00178
00179 protected:
00180 virtual SharedMemVariable* NewVariable(const StringPiece& name, int index);
00181 virtual SharedMemHistogram* NewHistogram(const StringPiece& name);
00182 virtual FakeTimedVariable* NewTimedVariable(const StringPiece& name,
00183 int index);
00184
00185 private:
00186 GoogleString SegmentName() const;
00187
00190 bool InitMutexes(size_t per_var, MessageHandler* message_handler);
00191
00192 AbstractSharedMem* shm_runtime_;
00193 GoogleString filename_prefix_;
00194 scoped_ptr<AbstractSharedMemSegment> segment_;
00195 bool frozen_;
00196
00197 DISALLOW_COPY_AND_ASSIGN(SharedMemStatistics);
00198 };
00199
00200 }
00201
00202 #endif ///< NET_INSTAWEB_UTIL_PUBLIC_SHARED_MEM_STATISTICS_H_