| Index: base/memory/discardable_shared_memory_unittest.cc
|
| diff --git a/base/memory/discardable_shared_memory_unittest.cc b/base/memory/discardable_shared_memory_unittest.cc
|
| index e5174298bfd8a7f74920b00dbdb650fde9aef086..90441e1f35f47f8ab4db8eb79d5fe8998bf5e12f 100644
|
| --- a/base/memory/discardable_shared_memory_unittest.cc
|
| +++ b/base/memory/discardable_shared_memory_unittest.cc
|
| @@ -4,6 +4,7 @@
|
|
|
| #include "base/basictypes.h"
|
| #include "base/memory/discardable_shared_memory.h"
|
| +#include "base/process/process_metrics.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
|
|
| namespace base {
|
| @@ -20,7 +21,7 @@ class TestDiscardableSharedMemory : public DiscardableSharedMemory {
|
|
|
| private:
|
| // Overriden from DiscardableSharedMemory:
|
| - virtual Time Now() const override { return now_; }
|
| + Time Now() const override { return now_; }
|
|
|
| Time now_;
|
| };
|
| @@ -60,13 +61,17 @@ TEST(DiscardableSharedMemoryTest, LockAndUnlock) {
|
|
|
| // Memory is initially locked. Unlock it.
|
| memory1.SetNow(Time::FromDoubleT(1));
|
| - memory1.Unlock();
|
| + memory1.Unlock(0, 0);
|
|
|
| // Lock and unlock memory.
|
| - rv = memory1.Lock();
|
| + rv = memory1.Lock(0, 0);
|
| EXPECT_TRUE(rv);
|
| memory1.SetNow(Time::FromDoubleT(2));
|
| - memory1.Unlock();
|
| + memory1.Unlock(0, 0);
|
| +
|
| + // Lock again before duplicating and passing ownership to new instance.
|
| + rv = memory1.Lock(0, 0);
|
| + EXPECT_TRUE(rv);
|
|
|
| SharedMemoryHandle shared_handle;
|
| ASSERT_TRUE(
|
| @@ -77,35 +82,21 @@ TEST(DiscardableSharedMemoryTest, LockAndUnlock) {
|
| rv = memory2.Map(kDataSize);
|
| ASSERT_TRUE(rv);
|
|
|
| - // Lock first instance again.
|
| - rv = memory1.Lock();
|
| - EXPECT_TRUE(rv);
|
| -
|
| // Unlock second instance.
|
| memory2.SetNow(Time::FromDoubleT(3));
|
| - memory2.Unlock();
|
| + memory2.Unlock(0, 0);
|
|
|
| - // Lock and unlock second instance.
|
| - rv = memory2.Lock();
|
| + // Lock second instance before passing ownership back to first instance.
|
| + rv = memory2.Lock(0, 0);
|
| EXPECT_TRUE(rv);
|
| - memory2.SetNow(Time::FromDoubleT(4));
|
| - memory2.Unlock();
|
| -
|
| - // Try to lock first instance again. Should fail as first instance has an
|
| - // incorrect last know usage time.
|
| - rv = memory1.Lock();
|
| - EXPECT_FALSE(rv);
|
|
|
| // Memory should still be resident.
|
| rv = memory1.IsMemoryResident();
|
| EXPECT_TRUE(rv);
|
|
|
| - // Second attempt to lock first instance should succeed as last known usage
|
| - // time is now correct.
|
| - rv = memory1.Lock();
|
| - EXPECT_TRUE(rv);
|
| - memory1.SetNow(Time::FromDoubleT(5));
|
| - memory1.Unlock();
|
| + // Unlock first instance.
|
| + memory1.SetNow(Time::FromDoubleT(4));
|
| + memory1.Unlock(0, 0);
|
| }
|
|
|
| TEST(DiscardableSharedMemoryTest, Purge) {
|
| @@ -129,7 +120,7 @@ TEST(DiscardableSharedMemoryTest, Purge) {
|
| EXPECT_FALSE(rv);
|
|
|
| memory2.SetNow(Time::FromDoubleT(2));
|
| - memory2.Unlock();
|
| + memory2.Unlock(0, 0);
|
|
|
| ASSERT_TRUE(memory2.IsMemoryResident());
|
|
|
| @@ -144,7 +135,7 @@ TEST(DiscardableSharedMemoryTest, Purge) {
|
| EXPECT_TRUE(rv);
|
|
|
| // Lock should fail as memory has been purged.
|
| - rv = memory2.Lock();
|
| + rv = memory2.Lock(0, 0);
|
| EXPECT_FALSE(rv);
|
|
|
| ASSERT_FALSE(memory2.IsMemoryResident());
|
| @@ -167,11 +158,11 @@ TEST(DiscardableSharedMemoryTest, LastUsed) {
|
| ASSERT_TRUE(rv);
|
|
|
| memory2.SetNow(Time::FromDoubleT(1));
|
| - memory2.Unlock();
|
| + memory2.Unlock(0, 0);
|
|
|
| EXPECT_EQ(memory2.last_known_usage(), Time::FromDoubleT(1));
|
|
|
| - rv = memory2.Lock();
|
| + rv = memory2.Lock(0, 0);
|
| EXPECT_TRUE(rv);
|
|
|
| // This should fail as memory is locked.
|
| @@ -182,7 +173,7 @@ TEST(DiscardableSharedMemoryTest, LastUsed) {
|
| EXPECT_EQ(memory1.last_known_usage(), Time::FromDoubleT(2));
|
|
|
| memory2.SetNow(Time::FromDoubleT(3));
|
| - memory2.Unlock();
|
| + memory2.Unlock(0, 0);
|
|
|
| // Usage time should be correct for |memory2| instance.
|
| EXPECT_EQ(memory2.last_known_usage(), Time::FromDoubleT(3));
|
| @@ -235,16 +226,65 @@ TEST(DiscardableSharedMemoryTest, LockShouldAlwaysFailAfterSuccessfulPurge) {
|
| ASSERT_TRUE(rv);
|
|
|
| memory2.SetNow(Time::FromDoubleT(1));
|
| - memory2.Unlock();
|
| + memory2.Unlock(0, 0);
|
|
|
| rv = memory2.Purge(Time::FromDoubleT(2));
|
| EXPECT_TRUE(rv);
|
|
|
| // Lock should fail as memory has been purged.
|
| - rv = memory2.Lock();
|
| + rv = memory2.Lock(0, 0);
|
| + EXPECT_FALSE(rv);
|
| + rv = memory1.Lock(0, 0);
|
| + EXPECT_FALSE(rv);
|
| +}
|
| +
|
| +TEST(DiscardableSharedMemoryTest, LockAndUnlockRange) {
|
| + const uint32 kDataSize = 32;
|
| +
|
| + uint32 data_size_in_bytes = kDataSize * base::GetPageSize();
|
| +
|
| + TestDiscardableSharedMemory memory1;
|
| + bool rv = memory1.CreateAndMap(data_size_in_bytes);
|
| + ASSERT_TRUE(rv);
|
| +
|
| + SharedMemoryHandle shared_handle;
|
| + ASSERT_TRUE(
|
| + memory1.ShareToProcess(GetCurrentProcessHandle(), &shared_handle));
|
| + ASSERT_TRUE(SharedMemory::IsHandleValid(shared_handle));
|
| +
|
| + TestDiscardableSharedMemory memory2(shared_handle);
|
| + rv = memory2.Map(data_size_in_bytes);
|
| + ASSERT_TRUE(rv);
|
| +
|
| + // Unlock first page.
|
| + memory2.SetNow(Time::FromDoubleT(1));
|
| + memory2.Unlock(0, base::GetPageSize());
|
| +
|
| + rv = memory1.Purge(Time::FromDoubleT(2));
|
| EXPECT_FALSE(rv);
|
| - rv = memory1.Lock();
|
| +
|
| + // Unlock second page.
|
| + memory2.SetNow(Time::FromDoubleT(3));
|
| + memory2.Unlock(base::GetPageSize(), base::GetPageSize());
|
| +
|
| + rv = memory1.Purge(Time::FromDoubleT(4));
|
| EXPECT_FALSE(rv);
|
| +
|
| + // Unlock anything onwards.
|
| + memory2.SetNow(Time::FromDoubleT(5));
|
| + memory2.Unlock(2 * base::GetPageSize(), 0);
|
| +
|
| + // Memory is unlocked, but our usage timestamp is incorrect.
|
| + rv = memory1.Purge(Time::FromDoubleT(6));
|
| + EXPECT_FALSE(rv);
|
| +
|
| + // The failed purge attempt should have updated usage time to the correct
|
| + // value.
|
| + EXPECT_EQ(Time::FromDoubleT(5), memory1.last_known_usage());
|
| +
|
| + // Purge should now succeed.
|
| + rv = memory1.Purge(Time::FromDoubleT(7));
|
| + EXPECT_TRUE(rv);
|
| }
|
|
|
| } // namespace
|
|
|