blob: d67533e2e624d23f06c4c088c10fe16627da0042 [file] [log] [blame]
// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "gpu/command_buffer/service/memory_tracking.h"
#include "base/task/sequenced_task_runner.h"
namespace gpu {
// This can be created on the render thread on Andorid Webview which is managed
// by the OS and doesn't have a task runner associated with it in which case
// base::SequencedTaskRunner::GetCurrentDefault() will trigger a DCHECK.
MemoryTypeTracker::MemoryTypeTracker(MemoryTracker* memory_tracker)
: MemoryTypeTracker(memory_tracker,
base::SequencedTaskRunner::HasCurrentDefault()
? base::SequencedTaskRunner::GetCurrentDefault()
: nullptr) {}
MemoryTypeTracker::MemoryTypeTracker(
MemoryTracker* memory_tracker,
scoped_refptr<base::SequencedTaskRunner> task_runner)
: memory_tracker_(memory_tracker),
task_runner_(std::move(task_runner)),
weak_ptr_factory_(this) {}
MemoryTypeTracker::~MemoryTypeTracker() {
DCHECK_EQ(mem_represented_, 0u);
}
void MemoryTypeTracker::TrackMemAlloc(size_t bytes) {
{
base::AutoLock auto_lock(lock_);
DCHECK(bytes >= 0);
mem_represented_ += bytes;
}
// Notify memory tracker outside the lock to prevent reentrancy deadlock.
if (memory_tracker_ && bytes)
TrackMemoryAllocatedChange(bytes);
}
void MemoryTypeTracker::TrackMemFree(size_t bytes) {
{
base::AutoLock auto_lock(lock_);
DCHECK(bytes >= 0 && bytes <= mem_represented_);
mem_represented_ -= bytes;
}
// Notify memory tracker outside the lock to prevent reentrancy deadlock.
if (memory_tracker_ && bytes)
TrackMemoryAllocatedChange(-static_cast<int64_t>(bytes));
}
size_t MemoryTypeTracker::GetMemRepresented() const {
base::AutoLock auto_lock(lock_);
return mem_represented_;
}
void MemoryTypeTracker::TrackMemoryAllocatedChange(int64_t delta) {
DCHECK(memory_tracker_);
if (task_runner_ && !task_runner_->RunsTasksInCurrentSequence()) {
task_runner_->PostTask(
FROM_HERE,
base::BindOnce(&MemoryTypeTracker::TrackMemoryAllocatedChange,
weak_ptr_factory_.GetWeakPtr(), delta));
} else {
memory_tracker_->TrackMemoryAllocatedChange(delta);
}
}
} // namespace gpu