[zone] Fix peak memory accounting
When switching from atomicops to std::atomic, I introduced a bug that makes us miss the actual peak memory consumption, and only report the second-highest memory usage in each zone. This CL fixes that. R=petermarshall@chromium.org Bug: chromium:939724 Change-Id: I3db8eeb9719eb026cf6b4a9690c702cbc4c11bd9 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/1541227 Reviewed-by: Peter Marshall <petermarshall@chromium.org> Commit-Queue: Clemens Hammacher <clemensh@chromium.org> Cr-Commit-Position: refs/heads/master@{#60505}
This commit is contained in:
parent
5376383cd7
commit
45689a1ca1
@ -18,7 +18,7 @@ Segment* AccountingAllocator::AllocateSegment(size_t bytes) {
|
||||
if (memory == nullptr) return nullptr;
|
||||
|
||||
size_t current =
|
||||
current_memory_usage_.fetch_add(bytes, std::memory_order_relaxed);
|
||||
current_memory_usage_.fetch_add(bytes, std::memory_order_relaxed) + bytes;
|
||||
size_t max = max_memory_usage_.load(std::memory_order_relaxed);
|
||||
while (current > max && !max_memory_usage_.compare_exchange_weak(
|
||||
max, current, std::memory_order_relaxed)) {
|
||||
|
@ -105,6 +105,34 @@ TEST(AccountingAllocatorOOM) {
|
||||
CHECK_EQ(result == nullptr, platform.oom_callback_called);
|
||||
}
|
||||
|
||||
TEST(AccountingAllocatorCurrentAndMax) {
|
||||
AllocationPlatform platform;
|
||||
v8::internal::AccountingAllocator allocator;
|
||||
static constexpr size_t kAllocationSizes[] = {51, 231, 27};
|
||||
std::vector<v8::internal::Segment*> segments;
|
||||
CHECK_EQ(0, allocator.GetCurrentMemoryUsage());
|
||||
CHECK_EQ(0, allocator.GetMaxMemoryUsage());
|
||||
size_t expected_current = 0;
|
||||
size_t expected_max = 0;
|
||||
for (size_t size : kAllocationSizes) {
|
||||
segments.push_back(allocator.AllocateSegment(size));
|
||||
CHECK_NOT_NULL(segments.back());
|
||||
CHECK_EQ(size, segments.back()->total_size());
|
||||
expected_current += size;
|
||||
if (expected_current > expected_max) expected_max = expected_current;
|
||||
CHECK_EQ(expected_current, allocator.GetCurrentMemoryUsage());
|
||||
CHECK_EQ(expected_max, allocator.GetMaxMemoryUsage());
|
||||
}
|
||||
for (auto* segment : segments) {
|
||||
expected_current -= segment->total_size();
|
||||
allocator.ReturnSegment(segment);
|
||||
CHECK_EQ(expected_current, allocator.GetCurrentMemoryUsage());
|
||||
}
|
||||
CHECK_EQ(expected_max, allocator.GetMaxMemoryUsage());
|
||||
CHECK_EQ(0, allocator.GetCurrentMemoryUsage());
|
||||
CHECK(!platform.oom_callback_called);
|
||||
}
|
||||
|
||||
TEST(MallocedOperatorNewOOM) {
|
||||
AllocationPlatform platform;
|
||||
CHECK(!platform.oom_callback_called);
|
||||
|
Loading…
Reference in New Issue
Block a user