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 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "base/atomic_sequence_num.h" | 9 #include "base/atomic_sequence_num.h" |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
116 | 116 |
117 // Note: Use DiscardableSharedMemoryHeap for in-process allocation | 117 // Note: Use DiscardableSharedMemoryHeap for in-process allocation |
118 // of discardable memory if the cost of each allocation is too high. | 118 // of discardable memory if the cost of each allocation is too high. |
119 base::SharedMemoryHandle handle; | 119 base::SharedMemoryHandle handle; |
120 AllocateLockedDiscardableSharedMemory(current_process_handle, size, new_id, | 120 AllocateLockedDiscardableSharedMemory(current_process_handle, size, new_id, |
121 &handle); | 121 &handle); |
122 CHECK(base::SharedMemory::IsHandleValid(handle)); | 122 CHECK(base::SharedMemory::IsHandleValid(handle)); |
123 scoped_ptr<base::DiscardableSharedMemory> memory( | 123 scoped_ptr<base::DiscardableSharedMemory> memory( |
124 new base::DiscardableSharedMemory(handle)); | 124 new base::DiscardableSharedMemory(handle)); |
125 CHECK(memory->Map(size)); | 125 CHECK(memory->Map(size)); |
| 126 // Close file descriptor to avoid running out. |
| 127 memory->Close(); |
126 return make_scoped_ptr(new DiscardableMemoryImpl( | 128 return make_scoped_ptr(new DiscardableMemoryImpl( |
127 memory.Pass(), | 129 memory.Pass(), |
128 base::Bind( | 130 base::Bind( |
129 &HostDiscardableSharedMemoryManager::DeletedDiscardableSharedMemory, | 131 &HostDiscardableSharedMemoryManager::DeletedDiscardableSharedMemory, |
130 base::Unretained(this), new_id, current_process_handle))); | 132 base::Unretained(this), new_id, current_process_handle))); |
131 } | 133 } |
132 | 134 |
133 void HostDiscardableSharedMemoryManager:: | 135 void HostDiscardableSharedMemoryManager:: |
134 AllocateLockedDiscardableSharedMemoryForChild( | 136 AllocateLockedDiscardableSharedMemoryForChild( |
135 base::ProcessHandle process_handle, | 137 base::ProcessHandle process_handle, |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
230 base::CheckedNumeric<size_t> checked_bytes_allocated = bytes_allocated_; | 232 base::CheckedNumeric<size_t> checked_bytes_allocated = bytes_allocated_; |
231 checked_bytes_allocated += memory->mapped_size(); | 233 checked_bytes_allocated += memory->mapped_size(); |
232 if (!checked_bytes_allocated.IsValid()) { | 234 if (!checked_bytes_allocated.IsValid()) { |
233 *shared_memory_handle = base::SharedMemory::NULLHandle(); | 235 *shared_memory_handle = base::SharedMemory::NULLHandle(); |
234 return; | 236 return; |
235 } | 237 } |
236 | 238 |
237 bytes_allocated_ = checked_bytes_allocated.ValueOrDie(); | 239 bytes_allocated_ = checked_bytes_allocated.ValueOrDie(); |
238 BytesAllocatedChanged(bytes_allocated_); | 240 BytesAllocatedChanged(bytes_allocated_); |
239 | 241 |
| 242 #if !defined(DISCARDABLE_SHARED_MEMORY_SHRINKING) |
| 243 // Close file descriptor to avoid running out. |
| 244 memory->Close(); |
| 245 #endif |
| 246 |
240 scoped_refptr<MemorySegment> segment(new MemorySegment(memory.Pass())); | 247 scoped_refptr<MemorySegment> segment(new MemorySegment(memory.Pass())); |
241 process_segments[id] = segment.get(); | 248 process_segments[id] = segment.get(); |
242 segments_.push_back(segment.get()); | 249 segments_.push_back(segment.get()); |
243 std::push_heap(segments_.begin(), segments_.end(), CompareMemoryUsageTime); | 250 std::push_heap(segments_.begin(), segments_.end(), CompareMemoryUsageTime); |
244 | 251 |
245 if (bytes_allocated_ > memory_limit_) | 252 if (bytes_allocated_ > memory_limit_) |
246 ScheduleEnforceMemoryPolicy(); | 253 ScheduleEnforceMemoryPolicy(); |
247 } | 254 } |
248 | 255 |
249 void HostDiscardableSharedMemoryManager::DeletedDiscardableSharedMemory( | 256 void HostDiscardableSharedMemoryManager::DeletedDiscardableSharedMemory( |
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
358 size_t size = memory->mapped_size(); | 365 size_t size = memory->mapped_size(); |
359 DCHECK_GE(bytes_allocated_, size); | 366 DCHECK_GE(bytes_allocated_, size); |
360 bytes_allocated_ -= size; | 367 bytes_allocated_ -= size; |
361 | 368 |
362 // This will unmap the memory segment and drop our reference. The result | 369 // This will unmap the memory segment and drop our reference. The result |
363 // is that the memory will be released to the OS if the child process is | 370 // is that the memory will be released to the OS if the child process is |
364 // no longer referencing it. | 371 // no longer referencing it. |
365 // Note: We intentionally leave the segment in the |segments| vector to | 372 // Note: We intentionally leave the segment in the |segments| vector to |
366 // avoid reconstructing the heap. The element will be removed from the heap | 373 // avoid reconstructing the heap. The element will be removed from the heap |
367 // when its last usage time is older than all other segments. | 374 // when its last usage time is older than all other segments. |
| 375 memory->Unmap(); |
368 memory->Close(); | 376 memory->Close(); |
369 } | 377 } |
370 | 378 |
371 void HostDiscardableSharedMemoryManager::BytesAllocatedChanged( | 379 void HostDiscardableSharedMemoryManager::BytesAllocatedChanged( |
372 size_t new_bytes_allocated) const { | 380 size_t new_bytes_allocated) const { |
373 TRACE_COUNTER1("renderer_host", "TotalDiscardableMemoryUsage", | 381 TRACE_COUNTER1("renderer_host", "TotalDiscardableMemoryUsage", |
374 new_bytes_allocated); | 382 new_bytes_allocated); |
375 | 383 |
376 static const char kTotalDiscardableMemoryAllocatedKey[] = | 384 static const char kTotalDiscardableMemoryAllocatedKey[] = |
377 "total-discardable-memory-allocated"; | 385 "total-discardable-memory-allocated"; |
(...skipping 13 matching lines...) Expand all Loading... |
391 | 399 |
392 enforce_memory_policy_pending_ = true; | 400 enforce_memory_policy_pending_ = true; |
393 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( | 401 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( |
394 FROM_HERE, | 402 FROM_HERE, |
395 base::Bind(&HostDiscardableSharedMemoryManager::EnforceMemoryPolicy, | 403 base::Bind(&HostDiscardableSharedMemoryManager::EnforceMemoryPolicy, |
396 weak_ptr_factory_.GetWeakPtr()), | 404 weak_ptr_factory_.GetWeakPtr()), |
397 base::TimeDelta::FromMilliseconds(kEnforceMemoryPolicyDelayMs)); | 405 base::TimeDelta::FromMilliseconds(kEnforceMemoryPolicyDelayMs)); |
398 } | 406 } |
399 | 407 |
400 } // namespace content | 408 } // namespace content |
OLD | NEW |