#ifndef NET_DISK_CACHE_MEMORY_MEM_BACKEND_IMPL_H_
#define NET_DISK_CACHE_MEMORY_MEM_BACKEND_IMPL_H_
#include <stdint.h>
#include <string>
#include <unordered_map>
#include "base/compiler_specific.h"
#include "base/containers/linked_list.h"
#include "base/functional/callback_forward.h"
#include "base/memory/memory_pressure_listener.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/strings/string_split.h"
#include "base/time/time.h"
#include "net/base/net_export.h"
#include "net/disk_cache/disk_cache.h"
#include "net/disk_cache/memory/mem_entry_impl.h"
namespace base {
class Clock;
}
namespace net {
class NetLog;
}
namespace disk_cache {
class NET_EXPORT_PRIVATE MemBackendImpl final
: public Backend,
public base::MemoryPressureListener {
public:
explicit MemBackendImpl(net::NetLog* net_log);
MemBackendImpl(const MemBackendImpl&) = delete;
MemBackendImpl& operator=(const MemBackendImpl&) = delete;
~MemBackendImpl() override;
static std::unique_ptr<MemBackendImpl> CreateBackend(int64_t max_bytes,
net::NetLog* net_log);
bool Init();
int64_t MaxFileSize() const override;
void OnEntryInserted(MemEntryImpl* entry);
void OnEntryUpdated(MemEntryImpl* entry);
void OnEntryDoomed(MemEntryImpl* entry);
void ModifyStorageSize(int32_t delta);
bool HasExceededStorageSize() const;
void SetPostCleanupCallback(base::OnceClosure cb);
static base::Time Now(const base::WeakPtr<MemBackendImpl>& self);
void SetClockForTesting(base::Clock* clock);
int32_t GetEntryCount(
net::Int32CompletionOnceCallback callback) const override;
EntryResult OpenOrCreateEntry(const std::string& key,
net::RequestPriority request_priority,
EntryResultCallback callback) override;
EntryResult OpenEntry(const std::string& key,
net::RequestPriority request_priority,
EntryResultCallback callback) override;
EntryResult CreateEntry(const std::string& key,
net::RequestPriority request_priority,
EntryResultCallback callback) override;
net::Error DoomEntry(const std::string& key,
net::RequestPriority priority,
CompletionOnceCallback callback) override;
net::Error DoomAllEntries(CompletionOnceCallback callback) override;
net::Error DoomEntriesBetween(base::Time initial_time,
base::Time end_time,
CompletionOnceCallback callback) override;
net::Error DoomEntriesSince(base::Time initial_time,
CompletionOnceCallback callback) override;
int64_t CalculateSizeOfAllEntries(
Int64CompletionOnceCallback callback) override;
int64_t CalculateSizeOfEntriesBetween(
base::Time initial_time,
base::Time end_time,
Int64CompletionOnceCallback callback) override;
std::unique_ptr<Iterator> CreateIterator() override;
void GetStats(base::StringPairs* stats) override {}
void OnExternalCacheHit(const std::string& key) override;
private:
class MemIterator;
friend class MemIterator;
using EntryMap =
std::unordered_map<std::string, raw_ptr<MemEntryImpl, CtnExperimental>>;
bool SetMaxSize(int64_t max_bytes);
void EvictIfNeeded();
void EvictTill(int target_size);
void OnMemoryPressure(
base::MemoryPressureLevel memory_pressure_level) override;
raw_ptr<base::Clock> custom_clock_for_testing_ = nullptr;
EntryMap entries_;
base::LinkedList<MemEntryImpl> lru_list_;
int32_t max_size_ = 0;
int32_t current_size_ = 0;
raw_ptr<net::NetLog> net_log_;
base::OnceClosure post_cleanup_callback_;
base::AsyncMemoryPressureListenerRegistration
memory_pressure_listener_registration_;
base::WeakPtrFactory<MemBackendImpl> weak_factory_{this};
};
}
#endif