| 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 #include "components/discardable_memory/service/discardable_shared_memory_manage
r.h" | 4 #include "components/discardable_memory/service/discardable_shared_memory_manage
r.h" |
| 5 | 5 |
| 6 #include <stddef.h> | 6 #include <stddef.h> |
| 7 #include <stdint.h> | 7 #include <stdint.h> |
| 8 #include <string.h> | 8 #include <string.h> |
| 9 | 9 |
| 10 #include "base/message_loop/message_loop.h" | 10 #include "base/message_loop/message_loop.h" |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 70 std::unique_ptr<TestDiscardableSharedMemoryManager> manager_; | 70 std::unique_ptr<TestDiscardableSharedMemoryManager> manager_; |
| 71 }; | 71 }; |
| 72 | 72 |
| 73 TEST_F(DiscardableSharedMemoryManagerTest, AllocateForClient) { | 73 TEST_F(DiscardableSharedMemoryManagerTest, AllocateForClient) { |
| 74 const int kDataSize = 1024; | 74 const int kDataSize = 1024; |
| 75 uint8_t data[kDataSize]; | 75 uint8_t data[kDataSize]; |
| 76 memset(data, 0x80, kDataSize); | 76 memset(data, 0x80, kDataSize); |
| 77 | 77 |
| 78 base::SharedMemoryHandle shared_handle; | 78 base::SharedMemoryHandle shared_handle; |
| 79 manager_->AllocateLockedDiscardableSharedMemoryForClient( | 79 manager_->AllocateLockedDiscardableSharedMemoryForClient( |
| 80 kInvalidUniqueID, kDataSize, 0, &shared_handle); | 80 base::GetCurrentProcessHandle(), kInvalidUniqueID, kDataSize, 0, |
| 81 &shared_handle); |
| 81 ASSERT_TRUE(base::SharedMemory::IsHandleValid(shared_handle)); | 82 ASSERT_TRUE(base::SharedMemory::IsHandleValid(shared_handle)); |
| 82 | 83 |
| 83 TestDiscardableSharedMemory memory(shared_handle); | 84 TestDiscardableSharedMemory memory(shared_handle); |
| 84 bool rv = memory.Map(kDataSize); | 85 bool rv = memory.Map(kDataSize); |
| 85 ASSERT_TRUE(rv); | 86 ASSERT_TRUE(rv); |
| 86 | 87 |
| 87 memcpy(memory.memory(), data, kDataSize); | 88 memcpy(memory.memory(), data, kDataSize); |
| 88 memory.SetNow(base::Time::FromDoubleT(1)); | 89 memory.SetNow(base::Time::FromDoubleT(1)); |
| 89 memory.Unlock(0, 0); | 90 memory.Unlock(0, 0); |
| 90 | 91 |
| 91 ASSERT_EQ(base::DiscardableSharedMemory::SUCCESS, memory.Lock(0, 0)); | 92 ASSERT_EQ(base::DiscardableSharedMemory::SUCCESS, memory.Lock(0, 0)); |
| 92 EXPECT_EQ(memcmp(data, memory.memory(), kDataSize), 0); | 93 EXPECT_EQ(memcmp(data, memory.memory(), kDataSize), 0); |
| 93 memory.Unlock(0, 0); | 94 memory.Unlock(0, 0); |
| 94 } | 95 } |
| 95 | 96 |
| 96 TEST_F(DiscardableSharedMemoryManagerTest, Purge) { | 97 TEST_F(DiscardableSharedMemoryManagerTest, Purge) { |
| 97 const int kDataSize = 1024; | 98 const int kDataSize = 1024; |
| 98 | 99 |
| 99 base::SharedMemoryHandle shared_handle1; | 100 base::SharedMemoryHandle shared_handle1; |
| 100 manager_->AllocateLockedDiscardableSharedMemoryForClient( | 101 manager_->AllocateLockedDiscardableSharedMemoryForClient( |
| 101 kInvalidUniqueID, kDataSize, 1, &shared_handle1); | 102 base::GetCurrentProcessHandle(), kInvalidUniqueID, kDataSize, 1, |
| 103 &shared_handle1); |
| 102 ASSERT_TRUE(base::SharedMemory::IsHandleValid(shared_handle1)); | 104 ASSERT_TRUE(base::SharedMemory::IsHandleValid(shared_handle1)); |
| 103 | 105 |
| 104 TestDiscardableSharedMemory memory1(shared_handle1); | 106 TestDiscardableSharedMemory memory1(shared_handle1); |
| 105 bool rv = memory1.Map(kDataSize); | 107 bool rv = memory1.Map(kDataSize); |
| 106 ASSERT_TRUE(rv); | 108 ASSERT_TRUE(rv); |
| 107 | 109 |
| 108 base::SharedMemoryHandle shared_handle2; | 110 base::SharedMemoryHandle shared_handle2; |
| 109 manager_->AllocateLockedDiscardableSharedMemoryForClient( | 111 manager_->AllocateLockedDiscardableSharedMemoryForClient( |
| 110 kInvalidUniqueID, kDataSize, 2, &shared_handle2); | 112 base::GetCurrentProcessHandle(), kInvalidUniqueID, kDataSize, 2, |
| 113 &shared_handle2); |
| 111 ASSERT_TRUE(base::SharedMemory::IsHandleValid(shared_handle2)); | 114 ASSERT_TRUE(base::SharedMemory::IsHandleValid(shared_handle2)); |
| 112 | 115 |
| 113 TestDiscardableSharedMemory memory2(shared_handle2); | 116 TestDiscardableSharedMemory memory2(shared_handle2); |
| 114 rv = memory2.Map(kDataSize); | 117 rv = memory2.Map(kDataSize); |
| 115 ASSERT_TRUE(rv); | 118 ASSERT_TRUE(rv); |
| 116 | 119 |
| 117 // Enough memory for both allocations. | 120 // Enough memory for both allocations. |
| 118 manager_->SetNow(base::Time::FromDoubleT(1)); | 121 manager_->SetNow(base::Time::FromDoubleT(1)); |
| 119 manager_->SetMemoryLimit(memory1.mapped_size() + memory2.mapped_size()); | 122 manager_->SetMemoryLimit(memory1.mapped_size() + memory2.mapped_size()); |
| 120 | 123 |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 155 EXPECT_EQ(base::DiscardableSharedMemory::FAILED, lock_rv); | 158 EXPECT_EQ(base::DiscardableSharedMemory::FAILED, lock_rv); |
| 156 lock_rv = memory2.Lock(0, 0); | 159 lock_rv = memory2.Lock(0, 0); |
| 157 EXPECT_EQ(base::DiscardableSharedMemory::SUCCESS, lock_rv); | 160 EXPECT_EQ(base::DiscardableSharedMemory::SUCCESS, lock_rv); |
| 158 } | 161 } |
| 159 | 162 |
| 160 TEST_F(DiscardableSharedMemoryManagerTest, EnforceMemoryPolicy) { | 163 TEST_F(DiscardableSharedMemoryManagerTest, EnforceMemoryPolicy) { |
| 161 const int kDataSize = 1024; | 164 const int kDataSize = 1024; |
| 162 | 165 |
| 163 base::SharedMemoryHandle shared_handle; | 166 base::SharedMemoryHandle shared_handle; |
| 164 manager_->AllocateLockedDiscardableSharedMemoryForClient( | 167 manager_->AllocateLockedDiscardableSharedMemoryForClient( |
| 165 kInvalidUniqueID, kDataSize, 0, &shared_handle); | 168 base::GetCurrentProcessHandle(), kInvalidUniqueID, kDataSize, 0, |
| 169 &shared_handle); |
| 166 ASSERT_TRUE(base::SharedMemory::IsHandleValid(shared_handle)); | 170 ASSERT_TRUE(base::SharedMemory::IsHandleValid(shared_handle)); |
| 167 | 171 |
| 168 TestDiscardableSharedMemory memory(shared_handle); | 172 TestDiscardableSharedMemory memory(shared_handle); |
| 169 bool rv = memory.Map(kDataSize); | 173 bool rv = memory.Map(kDataSize); |
| 170 ASSERT_TRUE(rv); | 174 ASSERT_TRUE(rv); |
| 171 | 175 |
| 172 // Not enough memory for one allocation. | 176 // Not enough memory for one allocation. |
| 173 manager_->SetNow(base::Time::FromDoubleT(1)); | 177 manager_->SetNow(base::Time::FromDoubleT(1)); |
| 174 manager_->SetMemoryLimit(memory.mapped_size() - 1); | 178 manager_->SetMemoryLimit(memory.mapped_size() - 1); |
| 175 // We need to enforce memory policy as our memory usage is currently above | 179 // We need to enforce memory policy as our memory usage is currently above |
| (...skipping 17 matching lines...) Expand all Loading... |
| 193 | 197 |
| 194 EXPECT_EQ(base::DiscardableSharedMemory::FAILED, memory.Lock(0, 0)); | 198 EXPECT_EQ(base::DiscardableSharedMemory::FAILED, memory.Lock(0, 0)); |
| 195 } | 199 } |
| 196 | 200 |
| 197 TEST_F(DiscardableSharedMemoryManagerTest, | 201 TEST_F(DiscardableSharedMemoryManagerTest, |
| 198 ReduceMemoryAfterSegmentHasBeenDeleted) { | 202 ReduceMemoryAfterSegmentHasBeenDeleted) { |
| 199 const int kDataSize = 1024; | 203 const int kDataSize = 1024; |
| 200 | 204 |
| 201 base::SharedMemoryHandle shared_handle1; | 205 base::SharedMemoryHandle shared_handle1; |
| 202 manager_->AllocateLockedDiscardableSharedMemoryForClient( | 206 manager_->AllocateLockedDiscardableSharedMemoryForClient( |
| 203 kInvalidUniqueID, kDataSize, 1, &shared_handle1); | 207 base::GetCurrentProcessHandle(), kInvalidUniqueID, kDataSize, 1, |
| 208 &shared_handle1); |
| 204 ASSERT_TRUE(base::SharedMemory::IsHandleValid(shared_handle1)); | 209 ASSERT_TRUE(base::SharedMemory::IsHandleValid(shared_handle1)); |
| 205 | 210 |
| 206 TestDiscardableSharedMemory memory1(shared_handle1); | 211 TestDiscardableSharedMemory memory1(shared_handle1); |
| 207 bool rv = memory1.Map(kDataSize); | 212 bool rv = memory1.Map(kDataSize); |
| 208 ASSERT_TRUE(rv); | 213 ASSERT_TRUE(rv); |
| 209 | 214 |
| 210 base::SharedMemoryHandle shared_handle2; | 215 base::SharedMemoryHandle shared_handle2; |
| 211 manager_->AllocateLockedDiscardableSharedMemoryForClient( | 216 manager_->AllocateLockedDiscardableSharedMemoryForClient( |
| 212 kInvalidUniqueID, kDataSize, 2, &shared_handle2); | 217 base::GetCurrentProcessHandle(), kInvalidUniqueID, kDataSize, 2, |
| 218 &shared_handle2); |
| 213 ASSERT_TRUE(base::SharedMemory::IsHandleValid(shared_handle2)); | 219 ASSERT_TRUE(base::SharedMemory::IsHandleValid(shared_handle2)); |
| 214 | 220 |
| 215 TestDiscardableSharedMemory memory2(shared_handle2); | 221 TestDiscardableSharedMemory memory2(shared_handle2); |
| 216 rv = memory2.Map(kDataSize); | 222 rv = memory2.Map(kDataSize); |
| 217 ASSERT_TRUE(rv); | 223 ASSERT_TRUE(rv); |
| 218 | 224 |
| 219 // Unlock and delete segment 1. | 225 // Unlock and delete segment 1. |
| 220 memory1.SetNow(base::Time::FromDoubleT(1)); | 226 memory1.SetNow(base::Time::FromDoubleT(1)); |
| 221 memory1.Unlock(0, 0); | 227 memory1.Unlock(0, 0); |
| 222 memory1.Unmap(); | 228 memory1.Unmap(); |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 256 DiscardableSharedMemoryManager* const manager_; | 262 DiscardableSharedMemoryManager* const manager_; |
| 257 const size_t limit_; | 263 const size_t limit_; |
| 258 }; | 264 }; |
| 259 | 265 |
| 260 TEST_F(DiscardableSharedMemoryManagerScheduleEnforceMemoryPolicyTest, | 266 TEST_F(DiscardableSharedMemoryManagerScheduleEnforceMemoryPolicyTest, |
| 261 SetMemoryLimitOnSimpleThread) { | 267 SetMemoryLimitOnSimpleThread) { |
| 262 const int kDataSize = 1024; | 268 const int kDataSize = 1024; |
| 263 | 269 |
| 264 base::SharedMemoryHandle shared_handle; | 270 base::SharedMemoryHandle shared_handle; |
| 265 manager_->AllocateLockedDiscardableSharedMemoryForClient( | 271 manager_->AllocateLockedDiscardableSharedMemoryForClient( |
| 266 kInvalidUniqueID, kDataSize, 0, &shared_handle); | 272 base::GetCurrentProcessHandle(), kInvalidUniqueID, kDataSize, 0, |
| 273 &shared_handle); |
| 267 ASSERT_TRUE(base::SharedMemory::IsHandleValid(shared_handle)); | 274 ASSERT_TRUE(base::SharedMemory::IsHandleValid(shared_handle)); |
| 268 | 275 |
| 269 // Set the memory limit to a value that will require EnforceMemoryPolicy() | 276 // Set the memory limit to a value that will require EnforceMemoryPolicy() |
| 270 // to be schedule on a thread without a message loop. | 277 // to be schedule on a thread without a message loop. |
| 271 SetMemoryLimitRunner runner(manager_.get(), kDataSize - 1); | 278 SetMemoryLimitRunner runner(manager_.get(), kDataSize - 1); |
| 272 base::DelegateSimpleThread thread(&runner, "memory_limit_setter"); | 279 base::DelegateSimpleThread thread(&runner, "memory_limit_setter"); |
| 273 thread.Start(); | 280 thread.Start(); |
| 274 thread.Join(); | 281 thread.Join(); |
| 275 } | 282 } |
| 276 | 283 |
| 277 } // namespace | 284 } // namespace |
| 278 } // namespace discardable_memory | 285 } // namespace discardable_memory |
| OLD | NEW |