#ifdef UNSAFE_BUFFERS_BUILD
#pragma allow_unsafe_buffers
#endif
#include "net/disk_cache/simple/simple_entry_impl.h"
#include <algorithm>
#include <cstring>
#include <limits>
#include <optional>
#include <utility>
#include <vector>
#include "base/check_op.h"
#include "base/functional/bind.h"
#include "base/functional/callback.h"
#include "base/functional/callback_helpers.h"
#include "base/location.h"
#include "base/memory/raw_ptr.h"
#include "base/notreached.h"
#include "base/task/sequenced_task_runner.h"
#include "base/task/task_runner.h"
#include "base/time/time.h"
#include "base/trace_event/memory_usage_estimator.h"
#include "net/base/io_buffer.h"
#include "net/base/net_errors.h"
#include "net/base/prioritized_task_runner.h"
#include "net/disk_cache/backend_cleanup_tracker.h"
#include "net/disk_cache/net_log_parameters.h"
#include "net/disk_cache/simple/simple_backend_impl.h"
#include "net/disk_cache/simple/simple_histogram_enums.h"
#include "net/disk_cache/simple/simple_histogram_macros.h"
#include "net/disk_cache/simple/simple_index.h"
#include "net/disk_cache/simple/simple_net_log_parameters.h"
#include "net/disk_cache/simple/simple_synchronous_entry.h"
#include "net/disk_cache/simple/simple_util.h"
#include "net/log/net_log.h"
#include "net/log/net_log_source_type.h"
#include "third_party/zlib/zlib.h"
namespace disk_cache {
namespace {
const int64_t kMaxSparseDataSizeDivisor = …;
OpenEntryIndexEnum ComputeIndexState(SimpleBackendImpl* backend,
uint64_t entry_hash) { … }
void RecordOpenEntryIndexState(net::CacheType cache_type,
OpenEntryIndexEnum state) { … }
void RecordHeaderSize(net::CacheType cache_type, int size) { … }
void InvokeCallbackIfBackendIsAlive(
const base::WeakPtr<SimpleBackendImpl>& backend,
net::CompletionOnceCallback completion_callback,
int result) { … }
void InvokeEntryResultCallbackIfBackendIsAlive(
const base::WeakPtr<SimpleBackendImpl>& backend,
EntryResultCallback completion_callback,
EntryResult result) { … }
int PostToCallbackIfNeeded(bool sync_possible,
net::CompletionOnceCallback callback,
int rv) { … }
}
OnceClosure;
FilePath;
Time;
TaskRunner;
class SimpleEntryImpl::ScopedOperationRunner { … };
SimpleEntryImpl::ActiveEntryProxy::~ActiveEntryProxy() = default;
SimpleEntryImpl::SimpleEntryImpl(
net::CacheType cache_type,
const FilePath& path,
scoped_refptr<BackendCleanupTracker> cleanup_tracker,
const uint64_t entry_hash,
OperationsMode operations_mode,
SimpleBackendImpl* backend,
SimpleFileTracker* file_tracker,
scoped_refptr<BackendFileOperationsFactory> file_operations_factory,
net::NetLog* net_log,
uint32_t entry_priority)
: … { … }
void SimpleEntryImpl::SetActiveEntryProxy(
std::unique_ptr<ActiveEntryProxy> active_entry_proxy) { … }
EntryResult SimpleEntryImpl::OpenEntry(EntryResultCallback callback) { … }
EntryResult SimpleEntryImpl::CreateEntry(EntryResultCallback callback) { … }
EntryResult SimpleEntryImpl::OpenOrCreateEntry(EntryResultCallback callback) { … }
net::Error SimpleEntryImpl::DoomEntry(net::CompletionOnceCallback callback) { … }
void SimpleEntryImpl::SetCreatePendingDoom() { … }
void SimpleEntryImpl::NotifyDoomBeforeCreateComplete() { … }
void SimpleEntryImpl::SetKey(const std::string& key) { … }
void SimpleEntryImpl::Doom() { … }
void SimpleEntryImpl::Close() { … }
std::string SimpleEntryImpl::GetKey() const { … }
Time SimpleEntryImpl::GetLastUsed() const { … }
Time SimpleEntryImpl::GetLastModified() const { … }
int32_t SimpleEntryImpl::GetDataSize(int stream_index) const { … }
int SimpleEntryImpl::ReadData(int stream_index,
int offset,
net::IOBuffer* buf,
int buf_len,
CompletionOnceCallback callback) { … }
int SimpleEntryImpl::WriteData(int stream_index,
int offset,
net::IOBuffer* buf,
int buf_len,
CompletionOnceCallback callback,
bool truncate) { … }
int SimpleEntryImpl::ReadSparseData(int64_t offset,
net::IOBuffer* buf,
int buf_len,
CompletionOnceCallback callback) { … }
int SimpleEntryImpl::WriteSparseData(int64_t offset,
net::IOBuffer* buf,
int buf_len,
CompletionOnceCallback callback) { … }
RangeResult SimpleEntryImpl::GetAvailableRange(int64_t offset,
int len,
RangeResultCallback callback) { … }
bool SimpleEntryImpl::CouldBeSparse() const { … }
void SimpleEntryImpl::CancelSparseIO() { … }
net::Error SimpleEntryImpl::ReadyForSparseIO(CompletionOnceCallback callback) { … }
void SimpleEntryImpl::SetLastUsedTimeForTest(base::Time time) { … }
void SimpleEntryImpl::SetPriority(uint32_t entry_priority) { … }
SimpleEntryImpl::~SimpleEntryImpl() { … }
void SimpleEntryImpl::PostClientCallback(net::CompletionOnceCallback callback,
int result) { … }
void SimpleEntryImpl::PostClientCallback(EntryResultCallback callback,
EntryResult result) { … }
void SimpleEntryImpl::ResetEntry() { … }
void SimpleEntryImpl::ReturnEntryToCaller() { … }
void SimpleEntryImpl::ReturnEntryToCallerAsync(bool is_open,
EntryResultCallback callback) { … }
void SimpleEntryImpl::FinishReturnEntryToCallerAsync(
bool is_open,
EntryResultCallback callback) { … }
void SimpleEntryImpl::MarkAsDoomed(DoomState new_state) { … }
void SimpleEntryImpl::RunNextOperationIfNeeded() { … }
void SimpleEntryImpl::OpenEntryInternal(
SimpleEntryOperation::EntryResultState result_state,
EntryResultCallback callback) { … }
void SimpleEntryImpl::CreateEntryInternal(
SimpleEntryOperation::EntryResultState result_state,
EntryResultCallback callback) { … }
void SimpleEntryImpl::OpenOrCreateEntryInternal(
OpenEntryIndexEnum index_state,
SimpleEntryOperation::EntryResultState result_state,
EntryResultCallback callback) { … }
void SimpleEntryImpl::CloseInternal() { … }
int SimpleEntryImpl::ReadDataInternal(bool sync_possible,
int stream_index,
int offset,
net::IOBuffer* buf,
int buf_len,
net::CompletionOnceCallback callback) { … }
void SimpleEntryImpl::WriteDataInternal(int stream_index,
int offset,
net::IOBuffer* buf,
int buf_len,
net::CompletionOnceCallback callback,
bool truncate) { … }
void SimpleEntryImpl::ReadSparseDataInternal(
int64_t sparse_offset,
net::IOBuffer* buf,
int buf_len,
net::CompletionOnceCallback callback) { … }
void SimpleEntryImpl::WriteSparseDataInternal(
int64_t sparse_offset,
net::IOBuffer* buf,
int buf_len,
net::CompletionOnceCallback callback) { … }
void SimpleEntryImpl::GetAvailableRangeInternal(int64_t sparse_offset,
int len,
RangeResultCallback callback) { … }
void SimpleEntryImpl::DoomEntryInternal(net::CompletionOnceCallback callback) { … }
void SimpleEntryImpl::CreationOperationComplete(
SimpleEntryOperation::EntryResultState result_state,
EntryResultCallback completion_callback,
const base::TimeTicks& start_time,
const base::Time index_last_used_time,
std::unique_ptr<SimpleEntryCreationResults> in_results,
net::NetLogEventType end_event_type) { … }
void SimpleEntryImpl::UpdateStateAfterOperationComplete(
const SimpleEntryStat& entry_stat,
int result) { … }
void SimpleEntryImpl::EntryOperationComplete(
net::CompletionOnceCallback completion_callback,
const SimpleEntryStat& entry_stat,
int result) { … }
void SimpleEntryImpl::ReadOperationComplete(
int stream_index,
int offset,
net::CompletionOnceCallback completion_callback,
std::unique_ptr<SimpleEntryStat> entry_stat,
std::unique_ptr<SimpleSynchronousEntry::ReadResult> read_result) { … }
void SimpleEntryImpl::WriteOperationComplete(
int stream_index,
net::CompletionOnceCallback completion_callback,
std::unique_ptr<SimpleEntryStat> entry_stat,
std::unique_ptr<SimpleSynchronousEntry::WriteResult> write_result,
net::IOBuffer* buf) { … }
void SimpleEntryImpl::ReadSparseOperationComplete(
net::CompletionOnceCallback completion_callback,
std::unique_ptr<base::Time> last_used,
std::unique_ptr<int> result) { … }
void SimpleEntryImpl::WriteSparseOperationComplete(
net::CompletionOnceCallback completion_callback,
std::unique_ptr<SimpleEntryStat> entry_stat,
std::unique_ptr<int> result) { … }
void SimpleEntryImpl::GetAvailableRangeOperationComplete(
RangeResultCallback completion_callback,
std::unique_ptr<RangeResult> result) { … }
void SimpleEntryImpl::DoomOperationComplete(
net::CompletionOnceCallback callback,
State state_to_restore,
int result) { … }
void SimpleEntryImpl::CloseOperationComplete(
std::unique_ptr<SimpleEntryCloseResults> in_results) { … }
void SimpleEntryImpl::UpdateDataFromEntryStat(
const SimpleEntryStat& entry_stat) { … }
int64_t SimpleEntryImpl::GetDiskUsage() const { … }
void SimpleEntryImpl::ReadFromBuffer(net::GrowableIOBuffer* in_buf,
int offset,
int buf_len,
net::IOBuffer* out_buf) { … }
void SimpleEntryImpl::SetStream0Data(net::IOBuffer* buf,
int offset,
int buf_len,
bool truncate) { … }
}