OLD | NEW |
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 "base/basictypes.h" | 5 #include "base/basictypes.h" |
6 #include "base/memory/discardable_shared_memory.h" | 6 #include "base/memory/discardable_shared_memory.h" |
7 #include "base/process/process_metrics.h" | 7 #include "base/process/process_metrics.h" |
8 #include "testing/gtest/include/gtest/gtest.h" | 8 #include "testing/gtest/include/gtest/gtest.h" |
9 | 9 |
10 namespace base { | 10 namespace base { |
(...skipping 325 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
336 memory.SetNow(Time::FromDoubleT(1)); | 336 memory.SetNow(Time::FromDoubleT(1)); |
337 memory.Unlock(0, 0); | 337 memory.Unlock(0, 0); |
338 | 338 |
339 // Lock and unlock memory. | 339 // Lock and unlock memory. |
340 auto lock_rv = memory.Lock(0, 0); | 340 auto lock_rv = memory.Lock(0, 0); |
341 EXPECT_EQ(DiscardableSharedMemory::SUCCESS, lock_rv); | 341 EXPECT_EQ(DiscardableSharedMemory::SUCCESS, lock_rv); |
342 memory.SetNow(Time::FromDoubleT(2)); | 342 memory.SetNow(Time::FromDoubleT(2)); |
343 memory.Unlock(0, 0); | 343 memory.Unlock(0, 0); |
344 } | 344 } |
345 | 345 |
346 // This test checks that zero-filled pages are returned after purging a segment | 346 #if defined(DISCARDABLE_SHARED_MEMORY_SHRINKING) |
347 // when DISCARDABLE_SHARED_MEMORY_ZERO_FILL_ON_DEMAND_PAGES_AFTER_PURGE is | 347 TEST(DiscardableSharedMemoryTest, Shrink) { |
348 // defined and MADV_REMOVE is supported. | |
349 #if defined(DISCARDABLE_SHARED_MEMORY_ZERO_FILL_ON_DEMAND_PAGES_AFTER_PURGE) | |
350 TEST(DiscardableSharedMemoryTest, ZeroFilledPagesAfterPurge) { | |
351 const uint32 kDataSize = 1024; | 348 const uint32 kDataSize = 1024; |
352 | 349 |
353 TestDiscardableSharedMemory memory1; | 350 TestDiscardableSharedMemory memory; |
354 bool rv = memory1.CreateAndMap(kDataSize); | 351 bool rv = memory.CreateAndMap(kDataSize); |
355 ASSERT_TRUE(rv); | 352 ASSERT_TRUE(rv); |
356 | 353 |
357 SharedMemoryHandle shared_handle; | 354 EXPECT_NE(0u, memory.mapped_size()); |
358 ASSERT_TRUE( | |
359 memory1.ShareToProcess(GetCurrentProcessHandle(), &shared_handle)); | |
360 ASSERT_TRUE(SharedMemory::IsHandleValid(shared_handle)); | |
361 | 355 |
362 TestDiscardableSharedMemory memory2(shared_handle); | 356 // Mapped size should be 0 after shrinking memory segment. |
363 rv = memory2.Map(kDataSize); | 357 memory.Shrink(); |
364 ASSERT_TRUE(rv); | 358 EXPECT_EQ(0u, memory.mapped_size()); |
365 | |
366 // Initialize all memory to '0xaa'. | |
367 memset(memory2.memory(), 0xaa, kDataSize); | |
368 | |
369 // Unlock memory. | |
370 memory2.SetNow(Time::FromDoubleT(1)); | |
371 memory2.Unlock(0, 0); | |
372 EXPECT_FALSE(memory1.IsMemoryLocked()); | |
373 | |
374 // Memory is unlocked, but our usage timestamp is incorrect. | |
375 rv = memory1.Purge(Time::FromDoubleT(2)); | |
376 EXPECT_FALSE(rv); | |
377 rv = memory1.Purge(Time::FromDoubleT(3)); | |
378 EXPECT_TRUE(rv); | |
379 | |
380 // Check that reading memory after it has been purged is returning | |
381 // zero-filled pages. | |
382 uint8 expected_data[kDataSize] = {}; | |
383 EXPECT_EQ(memcmp(memory2.memory(), expected_data, kDataSize), 0); | |
384 } | 359 } |
385 #endif | 360 #endif |
386 | 361 |
387 } // namespace | 362 } // namespace |
388 } // namespace base | 363 } // namespace base |
OLD | NEW |