Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(610)

Unified Diff: base/debug/scoped_thread_heap_usage_unittest.cc

Issue 2386123003: Add heap allocator usage to task profiler. (Closed)
Patch Set: Figure out where the @#$%! corruption is coming from. Move heap tracking to TaskStopwatch." Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: base/debug/scoped_thread_heap_usage_unittest.cc
diff --git a/base/debug/scoped_thread_heap_usage_unittest.cc b/base/debug/scoped_thread_heap_usage_unittest.cc
index da66a32b6306887c7f49b7e4afd93e3695b0ac69..417f1548a643e72aa49bf1ce17f457910cd307a5 100644
--- a/base/debug/scoped_thread_heap_usage_unittest.cc
+++ b/base/debug/scoped_thread_heap_usage_unittest.cc
@@ -15,16 +15,17 @@ namespace debug {
namespace {
-class TestingScopedThreadHeapUsage : public ScopedThreadHeapUsage {
+class TestingHeapUsageTracker : public HeapUsageTracker {
public:
- using ScopedThreadHeapUsage::DisableHeapTrackingForTesting;
- using ScopedThreadHeapUsage::GetDispatchForTesting;
+ using HeapUsageTracker::DisableHeapTrackingForTesting;
+ using HeapUsageTracker::GetDispatchForTesting;
+ using HeapUsageTracker::EnsureTLSInitializedForTesting;
};
// A fixture class that allows testing the AllocatorDispatch associated with
-// the ScopedThreadHeapUsage class in isolation against a mocked underlying
+// the HeapUsageTracker class in isolation against a mocked underlying
// heap implementation.
-class ScopedThreadHeapUsageTest : public testing::Test {
+class HeapUsageTrackerTest : public testing::Test {
public:
using AllocatorDispatch = base::allocator::AllocatorDispatch;
@@ -35,12 +36,12 @@ class ScopedThreadHeapUsageTest : public testing::Test {
ZERO_SIZE_FUNCTION,
};
- ScopedThreadHeapUsageTest() : size_function_kind_(EXACT_SIZE_FUNCTION) {
+ HeapUsageTrackerTest() : size_function_kind_(EXACT_SIZE_FUNCTION) {
EXPECT_EQ(nullptr, g_self);
g_self = this;
}
- ~ScopedThreadHeapUsageTest() override {
+ ~HeapUsageTrackerTest() override {
EXPECT_EQ(this, g_self);
g_self = nullptr;
}
@@ -50,10 +51,9 @@ class ScopedThreadHeapUsageTest : public testing::Test {
}
void SetUp() override {
- ScopedThreadHeapUsage::Initialize();
+ TestingHeapUsageTracker::EnsureTLSInitializedForTesting();
- dispatch_under_test_ =
- TestingScopedThreadHeapUsage::GetDispatchForTesting();
+ dispatch_under_test_ = TestingHeapUsageTracker::GetDispatchForTesting();
ASSERT_EQ(nullptr, dispatch_under_test_->next);
dispatch_under_test_->next = &g_mock_dispatch;
@@ -186,35 +186,33 @@ class ScopedThreadHeapUsageTest : public testing::Test {
AllocatorDispatch* dispatch_under_test_;
static base::allocator::AllocatorDispatch g_mock_dispatch;
- static ScopedThreadHeapUsageTest* g_self;
+ static HeapUsageTrackerTest* g_self;
};
-const size_t ScopedThreadHeapUsageTest::kAllocationPadding = 23;
-
-ScopedThreadHeapUsageTest* ScopedThreadHeapUsageTest::g_self = nullptr;
-
-base::allocator::AllocatorDispatch ScopedThreadHeapUsageTest::g_mock_dispatch =
- {
- &ScopedThreadHeapUsageTest::OnAllocFn, // alloc_function
- &ScopedThreadHeapUsageTest::
- OnAllocZeroInitializedFn, // alloc_zero_initialized_function
- &ScopedThreadHeapUsageTest::OnAllocAlignedFn, // alloc_aligned_function
- &ScopedThreadHeapUsageTest::OnReallocFn, // realloc_function
- &ScopedThreadHeapUsageTest::OnFreeFn, // free_function
- &ScopedThreadHeapUsageTest::
- OnGetSizeEstimateFn, // get_size_estimate_function
- nullptr, // next
+const size_t HeapUsageTrackerTest::kAllocationPadding = 23;
+
+HeapUsageTrackerTest* HeapUsageTrackerTest::g_self = nullptr;
+
+base::allocator::AllocatorDispatch HeapUsageTrackerTest::g_mock_dispatch = {
+ &HeapUsageTrackerTest::OnAllocFn, // alloc_function
+ &HeapUsageTrackerTest::
+ OnAllocZeroInitializedFn, // alloc_zero_initialized_function
+ &HeapUsageTrackerTest::OnAllocAlignedFn, // alloc_aligned_function
+ &HeapUsageTrackerTest::OnReallocFn, // realloc_function
+ &HeapUsageTrackerTest::OnFreeFn, // free_function
+ &HeapUsageTrackerTest::OnGetSizeEstimateFn, // get_size_estimate_function
+ nullptr, // next
};
} // namespace
-TEST_F(ScopedThreadHeapUsageTest, SimpleUsageWithExactSizeFunction) {
+TEST_F(HeapUsageTrackerTest, SimpleUsageWithExactSizeFunction) {
set_size_function_kind(EXACT_SIZE_FUNCTION);
- ScopedThreadHeapUsage scoped_usage;
+ HeapUsageTracker usage_tracker;
+ usage_tracker.Start();
- ScopedThreadHeapUsage::ThreadAllocatorUsage u1 =
- ScopedThreadHeapUsage::CurrentUsage();
+ ThreadAllocatorUsage u1 = HeapUsageTracker::CurrentUsage();
EXPECT_EQ(0U, u1.alloc_ops);
EXPECT_EQ(0U, u1.alloc_bytes);
@@ -227,8 +225,8 @@ TEST_F(ScopedThreadHeapUsageTest, SimpleUsageWithExactSizeFunction) {
void* ptr = MockMalloc(kAllocSize);
MockFree(ptr);
- ScopedThreadHeapUsage::ThreadAllocatorUsage u2 =
- ScopedThreadHeapUsage::CurrentUsage();
+ usage_tracker.Stop(false);
+ ThreadAllocatorUsage u2 = usage_tracker.usage();
EXPECT_EQ(1U, u2.alloc_ops);
EXPECT_EQ(kAllocSize, u2.alloc_bytes);
@@ -238,13 +236,13 @@ TEST_F(ScopedThreadHeapUsageTest, SimpleUsageWithExactSizeFunction) {
EXPECT_EQ(kAllocSize, u2.max_allocated_bytes);
}
-TEST_F(ScopedThreadHeapUsageTest, SimpleUsageWithPaddingSizeFunction) {
+TEST_F(HeapUsageTrackerTest, SimpleUsageWithPaddingSizeFunction) {
set_size_function_kind(PADDING_SIZE_FUNCTION);
- ScopedThreadHeapUsage scoped_usage;
+ HeapUsageTracker usage_tracker;
+ usage_tracker.Start();
- ScopedThreadHeapUsage::ThreadAllocatorUsage u1 =
- ScopedThreadHeapUsage::CurrentUsage();
+ ThreadAllocatorUsage u1 = HeapUsageTracker::CurrentUsage();
EXPECT_EQ(0U, u1.alloc_ops);
EXPECT_EQ(0U, u1.alloc_bytes);
@@ -257,8 +255,8 @@ TEST_F(ScopedThreadHeapUsageTest, SimpleUsageWithPaddingSizeFunction) {
void* ptr = MockMalloc(kAllocSize);
MockFree(ptr);
- ScopedThreadHeapUsage::ThreadAllocatorUsage u2 =
- ScopedThreadHeapUsage::CurrentUsage();
+ usage_tracker.Stop(false);
+ ThreadAllocatorUsage u2 = usage_tracker.usage();
EXPECT_EQ(1U, u2.alloc_ops);
EXPECT_EQ(kAllocSize + kAllocationPadding, u2.alloc_bytes);
@@ -268,13 +266,13 @@ TEST_F(ScopedThreadHeapUsageTest, SimpleUsageWithPaddingSizeFunction) {
EXPECT_EQ(kAllocSize + kAllocationPadding, u2.max_allocated_bytes);
}
-TEST_F(ScopedThreadHeapUsageTest, SimpleUsageWithZeroSizeFunction) {
+TEST_F(HeapUsageTrackerTest, SimpleUsageWithZeroSizeFunction) {
set_size_function_kind(ZERO_SIZE_FUNCTION);
- ScopedThreadHeapUsage scoped_usage;
+ HeapUsageTracker usage_tracker;
+ usage_tracker.Start();
- ScopedThreadHeapUsage::ThreadAllocatorUsage u1 =
- ScopedThreadHeapUsage::CurrentUsage();
+ ThreadAllocatorUsage u1 = HeapUsageTracker::CurrentUsage();
EXPECT_EQ(0U, u1.alloc_ops);
EXPECT_EQ(0U, u1.alloc_bytes);
EXPECT_EQ(0U, u1.alloc_overhead_bytes);
@@ -286,8 +284,8 @@ TEST_F(ScopedThreadHeapUsageTest, SimpleUsageWithZeroSizeFunction) {
void* ptr = MockMalloc(kAllocSize);
MockFree(ptr);
- ScopedThreadHeapUsage::ThreadAllocatorUsage u2 =
- ScopedThreadHeapUsage::CurrentUsage();
+ usage_tracker.Stop(false);
+ ThreadAllocatorUsage u2 = usage_tracker.usage();
// With a get-size function that returns zero, there's no way to get the size
// of an allocation that's being freed, hence the shim can't tally freed bytes
@@ -300,16 +298,16 @@ TEST_F(ScopedThreadHeapUsageTest, SimpleUsageWithZeroSizeFunction) {
EXPECT_EQ(0U, u2.max_allocated_bytes);
}
-TEST_F(ScopedThreadHeapUsageTest, ReallocCorrectlyTallied) {
+TEST_F(HeapUsageTrackerTest, ReallocCorrectlyTallied) {
const size_t kAllocSize = 237U;
{
- ScopedThreadHeapUsage scoped_usage;
+ HeapUsageTracker usage_tracker;
+ usage_tracker.Start();
// Reallocating nullptr should count as a single alloc.
void* ptr = MockRealloc(nullptr, kAllocSize);
- ScopedThreadHeapUsage::ThreadAllocatorUsage usage =
- ScopedThreadHeapUsage::CurrentUsage();
+ ThreadAllocatorUsage usage = HeapUsageTracker::CurrentUsage();
EXPECT_EQ(1U, usage.alloc_ops);
EXPECT_EQ(kAllocSize, usage.alloc_bytes);
EXPECT_EQ(0U, usage.alloc_overhead_bytes);
@@ -321,7 +319,7 @@ TEST_F(ScopedThreadHeapUsageTest, ReallocCorrectlyTallied) {
// free.
ptr = MockRealloc(ptr, 0U);
- usage = ScopedThreadHeapUsage::CurrentUsage();
+ usage = HeapUsageTracker::CurrentUsage();
EXPECT_EQ(1U, usage.alloc_ops);
EXPECT_EQ(kAllocSize, usage.alloc_bytes);
EXPECT_EQ(0U, usage.alloc_overhead_bytes);
@@ -333,14 +331,16 @@ TEST_F(ScopedThreadHeapUsageTest, ReallocCorrectlyTallied) {
// free the zero-size alloc in the latter case.
if (ptr != nullptr)
MockFree(ptr);
+
+ usage_tracker.Stop(false);
}
{
- ScopedThreadHeapUsage scoped_usage;
+ HeapUsageTracker usage_tracker;
+ usage_tracker.Start();
void* ptr = MockMalloc(kAllocSize);
- ScopedThreadHeapUsage::ThreadAllocatorUsage usage =
- ScopedThreadHeapUsage::CurrentUsage();
+ ThreadAllocatorUsage usage = HeapUsageTracker::CurrentUsage();
EXPECT_EQ(1U, usage.alloc_ops);
// Now try reallocating a valid pointer to a larger size, this should count
@@ -348,7 +348,7 @@ TEST_F(ScopedThreadHeapUsageTest, ReallocCorrectlyTallied) {
const size_t kLargerAllocSize = kAllocSize + 928U;
ptr = MockRealloc(ptr, kLargerAllocSize);
- usage = ScopedThreadHeapUsage::CurrentUsage();
+ usage = HeapUsageTracker::CurrentUsage();
EXPECT_EQ(2U, usage.alloc_ops);
EXPECT_EQ(kAllocSize + kLargerAllocSize, usage.alloc_bytes);
EXPECT_EQ(0U, usage.alloc_overhead_bytes);
@@ -357,73 +357,98 @@ TEST_F(ScopedThreadHeapUsageTest, ReallocCorrectlyTallied) {
EXPECT_EQ(kLargerAllocSize, usage.max_allocated_bytes);
MockFree(ptr);
+
+ usage_tracker.Stop(false);
}
}
-TEST_F(ScopedThreadHeapUsageTest, NestedMaxWorks) {
- ScopedThreadHeapUsage outer_scoped_usage;
+TEST_F(HeapUsageTrackerTest, NestedMaxWorks) {
+ HeapUsageTracker usage_tracker;
+ usage_tracker.Start();
const size_t kOuterAllocSize = 1029U;
void* ptr = MockMalloc(kOuterAllocSize);
MockFree(ptr);
EXPECT_EQ(kOuterAllocSize,
- ScopedThreadHeapUsage::CurrentUsage().max_allocated_bytes);
+ HeapUsageTracker::CurrentUsage().max_allocated_bytes);
{
- ScopedThreadHeapUsage inner_scoped_usage;
+ HeapUsageTracker inner_usage_tracker;
+ inner_usage_tracker.Start();
const size_t kInnerAllocSize = 673U;
ptr = MockMalloc(kInnerAllocSize);
MockFree(ptr);
- EXPECT_EQ(kInnerAllocSize,
- ScopedThreadHeapUsage::CurrentUsage().max_allocated_bytes);
+ inner_usage_tracker.Stop(false);
+
+ EXPECT_EQ(kInnerAllocSize, inner_usage_tracker.usage().max_allocated_bytes);
}
// The greater, outer allocation size should have been restored.
EXPECT_EQ(kOuterAllocSize,
- ScopedThreadHeapUsage::CurrentUsage().max_allocated_bytes);
+ HeapUsageTracker::CurrentUsage().max_allocated_bytes);
const size_t kLargerInnerAllocSize = kOuterAllocSize + 673U;
{
- ScopedThreadHeapUsage inner_scoped_usage;
+ HeapUsageTracker inner_usage_tracker;
+ inner_usage_tracker.Start();
ptr = MockMalloc(kLargerInnerAllocSize);
MockFree(ptr);
+ inner_usage_tracker.Stop(false);
EXPECT_EQ(kLargerInnerAllocSize,
- ScopedThreadHeapUsage::CurrentUsage().max_allocated_bytes);
+ inner_usage_tracker.usage().max_allocated_bytes);
}
// The greater, inner allocation size should have been preserved.
EXPECT_EQ(kLargerInnerAllocSize,
- ScopedThreadHeapUsage::CurrentUsage().max_allocated_bytes);
+ HeapUsageTracker::CurrentUsage().max_allocated_bytes);
// Now try the case with an outstanding net alloc size when entering the
// inner scope.
void* outer_ptr = MockMalloc(kOuterAllocSize);
EXPECT_EQ(kLargerInnerAllocSize,
- ScopedThreadHeapUsage::CurrentUsage().max_allocated_bytes);
+ HeapUsageTracker::CurrentUsage().max_allocated_bytes);
{
- ScopedThreadHeapUsage inner_scoped_usage;
+ HeapUsageTracker inner_usage_tracker;
+ inner_usage_tracker.Start();
ptr = MockMalloc(kLargerInnerAllocSize);
MockFree(ptr);
+ inner_usage_tracker.Stop(false);
EXPECT_EQ(kLargerInnerAllocSize,
- ScopedThreadHeapUsage::CurrentUsage().max_allocated_bytes);
+ inner_usage_tracker.usage().max_allocated_bytes);
}
// While the inner scope saw only the inner net outstanding allocation size,
// the outer scope saw both outstanding at the same time.
EXPECT_EQ(kOuterAllocSize + kLargerInnerAllocSize,
- ScopedThreadHeapUsage::CurrentUsage().max_allocated_bytes);
+ HeapUsageTracker::CurrentUsage().max_allocated_bytes);
MockFree(outer_ptr);
+
+ // Test a net-negative scope.
+ ptr = MockMalloc(kLargerInnerAllocSize);
+ {
+ HeapUsageTracker inner_usage_tracker;
+ inner_usage_tracker.Start();
+
+ MockFree(ptr);
+
+ const size_t kInnerAllocSize = 1;
+ ptr = MockMalloc(kInnerAllocSize);
+
+ inner_usage_tracker.Stop(false);
+ // Since the scope is still net-negative, the max is clamped at zero.
+ EXPECT_EQ(0, inner_usage_tracker.usage().max_allocated_bytes);
+ }
}
-TEST_F(ScopedThreadHeapUsageTest, AllShimFunctionsAreProvided) {
+TEST_F(HeapUsageTrackerTest, AllShimFunctionsAreProvided) {
const size_t kAllocSize = 100;
void* alloc = MockMalloc(kAllocSize);
size_t estimate = MockGetSizeEstimate(alloc);
@@ -447,25 +472,28 @@ TEST_F(ScopedThreadHeapUsageTest, AllShimFunctionsAreProvided) {
#if BUILDFLAG(USE_EXPERIMENTAL_ALLOCATOR_SHIM)
TEST(ScopedThreadHeapShimTest, HooksIntoMallocWhenShimAvailable) {
- ScopedThreadHeapUsage::Initialize();
- ScopedThreadHeapUsage::EnableHeapTracking();
+ ASSERT_FALSE(HeapUsageTracker::IsHeapTrackingEnabled());
+
+ HeapUsageTracker::EnableHeapTracking();
+
+ ASSERT_TRUE(HeapUsageTracker::IsHeapTrackingEnabled());
const size_t kAllocSize = 9993;
// This test verifies that the scoped heap data is affected by malloc &
// free only when the shim is available.
- ScopedThreadHeapUsage scoped_usage;
+ HeapUsageTracker usage_tracker;
+ usage_tracker.Start();
- ScopedThreadHeapUsage::ThreadAllocatorUsage u1 =
- ScopedThreadHeapUsage::CurrentUsage();
+ ThreadAllocatorUsage u1 = HeapUsageTracker::CurrentUsage();
void* ptr = malloc(kAllocSize);
// Prevent the compiler from optimizing out the malloc/free pair.
ASSERT_NE(nullptr, ptr);
- ScopedThreadHeapUsage::ThreadAllocatorUsage u2 =
- ScopedThreadHeapUsage::CurrentUsage();
+ ThreadAllocatorUsage u2 = HeapUsageTracker::CurrentUsage();
free(ptr);
- ScopedThreadHeapUsage::ThreadAllocatorUsage u3 =
- ScopedThreadHeapUsage::CurrentUsage();
+
+ usage_tracker.Stop(false);
+ ThreadAllocatorUsage u3 = usage_tracker.usage();
// Verify that at least one allocation operation was recorded, and that free
// operations are at least monotonically growing.
@@ -479,7 +507,9 @@ TEST(ScopedThreadHeapShimTest, HooksIntoMallocWhenShimAvailable) {
// Verify that at least the one free operation above was recorded.
EXPECT_LE(u2.free_ops + 1, u3.free_ops);
- TestingScopedThreadHeapUsage::DisableHeapTrackingForTesting();
+ TestingHeapUsageTracker::DisableHeapTrackingForTesting();
+
+ ASSERT_FALSE(HeapUsageTracker::IsHeapTrackingEnabled());
}
#endif // BUILDFLAG(USE_EXPERIMENTAL_ALLOCATOR_SHIM)

Powered by Google App Engine
This is Rietveld 408576698