#ifndef NET_DISK_CACHE_BLOCKFILE_STATS_H_
#define NET_DISK_CACHE_BLOCKFILE_STATS_H_
#include <stddef.h>
#include <stdint.h>
#include <array>
#include "base/containers/span.h"
#include "base/strings/string_split.h"
#include "net/base/net_export.h"
#include "net/disk_cache/blockfile/addr.h"
namespace disk_cache {
using StatsItems = base::StringPairs;
class NET_EXPORT_PRIVATE Stats {
public:
static const int kDataSizesLength = 28;
enum Counters {
MIN_COUNTER = 0,
OPEN_MISS = MIN_COUNTER,
OPEN_HIT,
CREATE_MISS,
CREATE_HIT,
RESURRECT_HIT,
CREATE_ERROR,
TRIM_ENTRY,
DOOM_ENTRY,
DOOM_CACHE,
INVALID_ENTRY,
OPEN_ENTRIES,
MAX_ENTRIES,
TIMER,
READ_DATA,
WRITE_DATA,
OPEN_RANKINGS,
GET_RANKINGS,
FATAL_ERROR,
LAST_REPORT,
LAST_REPORT_TIMER,
DOOM_RECENT,
UNUSED,
MAX_COUNTER
};
Stats();
Stats(const Stats&) = delete;
Stats& operator=(const Stats&) = delete;
~Stats();
bool Init(base::span<uint8_t> data, Addr address);
void InitSizeHistogram();
int StorageSize();
void ModifyStorageStats(int32_t old_size, int32_t new_size);
void OnEvent(Counters an_event);
void SetCounter(Counters counter, int64_t value);
int64_t GetCounter(Counters counter) const;
void GetItems(StatsItems* items);
void ResetRatios();
int GetLargeEntriesSize();
int SerializeStats(base::span<uint8_t> data, Addr* address);
private:
int GetBucketRange(size_t i) const;
int GetStatsBucket(int32_t size);
int GetRatio(Counters hit, Counters miss) const;
Addr storage_addr_;
std::array<int, kDataSizesLength> data_sizes_;
std::array<int64_t, MAX_COUNTER> counters_;
};
}
#endif