1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
|
// 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 "gpu/ipc/common/command_buffer_id.h"
namespace gpu {
MemoryTracker::MemoryTracker(
CommandBufferId command_buffer_id,
uint64_t client_tracing_id,
scoped_refptr<gpu::MemoryTracker::Observer> peak_memory_monitor,
GpuPeakMemoryAllocationSource source)
: command_buffer_id_(command_buffer_id),
client_tracing_id_(client_tracing_id),
peak_memory_monitor_(std::move(peak_memory_monitor)),
allocation_source_(source) {}
MemoryTracker::MemoryTracker()
: command_buffer_id_(0),
client_tracing_id_(0),
peak_memory_monitor_(nullptr),
allocation_source_(GpuPeakMemoryAllocationSource::UNKNOWN) {}
MemoryTracker::~MemoryTracker() {
DCHECK_EQ(mem_traker_size_, 0u);
}
void MemoryTracker::TrackMemoryAllocatedChange(int64_t delta) {
base::AutoLock auto_lock(memory_tracker_lock_);
DCHECK(delta >= 0 || mem_traker_size_ >= static_cast<uint64_t>(-delta));
uint64_t old_size = mem_traker_size_;
mem_traker_size_ += delta;
if (peak_memory_monitor_) {
peak_memory_monitor_->OnMemoryAllocatedChange(
command_buffer_id_, old_size, mem_traker_size_, allocation_source_);
}
}
uint64_t MemoryTracker::GetSize() const {
base::AutoLock auto_lock(memory_tracker_lock_);
return mem_traker_size_;
}
uint64_t MemoryTracker::ClientTracingId() const {
return client_tracing_id_;
}
int MemoryTracker::ClientId() const {
return ChannelIdFromCommandBufferId(command_buffer_id_);
}
uint64_t MemoryTracker::ContextGroupTracingId() const {
return command_buffer_id_.GetUnsafeValue();
}
//
// MemoryTypeTracker
//
MemoryTypeTracker::MemoryTypeTracker(
scoped_refptr<MemoryTracker> memory_tracker)
: memory_tracker_(std::move(memory_tracker)) {}
MemoryTypeTracker::~MemoryTypeTracker() {
DCHECK_EQ(mem_represented_, 0u);
}
void MemoryTypeTracker::TrackMemAlloc(size_t bytes) {
base::AutoLock auto_lock(lock_);
DCHECK(bytes >= 0);
mem_represented_ += bytes;
if (memory_tracker_ && bytes) {
memory_tracker_->TrackMemoryAllocatedChange(bytes);
}
}
void MemoryTypeTracker::TrackMemFree(size_t bytes) {
base::AutoLock auto_lock(lock_);
DCHECK(bytes >= 0 && bytes <= mem_represented_);
mem_represented_ -= bytes;
if (memory_tracker_ && bytes) {
memory_tracker_->TrackMemoryAllocatedChange(-static_cast<int64_t>(bytes));
}
}
size_t MemoryTypeTracker::GetMemRepresented() const {
base::AutoLock auto_lock(lock_);
return mem_represented_;
}
} // namespace gpu
|