OLD | NEW |
---|---|
(Empty) | |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #include "content/renderer/render_thread_impl.h" | |
6 | |
7 #include <stddef.h> | |
8 #include <stdint.h> | |
9 #include <utility> | |
10 | |
11 #include "base/bind.h" | |
12 #include "base/command_line.h" | |
13 #include "base/memory/discardable_memory.h" | |
14 #include "base/memory/scoped_vector.h" | |
15 #include "base/time/time.h" | |
16 #include "build/build_config.h" | |
17 #include "components/discardable_memory/client/client_discardable_shared_memory_ manager.h" | |
18 #include "components/discardable_memory/service/discardable_shared_memory_manage r.h" | |
19 #include "content/child/child_gpu_memory_buffer_manager.h" | |
20 #include "content/public/common/content_switches.h" | |
21 #include "content/public/test/content_browser_test.h" | |
22 #include "content/public/test/content_browser_test_utils.h" | |
23 #include "content/shell/browser/shell.h" | |
24 #include "gpu/ipc/client/gpu_memory_buffer_impl.h" | |
25 #include "ui/gfx/buffer_format_util.h" | |
26 #include "url/gurl.h" | |
27 | |
28 namespace content { | |
29 namespace { | |
30 | |
31 class RenderThreadImplDiscardableMemoryBrowserTest : public ContentBrowserTest { | |
32 public: | |
33 RenderThreadImplDiscardableMemoryBrowserTest() | |
34 : child_discardable_shared_memory_manager_(nullptr) {} | |
35 | |
36 // Overridden from BrowserTestBase: | |
37 void SetUpCommandLine(base::CommandLine* command_line) override { | |
38 command_line->AppendSwitch(switches::kSingleProcess); | |
39 } | |
40 | |
41 void SetUpOnMainThread() override { | |
42 NavigateToURL(shell(), GURL(url::kAboutBlankURL)); | |
43 PostTaskToInProcessRendererAndWait(base::Bind( | |
44 &RenderThreadImplDiscardableMemoryBrowserTest::SetUpOnRenderThread, | |
45 base::Unretained(this))); | |
46 } | |
47 | |
48 discardable_memory::ClientDiscardableSharedMemoryManager* | |
49 child_discardable_shared_memory_manager() { | |
50 return child_discardable_shared_memory_manager_; | |
51 } | |
52 | |
53 private: | |
54 void SetUpOnRenderThread() { | |
55 child_discardable_shared_memory_manager_ = | |
56 RenderThreadImpl::current()->GetDiscardableSharedMemoryManagerForTest(); | |
57 } | |
58 | |
59 discardable_memory::ClientDiscardableSharedMemoryManager* | |
60 child_discardable_shared_memory_manager_; | |
61 }; | |
62 | |
63 IN_PROC_BROWSER_TEST_F(RenderThreadImplDiscardableMemoryBrowserTest, | |
reveman
2016/12/07 16:40:38
I'm not able to see what changed in this patch. Wh
Peng
2016/12/07 16:45:45
Please see the BUILD.gn. I moved those test to a n
| |
64 LockDiscardableMemory) { | |
65 const size_t kSize = 1024 * 1024; // 1MiB. | |
66 | |
67 std::unique_ptr<base::DiscardableMemory> memory = | |
68 child_discardable_shared_memory_manager() | |
69 ->AllocateLockedDiscardableMemory(kSize); | |
70 | |
71 ASSERT_TRUE(memory); | |
72 void* addr = memory->data(); | |
73 ASSERT_NE(nullptr, addr); | |
74 | |
75 memory->Unlock(); | |
76 | |
77 // Purge all unlocked memory. | |
78 discardable_memory::DiscardableSharedMemoryManager::GetInstance() | |
79 ->SetMemoryLimit(0); | |
80 | |
81 // Should fail as memory should have been purged. | |
82 EXPECT_FALSE(memory->Lock()); | |
83 } | |
84 | |
85 // Disable the test for the Android asan build. | |
86 // See http://crbug.com/667837 for detail. | |
87 #if !(defined(OS_ANDROID) && defined(ADDRESS_SANITIZER)) | |
88 IN_PROC_BROWSER_TEST_F(RenderThreadImplDiscardableMemoryBrowserTest, | |
89 DiscardableMemoryAddressSpace) { | |
90 const size_t kLargeSize = 4 * 1024 * 1024; // 4MiB. | |
91 const size_t kNumberOfInstances = 1024 + 1; // >4GiB total. | |
92 | |
93 ScopedVector<base::DiscardableMemory> instances; | |
94 for (size_t i = 0; i < kNumberOfInstances; ++i) { | |
95 std::unique_ptr<base::DiscardableMemory> memory = | |
96 child_discardable_shared_memory_manager() | |
97 ->AllocateLockedDiscardableMemory(kLargeSize); | |
98 ASSERT_TRUE(memory); | |
99 void* addr = memory->data(); | |
100 ASSERT_NE(nullptr, addr); | |
101 memory->Unlock(); | |
102 instances.push_back(std::move(memory)); | |
103 } | |
104 } | |
105 #endif | |
106 | |
107 IN_PROC_BROWSER_TEST_F(RenderThreadImplDiscardableMemoryBrowserTest, | |
108 ReleaseFreeDiscardableMemory) { | |
109 const size_t kSize = 1024 * 1024; // 1MiB. | |
110 | |
111 std::unique_ptr<base::DiscardableMemory> memory = | |
112 child_discardable_shared_memory_manager() | |
113 ->AllocateLockedDiscardableMemory(kSize); | |
114 | |
115 EXPECT_TRUE(memory); | |
116 memory.reset(); | |
117 | |
118 EXPECT_GE(discardable_memory::DiscardableSharedMemoryManager::GetInstance() | |
119 ->GetBytesAllocated(), | |
120 kSize); | |
121 | |
122 child_discardable_shared_memory_manager()->ReleaseFreeMemory(); | |
123 | |
124 // Busy wait for host memory usage to be reduced. | |
125 base::TimeTicks end = | |
126 base::TimeTicks::Now() + base::TimeDelta::FromSeconds(5); | |
127 while (base::TimeTicks::Now() < end) { | |
128 if (!discardable_memory::DiscardableSharedMemoryManager::GetInstance() | |
129 ->GetBytesAllocated()) | |
130 break; | |
131 } | |
132 | |
133 EXPECT_LT(base::TimeTicks::Now(), end); | |
134 } | |
135 | |
136 } // namespace | |
137 } // namespace content | |
OLD | NEW |