Index: content/common/discardable_shared_memory_heap_unittest.cc |
diff --git a/content/common/discardable_shared_memory_heap_unittest.cc b/content/common/discardable_shared_memory_heap_unittest.cc |
deleted file mode 100644 |
index f391ff3d2ee05d0af0d6d1f5097f0f2aa2007a09..0000000000000000000000000000000000000000 |
--- a/content/common/discardable_shared_memory_heap_unittest.cc |
+++ /dev/null |
@@ -1,339 +0,0 @@ |
-// Copyright 2014 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "content/common/discardable_shared_memory_heap.h" |
- |
-#include <stddef.h> |
-#include <utility> |
- |
-#include "base/bind.h" |
-#include "base/memory/discardable_shared_memory.h" |
-#include "base/process/process_metrics.h" |
-#include "testing/gtest/include/gtest/gtest.h" |
- |
-namespace content { |
-namespace { |
- |
-void NullTask() { |
-} |
- |
-TEST(DiscardableSharedMemoryHeapTest, Basic) { |
- size_t block_size = base::GetPageSize(); |
- DiscardableSharedMemoryHeap heap(block_size); |
- |
- // Initial size should be 0. |
- EXPECT_EQ(0u, heap.GetSize()); |
- |
- // Initial size of free lists should be 0. |
- EXPECT_EQ(0u, heap.GetSizeOfFreeLists()); |
- |
- // Free lists are initially empty. |
- EXPECT_FALSE(heap.SearchFreeLists(1, 0)); |
- |
- const size_t kBlocks = 10; |
- size_t memory_size = block_size * kBlocks; |
- int next_discardable_shared_memory_id = 0; |
- |
- std::unique_ptr<base::DiscardableSharedMemory> memory( |
- new base::DiscardableSharedMemory); |
- ASSERT_TRUE(memory->CreateAndMap(memory_size)); |
- |
- // Create new span for memory. |
- std::unique_ptr<DiscardableSharedMemoryHeap::Span> new_span( |
- heap.Grow(std::move(memory), memory_size, |
- next_discardable_shared_memory_id++, base::Bind(NullTask))); |
- |
- // Size should match |memory_size|. |
- EXPECT_EQ(memory_size, heap.GetSize()); |
- |
- // Size of free lists should still be 0. |
- EXPECT_EQ(0u, heap.GetSizeOfFreeLists()); |
- |
- // Free list should still be empty as |new_span| is currently in use. |
- EXPECT_FALSE(heap.SearchFreeLists(1, 0)); |
- |
- // Done using |new_span|. Merge it into the free lists. |
- heap.MergeIntoFreeLists(std::move(new_span)); |
- |
- // Size of free lists should now match |memory_size|. |
- EXPECT_EQ(memory_size, heap.GetSizeOfFreeLists()); |
- |
- // Free lists should not contain a span that is larger than kBlocks. |
- EXPECT_FALSE(heap.SearchFreeLists(kBlocks + 1, 0)); |
- |
- // Free lists should contain a span that satisfies the request for kBlocks. |
- std::unique_ptr<DiscardableSharedMemoryHeap::Span> span = |
- heap.SearchFreeLists(kBlocks, 0); |
- ASSERT_TRUE(span); |
- |
- // Free lists should be empty again. |
- EXPECT_FALSE(heap.SearchFreeLists(1, 0)); |
- |
- // Merge it into the free lists again. |
- heap.MergeIntoFreeLists(std::move(span)); |
-} |
- |
-TEST(DiscardableSharedMemoryHeapTest, SplitAndMerge) { |
- size_t block_size = base::GetPageSize(); |
- DiscardableSharedMemoryHeap heap(block_size); |
- |
- const size_t kBlocks = 6; |
- size_t memory_size = block_size * kBlocks; |
- int next_discardable_shared_memory_id = 0; |
- |
- std::unique_ptr<base::DiscardableSharedMemory> memory( |
- new base::DiscardableSharedMemory); |
- ASSERT_TRUE(memory->CreateAndMap(memory_size)); |
- std::unique_ptr<DiscardableSharedMemoryHeap::Span> new_span( |
- heap.Grow(std::move(memory), memory_size, |
- next_discardable_shared_memory_id++, base::Bind(NullTask))); |
- |
- // Split span into two. |
- std::unique_ptr<DiscardableSharedMemoryHeap::Span> leftover = |
- heap.Split(new_span.get(), 3); |
- ASSERT_TRUE(leftover); |
- |
- // Merge |leftover| into free lists. |
- heap.MergeIntoFreeLists(std::move(leftover)); |
- |
- // Some of the memory is still in use. |
- EXPECT_FALSE(heap.SearchFreeLists(kBlocks, 0)); |
- |
- // Merge |span| into free lists. |
- heap.MergeIntoFreeLists(std::move(new_span)); |
- |
- // Remove a 2 page span from free lists. |
- std::unique_ptr<DiscardableSharedMemoryHeap::Span> span1 = |
- heap.SearchFreeLists(2, kBlocks); |
- ASSERT_TRUE(span1); |
- |
- // Remove another 2 page span from free lists. |
- std::unique_ptr<DiscardableSharedMemoryHeap::Span> span2 = |
- heap.SearchFreeLists(2, kBlocks); |
- ASSERT_TRUE(span2); |
- |
- // Merge |span1| back into free lists. |
- heap.MergeIntoFreeLists(std::move(span1)); |
- |
- // Some of the memory is still in use. |
- EXPECT_FALSE(heap.SearchFreeLists(kBlocks, 0)); |
- |
- // Merge |span2| back into free lists. |
- heap.MergeIntoFreeLists(std::move(span2)); |
- |
- // All memory has been returned to the free lists. |
- std::unique_ptr<DiscardableSharedMemoryHeap::Span> large_span = |
- heap.SearchFreeLists(kBlocks, 0); |
- ASSERT_TRUE(large_span); |
- |
- // Merge it into the free lists again. |
- heap.MergeIntoFreeLists(std::move(large_span)); |
-} |
- |
-TEST(DiscardableSharedMemoryHeapTest, MergeSingleBlockSpan) { |
- size_t block_size = base::GetPageSize(); |
- DiscardableSharedMemoryHeap heap(block_size); |
- |
- const size_t kBlocks = 6; |
- size_t memory_size = block_size * kBlocks; |
- int next_discardable_shared_memory_id = 0; |
- |
- std::unique_ptr<base::DiscardableSharedMemory> memory( |
- new base::DiscardableSharedMemory); |
- ASSERT_TRUE(memory->CreateAndMap(memory_size)); |
- std::unique_ptr<DiscardableSharedMemoryHeap::Span> new_span( |
- heap.Grow(std::move(memory), memory_size, |
- next_discardable_shared_memory_id++, base::Bind(NullTask))); |
- |
- // Split span into two. |
- std::unique_ptr<DiscardableSharedMemoryHeap::Span> leftover = |
- heap.Split(new_span.get(), 5); |
- ASSERT_TRUE(leftover); |
- |
- // Merge |new_span| into free lists. |
- heap.MergeIntoFreeLists(std::move(new_span)); |
- |
- // Merge |leftover| into free lists. |
- heap.MergeIntoFreeLists(std::move(leftover)); |
-} |
- |
-TEST(DiscardableSharedMemoryHeapTest, Grow) { |
- size_t block_size = base::GetPageSize(); |
- DiscardableSharedMemoryHeap heap(block_size); |
- int next_discardable_shared_memory_id = 0; |
- |
- std::unique_ptr<base::DiscardableSharedMemory> memory1( |
- new base::DiscardableSharedMemory); |
- ASSERT_TRUE(memory1->CreateAndMap(block_size)); |
- heap.MergeIntoFreeLists(heap.Grow(std::move(memory1), block_size, |
- next_discardable_shared_memory_id++, |
- base::Bind(NullTask))); |
- |
- // Remove a span from free lists. |
- std::unique_ptr<DiscardableSharedMemoryHeap::Span> span1 = |
- heap.SearchFreeLists(1, 0); |
- EXPECT_TRUE(span1); |
- |
- // No more memory available. |
- EXPECT_FALSE(heap.SearchFreeLists(1, 0)); |
- |
- // Grow free lists using new memory. |
- std::unique_ptr<base::DiscardableSharedMemory> memory2( |
- new base::DiscardableSharedMemory); |
- ASSERT_TRUE(memory2->CreateAndMap(block_size)); |
- heap.MergeIntoFreeLists(heap.Grow(std::move(memory2), block_size, |
- next_discardable_shared_memory_id++, |
- base::Bind(NullTask))); |
- |
- // Memory should now be available. |
- std::unique_ptr<DiscardableSharedMemoryHeap::Span> span2 = |
- heap.SearchFreeLists(1, 0); |
- EXPECT_TRUE(span2); |
- |
- // Merge spans into the free lists again. |
- heap.MergeIntoFreeLists(std::move(span1)); |
- heap.MergeIntoFreeLists(std::move(span2)); |
-} |
- |
-TEST(DiscardableSharedMemoryHeapTest, ReleaseFreeMemory) { |
- size_t block_size = base::GetPageSize(); |
- DiscardableSharedMemoryHeap heap(block_size); |
- int next_discardable_shared_memory_id = 0; |
- |
- std::unique_ptr<base::DiscardableSharedMemory> memory( |
- new base::DiscardableSharedMemory); |
- ASSERT_TRUE(memory->CreateAndMap(block_size)); |
- std::unique_ptr<DiscardableSharedMemoryHeap::Span> span = |
- heap.Grow(std::move(memory), block_size, |
- next_discardable_shared_memory_id++, base::Bind(NullTask)); |
- |
- // Free lists should be empty. |
- EXPECT_EQ(0u, heap.GetSizeOfFreeLists()); |
- |
- heap.ReleaseFreeMemory(); |
- |
- // Size should still match |block_size|. |
- EXPECT_EQ(block_size, heap.GetSize()); |
- |
- heap.MergeIntoFreeLists(std::move(span)); |
- heap.ReleaseFreeMemory(); |
- |
- // Memory should have been released. |
- EXPECT_EQ(0u, heap.GetSize()); |
- EXPECT_EQ(0u, heap.GetSizeOfFreeLists()); |
-} |
- |
-TEST(DiscardableSharedMemoryHeapTest, ReleasePurgedMemory) { |
- size_t block_size = base::GetPageSize(); |
- DiscardableSharedMemoryHeap heap(block_size); |
- int next_discardable_shared_memory_id = 0; |
- |
- std::unique_ptr<base::DiscardableSharedMemory> memory( |
- new base::DiscardableSharedMemory); |
- ASSERT_TRUE(memory->CreateAndMap(block_size)); |
- std::unique_ptr<DiscardableSharedMemoryHeap::Span> span = |
- heap.Grow(std::move(memory), block_size, |
- next_discardable_shared_memory_id++, base::Bind(NullTask)); |
- |
- // Unlock memory so it can be purged. |
- span->shared_memory()->Unlock(0, 0); |
- |
- // Purge and release shared memory. |
- bool rv = span->shared_memory()->Purge(base::Time::Now()); |
- EXPECT_TRUE(rv); |
- heap.ReleasePurgedMemory(); |
- |
- // Shared memory backing for |span| should be gone. |
- EXPECT_FALSE(span->shared_memory()); |
- |
- // Size should be 0. |
- EXPECT_EQ(0u, heap.GetSize()); |
-} |
- |
-TEST(DiscardableSharedMemoryHeapTest, Slack) { |
- size_t block_size = base::GetPageSize(); |
- DiscardableSharedMemoryHeap heap(block_size); |
- |
- const size_t kBlocks = 6; |
- size_t memory_size = block_size * kBlocks; |
- int next_discardable_shared_memory_id = 0; |
- |
- std::unique_ptr<base::DiscardableSharedMemory> memory( |
- new base::DiscardableSharedMemory); |
- ASSERT_TRUE(memory->CreateAndMap(memory_size)); |
- heap.MergeIntoFreeLists(heap.Grow(std::move(memory), memory_size, |
- next_discardable_shared_memory_id++, |
- base::Bind(NullTask))); |
- |
- // No free span that is less or equal to 3 + 1. |
- EXPECT_FALSE(heap.SearchFreeLists(3, 1)); |
- |
- // No free span that is less or equal to 3 + 2. |
- EXPECT_FALSE(heap.SearchFreeLists(3, 2)); |
- |
- // No free span that is less or equal to 1 + 4. |
- EXPECT_FALSE(heap.SearchFreeLists(1, 4)); |
- |
- std::unique_ptr<DiscardableSharedMemoryHeap::Span> span = |
- heap.SearchFreeLists(1, 5); |
- EXPECT_TRUE(span); |
- |
- heap.MergeIntoFreeLists(std::move(span)); |
-} |
- |
-void OnDeleted(bool* deleted) { |
- *deleted = true; |
-} |
- |
-TEST(DiscardableSharedMemoryHeapTest, DeletedCallback) { |
- size_t block_size = base::GetPageSize(); |
- DiscardableSharedMemoryHeap heap(block_size); |
- int next_discardable_shared_memory_id = 0; |
- |
- std::unique_ptr<base::DiscardableSharedMemory> memory( |
- new base::DiscardableSharedMemory); |
- ASSERT_TRUE(memory->CreateAndMap(block_size)); |
- bool deleted = false; |
- std::unique_ptr<DiscardableSharedMemoryHeap::Span> span = heap.Grow( |
- std::move(memory), block_size, next_discardable_shared_memory_id++, |
- base::Bind(OnDeleted, base::Unretained(&deleted))); |
- |
- heap.MergeIntoFreeLists(std::move(span)); |
- heap.ReleaseFreeMemory(); |
- |
- EXPECT_TRUE(deleted); |
-} |
- |
-TEST(DiscardableSharedMemoryHeapTest, CreateMemoryAllocatorDumpTest) { |
- size_t block_size = base::GetPageSize(); |
- DiscardableSharedMemoryHeap heap(block_size); |
- int next_discardable_shared_memory_id = 0; |
- |
- std::unique_ptr<base::DiscardableSharedMemory> memory( |
- new base::DiscardableSharedMemory); |
- ASSERT_TRUE(memory->CreateAndMap(block_size)); |
- std::unique_ptr<DiscardableSharedMemoryHeap::Span> span = |
- heap.Grow(std::move(memory), block_size, |
- next_discardable_shared_memory_id++, base::Bind(NullTask)); |
- |
- // Check if allocator dump is created when span exists. |
- std::unique_ptr<base::trace_event::ProcessMemoryDump> pmd( |
- new base::trace_event::ProcessMemoryDump( |
- nullptr, {base::trace_event::MemoryDumpLevelOfDetail::DETAILED})); |
- EXPECT_TRUE(heap.CreateMemoryAllocatorDump(span.get(), "discardable/test1", |
- pmd.get())); |
- |
- // Unlock, Purge and release shared memory. |
- span->shared_memory()->Unlock(0, 0); |
- bool rv = span->shared_memory()->Purge(base::Time::Now()); |
- EXPECT_TRUE(rv); |
- heap.ReleasePurgedMemory(); |
- |
- // Check that allocator dump is created after memory is purged. |
- EXPECT_TRUE(heap.CreateMemoryAllocatorDump(span.get(), "discardable/test2", |
- pmd.get())); |
-} |
- |
-} // namespace |
-} // namespace content |