#include "components/discardable_memory/client/client_discardable_shared_memory_manager.h"
#include <algorithm>
#include <utility>
#include "base/atomic_sequence_num.h"
#include "base/format_macros.h"
#include "base/functional/bind.h"
#include "base/memory/discardable_memory.h"
#include "base/memory/discardable_shared_memory.h"
#include "base/memory/page_size.h"
#include "base/metrics/histogram_functions.h"
#include "base/metrics/histogram_macros.h"
#include "base/process/memory.h"
#include "base/strings/string_number_conversions.h"
#include "base/synchronization/waitable_event.h"
#include "base/system/sys_info.h"
#include "base/task/single_thread_task_runner.h"
#include "base/threading/thread_restrictions.h"
#include "base/time/time.h"
#include "base/trace_event/memory_dump_manager.h"
#include "base/trace_event/trace_event.h"
#include "build/build_config.h"
#include "components/crash/core/common/crash_key.h"
namespace discardable_memory {
namespace {
base::AtomicSequenceNumber g_next_discardable_shared_memory_id;
size_t GetDefaultAllocationSize() { … }
void InitManagerMojoOnIO(
mojo::Remote<mojom::DiscardableSharedMemoryManager>* manager_mojo,
mojo::PendingRemote<mojom::DiscardableSharedMemoryManager> remote) { … }
void DeletedDiscardableSharedMemoryOnIO(
mojo::Remote<mojom::DiscardableSharedMemoryManager>* manager_mojo,
int32_t id) { … }
}
constexpr base::TimeDelta
ClientDiscardableSharedMemoryManager::kMinAgeForScheduledPurge;
constexpr base::TimeDelta
ClientDiscardableSharedMemoryManager::kScheduledPurgeInterval;
ClientDiscardableSharedMemoryManager::DiscardableMemoryImpl::
DiscardableMemoryImpl(
ClientDiscardableSharedMemoryManager* manager,
std::unique_ptr<DiscardableSharedMemoryHeap::Span> span)
: … { … }
ClientDiscardableSharedMemoryManager::DiscardableMemoryImpl::
~DiscardableMemoryImpl() { … }
bool ClientDiscardableSharedMemoryManager::DiscardableMemoryImpl::Lock() { … }
void ClientDiscardableSharedMemoryManager::DiscardableMemoryImpl::Unlock() { … }
std::unique_ptr<DiscardableSharedMemoryHeap::Span>
ClientDiscardableSharedMemoryManager::DiscardableMemoryImpl::Purge(
base::TimeTicks min_ticks) { … }
void* ClientDiscardableSharedMemoryManager::DiscardableMemoryImpl::data()
const { … }
bool ClientDiscardableSharedMemoryManager::DiscardableMemoryImpl::is_locked()
const { … }
void ClientDiscardableSharedMemoryManager::DiscardableMemoryImpl::
DiscardForTesting() { … }
base::trace_event::MemoryAllocatorDump* ClientDiscardableSharedMemoryManager::
DiscardableMemoryImpl::CreateMemoryAllocatorDump(
const char* name,
base::trace_event::ProcessMemoryDump* pmd) const { … }
ClientDiscardableSharedMemoryManager::ClientDiscardableSharedMemoryManager(
mojo::PendingRemote<mojom::DiscardableSharedMemoryManager> manager,
scoped_refptr<base::SingleThreadTaskRunner> io_task_runner)
: … { … }
ClientDiscardableSharedMemoryManager::ClientDiscardableSharedMemoryManager(
scoped_refptr<base::SingleThreadTaskRunner> io_task_runner)
: … { … }
ClientDiscardableSharedMemoryManager::~ClientDiscardableSharedMemoryManager() { … }
void ClientDiscardableSharedMemoryManager::OnForegrounded() { … }
void ClientDiscardableSharedMemoryManager::OnBackgrounded() { … }
std::unique_ptr<base::DiscardableMemory>
ClientDiscardableSharedMemoryManager::AllocateLockedDiscardableMemory(
size_t size) { … }
bool ClientDiscardableSharedMemoryManager::OnMemoryDump(
const base::trace_event::MemoryDumpArgs& args,
base::trace_event::ProcessMemoryDump* pmd) { … }
size_t ClientDiscardableSharedMemoryManager::GetBytesAllocated() const { … }
size_t ClientDiscardableSharedMemoryManager::GetBytesAllocatedLocked() const { … }
void ClientDiscardableSharedMemoryManager::BackgroundPurge() { … }
void ClientDiscardableSharedMemoryManager::ScheduledPurge(
base::MemoryReductionTaskContext task_type) { … }
void ClientDiscardableSharedMemoryManager::PurgeUnlockedMemory(
base::TimeDelta min_age) { … }
void ClientDiscardableSharedMemoryManager::ReleaseFreeMemory() { … }
bool ClientDiscardableSharedMemoryManager::LockSpan(
DiscardableSharedMemoryHeap::Span* span) { … }
void ClientDiscardableSharedMemoryManager::UnlockSpan(
DiscardableSharedMemoryHeap::Span* span) { … }
void ClientDiscardableSharedMemoryManager::UnlockAndReleaseMemory(
DiscardableMemoryImpl* memory,
std::unique_ptr<DiscardableSharedMemoryHeap::Span> span) { … }
void ClientDiscardableSharedMemoryManager::ReleaseSpan(
std::unique_ptr<DiscardableSharedMemoryHeap::Span> span) { … }
base::trace_event::MemoryAllocatorDump*
ClientDiscardableSharedMemoryManager::CreateMemoryAllocatorDump(
DiscardableSharedMemoryHeap::Span* span,
const char* name,
base::trace_event::ProcessMemoryDump* pmd) const { … }
std::unique_ptr<base::DiscardableSharedMemory>
ClientDiscardableSharedMemoryManager::AllocateLockedDiscardableSharedMemory(
size_t size,
int32_t id) { … }
void ClientDiscardableSharedMemoryManager::AllocateOnIO(
size_t size,
int32_t id,
base::UnsafeSharedMemoryRegion* region,
base::ScopedClosureRunner closure_runner) { … }
void ClientDiscardableSharedMemoryManager::AllocateCompletedOnIO(
base::UnsafeSharedMemoryRegion* region,
base::ScopedClosureRunner closure_runner,
base::UnsafeSharedMemoryRegion ret_region) { … }
void ClientDiscardableSharedMemoryManager::DeletedDiscardableSharedMemory(
int32_t id) { … }
void ClientDiscardableSharedMemoryManager::MemoryUsageChanged(
size_t new_bytes_total,
size_t new_bytes_free) const { … }
}