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

Side by Side Diff: content/common/discardable_shared_memory_heap_unittest.cc

Issue 1100073004: Adding discardable memory dump provider. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Changing c_str parameter to string. Created 5 years, 7 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 unified diff | Download patch
« no previous file with comments | « content/common/discardable_shared_memory_heap_perftest.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/common/discardable_shared_memory_heap.h" 5 #include "content/common/discardable_shared_memory_heap.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/memory/discardable_shared_memory.h" 8 #include "base/memory/discardable_shared_memory.h"
9 #include "base/process/process_metrics.h" 9 #include "base/process/process_metrics.h"
10 #include "testing/gtest/include/gtest/gtest.h" 10 #include "testing/gtest/include/gtest/gtest.h"
(...skipping 12 matching lines...) Expand all
23 EXPECT_EQ(0u, heap.GetSize()); 23 EXPECT_EQ(0u, heap.GetSize());
24 24
25 // Initial size of free lists should be 0. 25 // Initial size of free lists should be 0.
26 EXPECT_EQ(0u, heap.GetSizeOfFreeLists()); 26 EXPECT_EQ(0u, heap.GetSizeOfFreeLists());
27 27
28 // Free lists are initially empty. 28 // Free lists are initially empty.
29 EXPECT_FALSE(heap.SearchFreeLists(1, 0)); 29 EXPECT_FALSE(heap.SearchFreeLists(1, 0));
30 30
31 const size_t kBlocks = 10; 31 const size_t kBlocks = 10;
32 size_t memory_size = block_size * kBlocks; 32 size_t memory_size = block_size * kBlocks;
33 int next_discardable_shared_memory_id = 0;
33 34
34 scoped_ptr<base::DiscardableSharedMemory> memory( 35 scoped_ptr<base::DiscardableSharedMemory> memory(
35 new base::DiscardableSharedMemory); 36 new base::DiscardableSharedMemory);
36 ASSERT_TRUE(memory->CreateAndMap(memory_size)); 37 ASSERT_TRUE(memory->CreateAndMap(memory_size));
37 38
38 // Create new span for memory. 39 // Create new span for memory.
39 scoped_ptr<DiscardableSharedMemoryHeap::Span> new_span( 40 scoped_ptr<DiscardableSharedMemoryHeap::Span> new_span(
40 heap.Grow(memory.Pass(), memory_size, base::Bind(NullTask))); 41 heap.Grow(memory.Pass(), memory_size, next_discardable_shared_memory_id++,
42 base::Bind(NullTask)));
41 43
42 // Size should match |memory_size|. 44 // Size should match |memory_size|.
43 EXPECT_EQ(memory_size, heap.GetSize()); 45 EXPECT_EQ(memory_size, heap.GetSize());
44 46
45 // Size of free lists should still be 0. 47 // Size of free lists should still be 0.
46 EXPECT_EQ(0u, heap.GetSizeOfFreeLists()); 48 EXPECT_EQ(0u, heap.GetSizeOfFreeLists());
47 49
48 // Free list should still be empty as |new_span| is currently in use. 50 // Free list should still be empty as |new_span| is currently in use.
49 EXPECT_FALSE(heap.SearchFreeLists(1, 0)); 51 EXPECT_FALSE(heap.SearchFreeLists(1, 0));
50 52
(...skipping 17 matching lines...) Expand all
68 // Merge it into the free lists again. 70 // Merge it into the free lists again.
69 heap.MergeIntoFreeLists(span.Pass()); 71 heap.MergeIntoFreeLists(span.Pass());
70 } 72 }
71 73
72 TEST(DiscardableSharedMemoryHeapTest, SplitAndMerge) { 74 TEST(DiscardableSharedMemoryHeapTest, SplitAndMerge) {
73 size_t block_size = base::GetPageSize(); 75 size_t block_size = base::GetPageSize();
74 DiscardableSharedMemoryHeap heap(block_size); 76 DiscardableSharedMemoryHeap heap(block_size);
75 77
76 const size_t kBlocks = 6; 78 const size_t kBlocks = 6;
77 size_t memory_size = block_size * kBlocks; 79 size_t memory_size = block_size * kBlocks;
80 int next_discardable_shared_memory_id = 0;
78 81
79 scoped_ptr<base::DiscardableSharedMemory> memory( 82 scoped_ptr<base::DiscardableSharedMemory> memory(
80 new base::DiscardableSharedMemory); 83 new base::DiscardableSharedMemory);
81 ASSERT_TRUE(memory->CreateAndMap(memory_size)); 84 ASSERT_TRUE(memory->CreateAndMap(memory_size));
82 scoped_ptr<DiscardableSharedMemoryHeap::Span> new_span( 85 scoped_ptr<DiscardableSharedMemoryHeap::Span> new_span(
83 heap.Grow(memory.Pass(), memory_size, base::Bind(NullTask))); 86 heap.Grow(memory.Pass(), memory_size, next_discardable_shared_memory_id++,
87 base::Bind(NullTask)));
84 88
85 // Split span into two. 89 // Split span into two.
86 scoped_ptr<DiscardableSharedMemoryHeap::Span> leftover = 90 scoped_ptr<DiscardableSharedMemoryHeap::Span> leftover =
87 heap.Split(new_span.get(), 3); 91 heap.Split(new_span.get(), 3);
88 ASSERT_TRUE(leftover); 92 ASSERT_TRUE(leftover);
89 93
90 // Merge |leftover| into free lists. 94 // Merge |leftover| into free lists.
91 heap.MergeIntoFreeLists(leftover.Pass()); 95 heap.MergeIntoFreeLists(leftover.Pass());
92 96
93 // Some of the memory is still in use. 97 // Some of the memory is still in use.
(...skipping 29 matching lines...) Expand all
123 // Merge it into the free lists again. 127 // Merge it into the free lists again.
124 heap.MergeIntoFreeLists(large_span.Pass()); 128 heap.MergeIntoFreeLists(large_span.Pass());
125 } 129 }
126 130
127 TEST(DiscardableSharedMemoryHeapTest, MergeSingleBlockSpan) { 131 TEST(DiscardableSharedMemoryHeapTest, MergeSingleBlockSpan) {
128 size_t block_size = base::GetPageSize(); 132 size_t block_size = base::GetPageSize();
129 DiscardableSharedMemoryHeap heap(block_size); 133 DiscardableSharedMemoryHeap heap(block_size);
130 134
131 const size_t kBlocks = 6; 135 const size_t kBlocks = 6;
132 size_t memory_size = block_size * kBlocks; 136 size_t memory_size = block_size * kBlocks;
137 int next_discardable_shared_memory_id = 0;
133 138
134 scoped_ptr<base::DiscardableSharedMemory> memory( 139 scoped_ptr<base::DiscardableSharedMemory> memory(
135 new base::DiscardableSharedMemory); 140 new base::DiscardableSharedMemory);
136 ASSERT_TRUE(memory->CreateAndMap(memory_size)); 141 ASSERT_TRUE(memory->CreateAndMap(memory_size));
137 scoped_ptr<DiscardableSharedMemoryHeap::Span> new_span( 142 scoped_ptr<DiscardableSharedMemoryHeap::Span> new_span(
138 heap.Grow(memory.Pass(), memory_size, base::Bind(NullTask))); 143 heap.Grow(memory.Pass(), memory_size, next_discardable_shared_memory_id++,
144 base::Bind(NullTask)));
139 145
140 // Split span into two. 146 // Split span into two.
141 scoped_ptr<DiscardableSharedMemoryHeap::Span> leftover = 147 scoped_ptr<DiscardableSharedMemoryHeap::Span> leftover =
142 heap.Split(new_span.get(), 5); 148 heap.Split(new_span.get(), 5);
143 ASSERT_TRUE(leftover); 149 ASSERT_TRUE(leftover);
144 150
145 // Merge |new_span| into free lists. 151 // Merge |new_span| into free lists.
146 heap.MergeIntoFreeLists(new_span.Pass()); 152 heap.MergeIntoFreeLists(new_span.Pass());
147 153
148 // Merge |leftover| into free lists. 154 // Merge |leftover| into free lists.
149 heap.MergeIntoFreeLists(leftover.Pass()); 155 heap.MergeIntoFreeLists(leftover.Pass());
150 } 156 }
151 157
152 TEST(DiscardableSharedMemoryHeapTest, Grow) { 158 TEST(DiscardableSharedMemoryHeapTest, Grow) {
153 size_t block_size = base::GetPageSize(); 159 size_t block_size = base::GetPageSize();
154 DiscardableSharedMemoryHeap heap(block_size); 160 DiscardableSharedMemoryHeap heap(block_size);
161 int next_discardable_shared_memory_id = 0;
155 162
156 scoped_ptr<base::DiscardableSharedMemory> memory1( 163 scoped_ptr<base::DiscardableSharedMemory> memory1(
157 new base::DiscardableSharedMemory); 164 new base::DiscardableSharedMemory);
158 ASSERT_TRUE(memory1->CreateAndMap(block_size)); 165 ASSERT_TRUE(memory1->CreateAndMap(block_size));
159 heap.MergeIntoFreeLists( 166 heap.MergeIntoFreeLists(heap.Grow(memory1.Pass(), block_size,
160 heap.Grow(memory1.Pass(), block_size, base::Bind(NullTask)).Pass()); 167 next_discardable_shared_memory_id++,
168 base::Bind(NullTask)).Pass());
161 169
162 // Remove a span from free lists. 170 // Remove a span from free lists.
163 scoped_ptr<DiscardableSharedMemoryHeap::Span> span1 = 171 scoped_ptr<DiscardableSharedMemoryHeap::Span> span1 =
164 heap.SearchFreeLists(1, 0); 172 heap.SearchFreeLists(1, 0);
165 EXPECT_TRUE(span1); 173 EXPECT_TRUE(span1);
166 174
167 // No more memory available. 175 // No more memory available.
168 EXPECT_FALSE(heap.SearchFreeLists(1, 0)); 176 EXPECT_FALSE(heap.SearchFreeLists(1, 0));
169 177
170 // Grow free lists using new memory. 178 // Grow free lists using new memory.
171 scoped_ptr<base::DiscardableSharedMemory> memory2( 179 scoped_ptr<base::DiscardableSharedMemory> memory2(
172 new base::DiscardableSharedMemory); 180 new base::DiscardableSharedMemory);
173 ASSERT_TRUE(memory2->CreateAndMap(block_size)); 181 ASSERT_TRUE(memory2->CreateAndMap(block_size));
174 heap.MergeIntoFreeLists( 182 heap.MergeIntoFreeLists(heap.Grow(memory2.Pass(), block_size,
175 heap.Grow(memory2.Pass(), block_size, base::Bind(NullTask)).Pass()); 183 next_discardable_shared_memory_id++,
184 base::Bind(NullTask)).Pass());
176 185
177 // Memory should now be available. 186 // Memory should now be available.
178 scoped_ptr<DiscardableSharedMemoryHeap::Span> span2 = 187 scoped_ptr<DiscardableSharedMemoryHeap::Span> span2 =
179 heap.SearchFreeLists(1, 0); 188 heap.SearchFreeLists(1, 0);
180 EXPECT_TRUE(span2); 189 EXPECT_TRUE(span2);
181 190
182 // Merge spans into the free lists again. 191 // Merge spans into the free lists again.
183 heap.MergeIntoFreeLists(span1.Pass()); 192 heap.MergeIntoFreeLists(span1.Pass());
184 heap.MergeIntoFreeLists(span2.Pass()); 193 heap.MergeIntoFreeLists(span2.Pass());
185 } 194 }
186 195
187 TEST(DiscardableSharedMemoryHeapTest, ReleaseFreeMemory) { 196 TEST(DiscardableSharedMemoryHeapTest, ReleaseFreeMemory) {
188 size_t block_size = base::GetPageSize(); 197 size_t block_size = base::GetPageSize();
189 DiscardableSharedMemoryHeap heap(block_size); 198 DiscardableSharedMemoryHeap heap(block_size);
199 int next_discardable_shared_memory_id = 0;
190 200
191 scoped_ptr<base::DiscardableSharedMemory> memory( 201 scoped_ptr<base::DiscardableSharedMemory> memory(
192 new base::DiscardableSharedMemory); 202 new base::DiscardableSharedMemory);
193 ASSERT_TRUE(memory->CreateAndMap(block_size)); 203 ASSERT_TRUE(memory->CreateAndMap(block_size));
194 scoped_ptr<DiscardableSharedMemoryHeap::Span> span = 204 scoped_ptr<DiscardableSharedMemoryHeap::Span> span =
195 heap.Grow(memory.Pass(), block_size, base::Bind(NullTask)); 205 heap.Grow(memory.Pass(), block_size, next_discardable_shared_memory_id++,
206 base::Bind(NullTask));
196 207
197 // Free lists should be empty. 208 // Free lists should be empty.
198 EXPECT_EQ(0u, heap.GetSizeOfFreeLists()); 209 EXPECT_EQ(0u, heap.GetSizeOfFreeLists());
199 210
200 heap.ReleaseFreeMemory(); 211 heap.ReleaseFreeMemory();
201 212
202 // Size should still match |block_size|. 213 // Size should still match |block_size|.
203 EXPECT_EQ(block_size, heap.GetSize()); 214 EXPECT_EQ(block_size, heap.GetSize());
204 215
205 heap.MergeIntoFreeLists(span.Pass()); 216 heap.MergeIntoFreeLists(span.Pass());
206 heap.ReleaseFreeMemory(); 217 heap.ReleaseFreeMemory();
207 218
208 // Memory should have been released. 219 // Memory should have been released.
209 EXPECT_EQ(0u, heap.GetSize()); 220 EXPECT_EQ(0u, heap.GetSize());
210 EXPECT_EQ(0u, heap.GetSizeOfFreeLists()); 221 EXPECT_EQ(0u, heap.GetSizeOfFreeLists());
211 } 222 }
212 223
213 TEST(DiscardableSharedMemoryHeapTest, ReleasePurgedMemory) { 224 TEST(DiscardableSharedMemoryHeapTest, ReleasePurgedMemory) {
214 size_t block_size = base::GetPageSize(); 225 size_t block_size = base::GetPageSize();
215 DiscardableSharedMemoryHeap heap(block_size); 226 DiscardableSharedMemoryHeap heap(block_size);
227 int next_discardable_shared_memory_id = 0;
216 228
217 scoped_ptr<base::DiscardableSharedMemory> memory( 229 scoped_ptr<base::DiscardableSharedMemory> memory(
218 new base::DiscardableSharedMemory); 230 new base::DiscardableSharedMemory);
219 ASSERT_TRUE(memory->CreateAndMap(block_size)); 231 ASSERT_TRUE(memory->CreateAndMap(block_size));
220 scoped_ptr<DiscardableSharedMemoryHeap::Span> span = 232 scoped_ptr<DiscardableSharedMemoryHeap::Span> span =
221 heap.Grow(memory.Pass(), block_size, base::Bind(NullTask)); 233 heap.Grow(memory.Pass(), block_size, next_discardable_shared_memory_id++,
234 base::Bind(NullTask));
222 235
223 // Unlock memory so it can be purged. 236 // Unlock memory so it can be purged.
224 span->shared_memory()->Unlock(0, 0); 237 span->shared_memory()->Unlock(0, 0);
225 238
226 // Purge and release shared memory. 239 // Purge and release shared memory.
227 bool rv = span->shared_memory()->Purge(base::Time::Now()); 240 bool rv = span->shared_memory()->Purge(base::Time::Now());
228 EXPECT_TRUE(rv); 241 EXPECT_TRUE(rv);
229 heap.ReleasePurgedMemory(); 242 heap.ReleasePurgedMemory();
230 243
231 // Shared memory backing for |span| should be gone. 244 // Shared memory backing for |span| should be gone.
232 EXPECT_FALSE(span->shared_memory()); 245 EXPECT_FALSE(span->shared_memory());
233 246
234 // Size should be 0. 247 // Size should be 0.
235 EXPECT_EQ(0u, heap.GetSize()); 248 EXPECT_EQ(0u, heap.GetSize());
236 } 249 }
237 250
238 TEST(DiscardableSharedMemoryHeapTest, Slack) { 251 TEST(DiscardableSharedMemoryHeapTest, Slack) {
239 size_t block_size = base::GetPageSize(); 252 size_t block_size = base::GetPageSize();
240 DiscardableSharedMemoryHeap heap(block_size); 253 DiscardableSharedMemoryHeap heap(block_size);
241 254
242 const size_t kBlocks = 6; 255 const size_t kBlocks = 6;
243 size_t memory_size = block_size * kBlocks; 256 size_t memory_size = block_size * kBlocks;
257 int next_discardable_shared_memory_id = 0;
244 258
245 scoped_ptr<base::DiscardableSharedMemory> memory( 259 scoped_ptr<base::DiscardableSharedMemory> memory(
246 new base::DiscardableSharedMemory); 260 new base::DiscardableSharedMemory);
247 ASSERT_TRUE(memory->CreateAndMap(memory_size)); 261 ASSERT_TRUE(memory->CreateAndMap(memory_size));
248 heap.MergeIntoFreeLists( 262 heap.MergeIntoFreeLists(heap.Grow(memory.Pass(), memory_size,
249 heap.Grow(memory.Pass(), memory_size, base::Bind(NullTask)).Pass()); 263 next_discardable_shared_memory_id++,
264 base::Bind(NullTask)).Pass());
250 265
251 // No free span that is less or equal to 3 + 1. 266 // No free span that is less or equal to 3 + 1.
252 EXPECT_FALSE(heap.SearchFreeLists(3, 1)); 267 EXPECT_FALSE(heap.SearchFreeLists(3, 1));
253 268
254 // No free span that is less or equal to 3 + 2. 269 // No free span that is less or equal to 3 + 2.
255 EXPECT_FALSE(heap.SearchFreeLists(3, 2)); 270 EXPECT_FALSE(heap.SearchFreeLists(3, 2));
256 271
257 // No free span that is less or equal to 1 + 4. 272 // No free span that is less or equal to 1 + 4.
258 EXPECT_FALSE(heap.SearchFreeLists(1, 4)); 273 EXPECT_FALSE(heap.SearchFreeLists(1, 4));
259 274
260 scoped_ptr<DiscardableSharedMemoryHeap::Span> span = 275 scoped_ptr<DiscardableSharedMemoryHeap::Span> span =
261 heap.SearchFreeLists(1, 5); 276 heap.SearchFreeLists(1, 5);
262 EXPECT_TRUE(span); 277 EXPECT_TRUE(span);
263 278
264 heap.MergeIntoFreeLists(span.Pass()); 279 heap.MergeIntoFreeLists(span.Pass());
265 } 280 }
266 281
267 void OnDeleted(bool* deleted) { 282 void OnDeleted(bool* deleted) {
268 *deleted = true; 283 *deleted = true;
269 } 284 }
270 285
271 TEST(DiscardableSharedMemoryHeapTest, DeletedCallback) { 286 TEST(DiscardableSharedMemoryHeapTest, DeletedCallback) {
272 size_t block_size = base::GetPageSize(); 287 size_t block_size = base::GetPageSize();
273 DiscardableSharedMemoryHeap heap(block_size); 288 DiscardableSharedMemoryHeap heap(block_size);
289 int next_discardable_shared_memory_id = 0;
274 290
275 scoped_ptr<base::DiscardableSharedMemory> memory( 291 scoped_ptr<base::DiscardableSharedMemory> memory(
276 new base::DiscardableSharedMemory); 292 new base::DiscardableSharedMemory);
277 ASSERT_TRUE(memory->CreateAndMap(block_size)); 293 ASSERT_TRUE(memory->CreateAndMap(block_size));
278 bool deleted = false; 294 bool deleted = false;
279 scoped_ptr<DiscardableSharedMemoryHeap::Span> span = 295 scoped_ptr<DiscardableSharedMemoryHeap::Span> span =
280 heap.Grow(memory.Pass(), block_size, 296 heap.Grow(memory.Pass(), block_size, next_discardable_shared_memory_id++,
281 base::Bind(OnDeleted, base::Unretained(&deleted))); 297 base::Bind(OnDeleted, base::Unretained(&deleted)));
282 298
283 heap.MergeIntoFreeLists(span.Pass()); 299 heap.MergeIntoFreeLists(span.Pass());
284 heap.ReleaseFreeMemory(); 300 heap.ReleaseFreeMemory();
285 301
286 EXPECT_TRUE(deleted); 302 EXPECT_TRUE(deleted);
287 } 303 }
288 304
289 } // namespace 305 } // namespace
290 } // namespace content 306 } // namespace content
OLDNEW
« no previous file with comments | « content/common/discardable_shared_memory_heap_perftest.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698