blob: e2da15ff0d27fb08207579e8ec8f9cb2b3b8aecd [file] [edit]
// Copyright 2026 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef NET_DISK_CACHE_SQL_SQL_WRITE_BUFFER_MEMORY_MONITOR_H_
#define NET_DISK_CACHE_SQL_SQL_WRITE_BUFFER_MEMORY_MONITOR_H_
#include <cstdint>
#include <optional>
#include "base/memory/weak_ptr.h"
#include "base/sequence_checker.h"
#include "base/types/pass_key.h"
#include "net/base/net_export.h"
namespace disk_cache {
// A helper class to monitor and limit the total memory usage of write buffers.
// This class is not thread-safe and must be accessed on the same sequence.
class NET_EXPORT_PRIVATE SqlWriteBufferMemoryMonitor {
public:
// A helper class that holds a reservation for a specific amount of memory
// from the monitor. When this object is destroyed, it automatically releases
// the reserved memory back to the monitor.
// This class is move-only to ensure clear ownership of the reservation.
class NET_EXPORT_PRIVATE ScopedReservation {
public:
ScopedReservation();
~ScopedReservation();
ScopedReservation(const ScopedReservation&) = delete;
ScopedReservation& operator=(const ScopedReservation&) = delete;
ScopedReservation(ScopedReservation&& other);
ScopedReservation& operator=(ScopedReservation&& other);
// Increases the size tracked by this reservation and the monitor.
void IncreaseSize(base::PassKey<SqlWriteBufferMemoryMonitor>,
base::WeakPtr<SqlWriteBufferMemoryMonitor> monitor,
int64_t size);
private:
base::WeakPtr<SqlWriteBufferMemoryMonitor> monitor_;
int64_t size_ = 0;
SEQUENCE_CHECKER(sequence_checker_);
};
explicit SqlWriteBufferMemoryMonitor(int64_t max_size);
~SqlWriteBufferMemoryMonitor();
SqlWriteBufferMemoryMonitor(const SqlWriteBufferMemoryMonitor&) = delete;
SqlWriteBufferMemoryMonitor& operator=(const SqlWriteBufferMemoryMonitor&) =
delete;
// Returns the current total size of allocated memory.
int64_t CurrentSize();
// Tries to allocate `size` bytes. Returns true if the allocation is
// successful (i.e., the total size does not exceed `max_size_`). If
// successful, `reservation` is updated to track the allocated memory.
bool Allocate(int size, ScopedReservation& reservation);
private:
friend class ScopedReservation;
void Release(int64_t size);
const int64_t max_size_;
int64_t current_size_ = 0;
SEQUENCE_CHECKER(sequence_checker_);
base::WeakPtrFactory<SqlWriteBufferMemoryMonitor> weak_factory_{this};
};
} // namespace disk_cache
#endif // NET_DISK_CACHE_SQL_SQL_WRITE_BUFFER_MEMORY_MONITOR_H_