| 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 "content/common/host_discardable_shared_memory_manager.h" | 5 #include "content/common/host_discardable_shared_memory_manager.h" |
| 6 #include "testing/gtest/include/gtest/gtest.h" | 6 #include "testing/gtest/include/gtest/gtest.h" |
| 7 | 7 |
| 8 namespace content { | 8 namespace content { |
| 9 namespace { | 9 namespace { |
| 10 | 10 |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 69 manager_->AllocateLockedDiscardableSharedMemoryForChild( | 69 manager_->AllocateLockedDiscardableSharedMemoryForChild( |
| 70 base::GetCurrentProcessHandle(), kDataSize, &shared_handle); | 70 base::GetCurrentProcessHandle(), kDataSize, &shared_handle); |
| 71 ASSERT_TRUE(base::SharedMemory::IsHandleValid(shared_handle)); | 71 ASSERT_TRUE(base::SharedMemory::IsHandleValid(shared_handle)); |
| 72 | 72 |
| 73 TestDiscardableSharedMemory memory(shared_handle); | 73 TestDiscardableSharedMemory memory(shared_handle); |
| 74 bool rv = memory.Map(kDataSize); | 74 bool rv = memory.Map(kDataSize); |
| 75 ASSERT_TRUE(rv); | 75 ASSERT_TRUE(rv); |
| 76 | 76 |
| 77 memcpy(memory.memory(), data, kDataSize); | 77 memcpy(memory.memory(), data, kDataSize); |
| 78 memory.SetNow(base::Time::FromDoubleT(1)); | 78 memory.SetNow(base::Time::FromDoubleT(1)); |
| 79 memory.Unlock(); | 79 memory.Unlock(0, 0); |
| 80 | 80 |
| 81 ASSERT_TRUE(memory.Lock()); | 81 ASSERT_TRUE(memory.Lock(0, 0)); |
| 82 EXPECT_EQ(memcmp(data, memory.memory(), kDataSize), 0); | 82 EXPECT_EQ(memcmp(data, memory.memory(), kDataSize), 0); |
| 83 memory.Unlock(); | 83 memory.Unlock(0, 0); |
| 84 } | 84 } |
| 85 | 85 |
| 86 TEST_F(HostDiscardableSharedMemoryManagerTest, Purge) { | 86 TEST_F(HostDiscardableSharedMemoryManagerTest, Purge) { |
| 87 const int kDataSize = 1024; | 87 const int kDataSize = 1024; |
| 88 | 88 |
| 89 base::SharedMemoryHandle shared_handle1; | 89 base::SharedMemoryHandle shared_handle1; |
| 90 manager_->AllocateLockedDiscardableSharedMemoryForChild( | 90 manager_->AllocateLockedDiscardableSharedMemoryForChild( |
| 91 base::GetCurrentProcessHandle(), kDataSize, &shared_handle1); | 91 base::GetCurrentProcessHandle(), kDataSize, &shared_handle1); |
| 92 ASSERT_TRUE(base::SharedMemory::IsHandleValid(shared_handle1)); | 92 ASSERT_TRUE(base::SharedMemory::IsHandleValid(shared_handle1)); |
| 93 | 93 |
| 94 TestDiscardableSharedMemory memory1(shared_handle1); | 94 TestDiscardableSharedMemory memory1(shared_handle1); |
| 95 bool rv = memory1.Map(kDataSize); | 95 bool rv = memory1.Map(kDataSize); |
| 96 ASSERT_TRUE(rv); | 96 ASSERT_TRUE(rv); |
| 97 | 97 |
| 98 base::SharedMemoryHandle shared_handle2; | 98 base::SharedMemoryHandle shared_handle2; |
| 99 manager_->AllocateLockedDiscardableSharedMemoryForChild( | 99 manager_->AllocateLockedDiscardableSharedMemoryForChild( |
| 100 base::GetCurrentProcessHandle(), kDataSize, &shared_handle2); | 100 base::GetCurrentProcessHandle(), kDataSize, &shared_handle2); |
| 101 ASSERT_TRUE(base::SharedMemory::IsHandleValid(shared_handle2)); | 101 ASSERT_TRUE(base::SharedMemory::IsHandleValid(shared_handle2)); |
| 102 | 102 |
| 103 TestDiscardableSharedMemory memory2(shared_handle2); | 103 TestDiscardableSharedMemory memory2(shared_handle2); |
| 104 rv = memory2.Map(kDataSize); | 104 rv = memory2.Map(kDataSize); |
| 105 ASSERT_TRUE(rv); | 105 ASSERT_TRUE(rv); |
| 106 | 106 |
| 107 // Enough memory for both allocations. | 107 // Enough memory for both allocations. |
| 108 manager_->SetNow(base::Time::FromDoubleT(1)); | 108 manager_->SetNow(base::Time::FromDoubleT(1)); |
| 109 manager_->SetMemoryLimit(memory1.mapped_size() + memory2.mapped_size()); | 109 manager_->SetMemoryLimit(memory1.mapped_size() + memory2.mapped_size()); |
| 110 | 110 |
| 111 memory1.SetNow(base::Time::FromDoubleT(2)); | 111 memory1.SetNow(base::Time::FromDoubleT(2)); |
| 112 memory1.Unlock(); | 112 memory1.Unlock(0, 0); |
| 113 memory2.SetNow(base::Time::FromDoubleT(2)); | 113 memory2.SetNow(base::Time::FromDoubleT(2)); |
| 114 memory2.Unlock(); | 114 memory2.Unlock(0, 0); |
| 115 | 115 |
| 116 // Manager should not have to schedule another call to EnforceMemoryPolicy(). | 116 // Manager should not have to schedule another call to EnforceMemoryPolicy(). |
| 117 manager_->SetNow(base::Time::FromDoubleT(3)); | 117 manager_->SetNow(base::Time::FromDoubleT(3)); |
| 118 manager_->EnforceMemoryPolicy(); | 118 manager_->EnforceMemoryPolicy(); |
| 119 EXPECT_FALSE(manager_->enforce_memory_policy_pending()); | 119 EXPECT_FALSE(manager_->enforce_memory_policy_pending()); |
| 120 | 120 |
| 121 // Memory should still be resident. | 121 // Memory should still be resident. |
| 122 EXPECT_TRUE(memory1.IsMemoryResident()); | 122 EXPECT_TRUE(memory1.IsMemoryResident()); |
| 123 EXPECT_TRUE(memory2.IsMemoryResident()); | 123 EXPECT_TRUE(memory2.IsMemoryResident()); |
| 124 | 124 |
| 125 rv = memory1.Lock(); | 125 rv = memory1.Lock(0, 0); |
| 126 EXPECT_TRUE(rv); | 126 EXPECT_TRUE(rv); |
| 127 rv = memory2.Lock(); | 127 rv = memory2.Lock(0, 0); |
| 128 EXPECT_TRUE(rv); | 128 EXPECT_TRUE(rv); |
| 129 | 129 |
| 130 memory1.SetNow(base::Time::FromDoubleT(4)); | 130 memory1.SetNow(base::Time::FromDoubleT(4)); |
| 131 memory1.Unlock(); | 131 memory1.Unlock(0, 0); |
| 132 memory2.SetNow(base::Time::FromDoubleT(5)); | 132 memory2.SetNow(base::Time::FromDoubleT(5)); |
| 133 memory2.Unlock(); | 133 memory2.Unlock(0, 0); |
| 134 | 134 |
| 135 // Just enough memory for one allocation. | 135 // Just enough memory for one allocation. |
| 136 manager_->SetNow(base::Time::FromDoubleT(6)); | 136 manager_->SetNow(base::Time::FromDoubleT(6)); |
| 137 manager_->SetMemoryLimit(memory2.mapped_size()); | 137 manager_->SetMemoryLimit(memory2.mapped_size()); |
| 138 EXPECT_FALSE(manager_->enforce_memory_policy_pending()); | 138 EXPECT_FALSE(manager_->enforce_memory_policy_pending()); |
| 139 | 139 |
| 140 // LRU allocation should still be resident. | 140 // LRU allocation should still be resident. |
| 141 EXPECT_FALSE(memory1.IsMemoryResident()); | 141 EXPECT_FALSE(memory1.IsMemoryResident()); |
| 142 EXPECT_TRUE(memory2.IsMemoryResident()); | 142 EXPECT_TRUE(memory2.IsMemoryResident()); |
| 143 | 143 |
| 144 rv = memory1.Lock(); | 144 rv = memory1.Lock(0, 0); |
| 145 EXPECT_FALSE(rv); | 145 EXPECT_FALSE(rv); |
| 146 rv = memory2.Lock(); | 146 rv = memory2.Lock(0, 0); |
| 147 EXPECT_TRUE(rv); | 147 EXPECT_TRUE(rv); |
| 148 } | 148 } |
| 149 | 149 |
| 150 TEST_F(HostDiscardableSharedMemoryManagerTest, EnforceMemoryPolicy) { | 150 TEST_F(HostDiscardableSharedMemoryManagerTest, EnforceMemoryPolicy) { |
| 151 const int kDataSize = 1024; | 151 const int kDataSize = 1024; |
| 152 | 152 |
| 153 base::SharedMemoryHandle shared_handle; | 153 base::SharedMemoryHandle shared_handle; |
| 154 manager_->AllocateLockedDiscardableSharedMemoryForChild( | 154 manager_->AllocateLockedDiscardableSharedMemoryForChild( |
| 155 base::GetCurrentProcessHandle(), kDataSize, &shared_handle); | 155 base::GetCurrentProcessHandle(), kDataSize, &shared_handle); |
| 156 ASSERT_TRUE(base::SharedMemory::IsHandleValid(shared_handle)); | 156 ASSERT_TRUE(base::SharedMemory::IsHandleValid(shared_handle)); |
| 157 | 157 |
| 158 TestDiscardableSharedMemory memory(shared_handle); | 158 TestDiscardableSharedMemory memory(shared_handle); |
| 159 bool rv = memory.Map(kDataSize); | 159 bool rv = memory.Map(kDataSize); |
| 160 ASSERT_TRUE(rv); | 160 ASSERT_TRUE(rv); |
| 161 | 161 |
| 162 // Not enough memory for one allocation. | 162 // Not enough memory for one allocation. |
| 163 manager_->SetNow(base::Time::FromDoubleT(1)); | 163 manager_->SetNow(base::Time::FromDoubleT(1)); |
| 164 manager_->SetMemoryLimit(memory.mapped_size() - 1); | 164 manager_->SetMemoryLimit(memory.mapped_size() - 1); |
| 165 // We need to enforce memory policy as our memory usage is currently above | 165 // We need to enforce memory policy as our memory usage is currently above |
| 166 // the limit. | 166 // the limit. |
| 167 EXPECT_TRUE(manager_->enforce_memory_policy_pending()); | 167 EXPECT_TRUE(manager_->enforce_memory_policy_pending()); |
| 168 | 168 |
| 169 manager_->set_enforce_memory_policy_pending(false); | 169 manager_->set_enforce_memory_policy_pending(false); |
| 170 manager_->SetNow(base::Time::FromDoubleT(2)); | 170 manager_->SetNow(base::Time::FromDoubleT(2)); |
| 171 manager_->EnforceMemoryPolicy(); | 171 manager_->EnforceMemoryPolicy(); |
| 172 // Still need to enforce memory policy as nothing can be purged. | 172 // Still need to enforce memory policy as nothing can be purged. |
| 173 EXPECT_TRUE(manager_->enforce_memory_policy_pending()); | 173 EXPECT_TRUE(manager_->enforce_memory_policy_pending()); |
| 174 | 174 |
| 175 memory.SetNow(base::Time::FromDoubleT(3)); | 175 memory.SetNow(base::Time::FromDoubleT(3)); |
| 176 memory.Unlock(); | 176 memory.Unlock(0, 0); |
| 177 | 177 |
| 178 manager_->set_enforce_memory_policy_pending(false); | 178 manager_->set_enforce_memory_policy_pending(false); |
| 179 manager_->SetNow(base::Time::FromDoubleT(4)); | 179 manager_->SetNow(base::Time::FromDoubleT(4)); |
| 180 manager_->EnforceMemoryPolicy(); | 180 manager_->EnforceMemoryPolicy(); |
| 181 // Memory policy should have successfully been enforced. | 181 // Memory policy should have successfully been enforced. |
| 182 EXPECT_FALSE(manager_->enforce_memory_policy_pending()); | 182 EXPECT_FALSE(manager_->enforce_memory_policy_pending()); |
| 183 | 183 |
| 184 EXPECT_FALSE(memory.Lock()); | 184 EXPECT_FALSE(memory.Lock(0, 0)); |
| 185 } | 185 } |
| 186 | 186 |
| 187 } // namespace | 187 } // namespace |
| 188 } // namespace content | 188 } // namespace content |
| OLD | NEW |