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 |