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/child/child_discardable_shared_memory_manager.h" | 5 #include "content/child/child_discardable_shared_memory_manager.h" |
6 | 6 |
7 #include "base/memory/discardable_shared_memory.h" | 7 #include "base/memory/discardable_shared_memory.h" |
8 #include "base/process/process_metrics.h" | 8 #include "base/process/process_metrics.h" |
9 #include "content/child/child_thread.h" | 9 #include "content/child/child_thread.h" |
10 #include "content/common/child_process_messages.h" | 10 #include "content/common/child_process_messages.h" |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
65 | 65 |
66 for (;;) { | 66 for (;;) { |
67 // Search free list for available space. | 67 // Search free list for available space. |
68 scoped_ptr<DiscardableSharedMemoryHeap::Span> free_span = | 68 scoped_ptr<DiscardableSharedMemoryHeap::Span> free_span = |
69 heap_.SearchFreeList(pages); | 69 heap_.SearchFreeList(pages); |
70 if (!free_span.get()) | 70 if (!free_span.get()) |
71 break; | 71 break; |
72 | 72 |
73 // Attempt to lock |free_span|. Delete span and search free list again | 73 // Attempt to lock |free_span|. Delete span and search free list again |
74 // if locking failed. | 74 // if locking failed. |
75 if (!free_span->shared_memory()->Lock( | 75 if (free_span->shared_memory()->Lock( |
76 free_span->start() * base::GetPageSize() - | 76 free_span->start() * base::GetPageSize() - |
77 reinterpret_cast<size_t>(free_span->shared_memory()->memory()), | 77 reinterpret_cast<size_t>(free_span->shared_memory()->memory()), |
78 free_span->length() * base::GetPageSize())) { | 78 free_span->length() * base::GetPageSize()) != |
| 79 base::DiscardableSharedMemory::SUCCESS) { |
79 heap_.DeleteSpan(free_span.Pass()); | 80 heap_.DeleteSpan(free_span.Pass()); |
80 continue; | 81 continue; |
81 } | 82 } |
82 | 83 |
83 return make_scoped_ptr( | 84 return make_scoped_ptr( |
84 new DiscardableMemoryShmemChunkImpl(this, free_span.Pass())); | 85 new DiscardableMemoryShmemChunkImpl(this, free_span.Pass())); |
85 } | 86 } |
86 | 87 |
87 size_t pages_to_allocate = | 88 size_t pages_to_allocate = |
88 std::max(kAllocationSize / base::GetPageSize(), pages); | 89 std::max(kAllocationSize / base::GetPageSize(), pages); |
(...skipping 18 matching lines...) Expand all Loading... |
107 heap_.MergeIntoFreeList(leftover.Pass()); | 108 heap_.MergeIntoFreeList(leftover.Pass()); |
108 } | 109 } |
109 | 110 |
110 return make_scoped_ptr( | 111 return make_scoped_ptr( |
111 new DiscardableMemoryShmemChunkImpl(this, new_span.Pass())); | 112 new DiscardableMemoryShmemChunkImpl(this, new_span.Pass())); |
112 } | 113 } |
113 | 114 |
114 bool ChildDiscardableSharedMemoryManager::LockSpan( | 115 bool ChildDiscardableSharedMemoryManager::LockSpan( |
115 DiscardableSharedMemoryHeap::Span* span) { | 116 DiscardableSharedMemoryHeap::Span* span) { |
116 base::AutoLock lock(lock_); | 117 base::AutoLock lock(lock_); |
117 return span->shared_memory()->Lock( | 118 |
118 span->start() * base::GetPageSize() - | 119 size_t offset = span->start() * base::GetPageSize() - |
119 reinterpret_cast<size_t>(span->shared_memory()->memory()), | 120 reinterpret_cast<size_t>(span->shared_memory()->memory()); |
120 span->length() * base::GetPageSize()); | 121 size_t length = span->length() * base::GetPageSize(); |
| 122 |
| 123 switch (span->shared_memory()->Lock(offset, length)) { |
| 124 case base::DiscardableSharedMemory::SUCCESS: |
| 125 return true; |
| 126 case base::DiscardableSharedMemory::PURGED: |
| 127 span->shared_memory()->Unlock(offset, length); |
| 128 return false; |
| 129 case base::DiscardableSharedMemory::FAILED: |
| 130 return false; |
| 131 } |
| 132 |
| 133 NOTREACHED(); |
| 134 return false; |
121 } | 135 } |
122 | 136 |
123 void ChildDiscardableSharedMemoryManager::UnlockSpan( | 137 void ChildDiscardableSharedMemoryManager::UnlockSpan( |
124 DiscardableSharedMemoryHeap::Span* span) { | 138 DiscardableSharedMemoryHeap::Span* span) { |
125 base::AutoLock lock(lock_); | 139 base::AutoLock lock(lock_); |
126 return span->shared_memory()->Unlock( | 140 |
127 span->start() * base::GetPageSize() - | 141 size_t offset = span->start() * base::GetPageSize() - |
128 reinterpret_cast<size_t>(span->shared_memory()->memory()), | 142 reinterpret_cast<size_t>(span->shared_memory()->memory()); |
129 span->length() * base::GetPageSize()); | 143 size_t length = span->length() * base::GetPageSize(); |
| 144 |
| 145 return span->shared_memory()->Unlock(offset, length); |
130 } | 146 } |
131 | 147 |
132 bool ChildDiscardableSharedMemoryManager::IsSpanResident( | 148 bool ChildDiscardableSharedMemoryManager::IsSpanResident( |
133 DiscardableSharedMemoryHeap::Span* span) const { | 149 DiscardableSharedMemoryHeap::Span* span) const { |
134 base::AutoLock lock(lock_); | 150 base::AutoLock lock(lock_); |
135 return span->shared_memory()->IsMemoryResident(); | 151 return span->shared_memory()->IsMemoryResident(); |
136 } | 152 } |
137 | 153 |
138 void ChildDiscardableSharedMemoryManager::ReleaseSpan( | 154 void ChildDiscardableSharedMemoryManager::ReleaseSpan( |
139 scoped_ptr<DiscardableSharedMemoryHeap::Span> span) { | 155 scoped_ptr<DiscardableSharedMemoryHeap::Span> span) { |
(...skipping 21 matching lines...) Expand all Loading... |
161 sender_->Send( | 177 sender_->Send( |
162 new ChildProcessHostMsg_SyncAllocateLockedDiscardableSharedMemory( | 178 new ChildProcessHostMsg_SyncAllocateLockedDiscardableSharedMemory( |
163 size, &handle)); | 179 size, &handle)); |
164 scoped_ptr<base::DiscardableSharedMemory> memory( | 180 scoped_ptr<base::DiscardableSharedMemory> memory( |
165 new base::DiscardableSharedMemory(handle)); | 181 new base::DiscardableSharedMemory(handle)); |
166 CHECK(memory->Map(size)); | 182 CHECK(memory->Map(size)); |
167 return memory.Pass(); | 183 return memory.Pass(); |
168 } | 184 } |
169 | 185 |
170 } // namespace content | 186 } // namespace content |
OLD | NEW |