| 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 |