| 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 "base/memory/discardable_shared_memory.h" | 5 #include "base/memory/discardable_shared_memory.h" |
| 6 | 6 |
| 7 #if defined(OS_POSIX) | 7 #if defined(OS_POSIX) |
| 8 #include <unistd.h> | 8 #include <unistd.h> |
| 9 #endif | 9 #endif |
| 10 | 10 |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 122 if (!checked_size.IsValid()) | 122 if (!checked_size.IsValid()) |
| 123 return false; | 123 return false; |
| 124 | 124 |
| 125 if (!shared_memory_.CreateAndMapAnonymous(checked_size.ValueOrDie())) | 125 if (!shared_memory_.CreateAndMapAnonymous(checked_size.ValueOrDie())) |
| 126 return false; | 126 return false; |
| 127 | 127 |
| 128 mapped_size_ = | 128 mapped_size_ = |
| 129 shared_memory_.mapped_size() - AlignToPageSize(sizeof(SharedState)); | 129 shared_memory_.mapped_size() - AlignToPageSize(sizeof(SharedState)); |
| 130 | 130 |
| 131 locked_page_count_ = AlignToPageSize(mapped_size_) / base::GetPageSize(); | 131 locked_page_count_ = AlignToPageSize(mapped_size_) / base::GetPageSize(); |
| 132 #if DCHECK_IS_ON | 132 #if DCHECK_IS_ON() |
| 133 for (size_t page = 0; page < locked_page_count_; ++page) | 133 for (size_t page = 0; page < locked_page_count_; ++page) |
| 134 locked_pages_.insert(page); | 134 locked_pages_.insert(page); |
| 135 #endif | 135 #endif |
| 136 | 136 |
| 137 DCHECK(last_known_usage_.is_null()); | 137 DCHECK(last_known_usage_.is_null()); |
| 138 SharedState new_state(SharedState::LOCKED, Time()); | 138 SharedState new_state(SharedState::LOCKED, Time()); |
| 139 subtle::Release_Store(&SharedStateFromSharedMemory(shared_memory_)->value.i, | 139 subtle::Release_Store(&SharedStateFromSharedMemory(shared_memory_)->value.i, |
| 140 new_state.value.i); | 140 new_state.value.i); |
| 141 return true; | 141 return true; |
| 142 } | 142 } |
| 143 | 143 |
| 144 bool DiscardableSharedMemory::Map(size_t size) { | 144 bool DiscardableSharedMemory::Map(size_t size) { |
| 145 if (!shared_memory_.Map(AlignToPageSize(sizeof(SharedState)) + size)) | 145 if (!shared_memory_.Map(AlignToPageSize(sizeof(SharedState)) + size)) |
| 146 return false; | 146 return false; |
| 147 | 147 |
| 148 mapped_size_ = | 148 mapped_size_ = |
| 149 shared_memory_.mapped_size() - AlignToPageSize(sizeof(SharedState)); | 149 shared_memory_.mapped_size() - AlignToPageSize(sizeof(SharedState)); |
| 150 | 150 |
| 151 locked_page_count_ = AlignToPageSize(mapped_size_) / base::GetPageSize(); | 151 locked_page_count_ = AlignToPageSize(mapped_size_) / base::GetPageSize(); |
| 152 #if DCHECK_IS_ON | 152 #if DCHECK_IS_ON() |
| 153 for (size_t page = 0; page < locked_page_count_; ++page) | 153 for (size_t page = 0; page < locked_page_count_; ++page) |
| 154 locked_pages_.insert(page); | 154 locked_pages_.insert(page); |
| 155 #endif | 155 #endif |
| 156 | 156 |
| 157 return true; | 157 return true; |
| 158 } | 158 } |
| 159 | 159 |
| 160 bool DiscardableSharedMemory::Lock(size_t offset, size_t length) { | 160 bool DiscardableSharedMemory::Lock(size_t offset, size_t length) { |
| 161 DCHECK_EQ(AlignToPageSize(offset), offset); | 161 DCHECK_EQ(AlignToPageSize(offset), offset); |
| 162 DCHECK_EQ(AlignToPageSize(length), length); | 162 DCHECK_EQ(AlignToPageSize(length), length); |
| (...skipping 30 matching lines...) Expand all Loading... |
| 193 length = AlignToPageSize(mapped_size_) - offset; | 193 length = AlignToPageSize(mapped_size_) - offset; |
| 194 | 194 |
| 195 size_t start = offset / base::GetPageSize(); | 195 size_t start = offset / base::GetPageSize(); |
| 196 size_t end = start + length / base::GetPageSize(); | 196 size_t end = start + length / base::GetPageSize(); |
| 197 DCHECK_LT(start, end); | 197 DCHECK_LT(start, end); |
| 198 DCHECK_LE(end, AlignToPageSize(mapped_size_) / base::GetPageSize()); | 198 DCHECK_LE(end, AlignToPageSize(mapped_size_) / base::GetPageSize()); |
| 199 | 199 |
| 200 // Add pages to |locked_page_count_|. | 200 // Add pages to |locked_page_count_|. |
| 201 // Note: Locking a page that is already locked is an error. | 201 // Note: Locking a page that is already locked is an error. |
| 202 locked_page_count_ += end - start; | 202 locked_page_count_ += end - start; |
| 203 #if DCHECK_IS_ON | 203 #if DCHECK_IS_ON() |
| 204 // Detect incorrect usage by keeping track of exactly what pages are locked. | 204 // Detect incorrect usage by keeping track of exactly what pages are locked. |
| 205 for (auto page = start; page < end; ++page) { | 205 for (auto page = start; page < end; ++page) { |
| 206 auto result = locked_pages_.insert(page); | 206 auto result = locked_pages_.insert(page); |
| 207 DCHECK(result.second); | 207 DCHECK(result.second); |
| 208 } | 208 } |
| 209 DCHECK_EQ(locked_pages_.size(), locked_page_count_); | 209 DCHECK_EQ(locked_pages_.size(), locked_page_count_); |
| 210 #endif | 210 #endif |
| 211 | 211 |
| 212 #if defined(OS_ANDROID) | 212 #if defined(OS_ANDROID) |
| 213 SharedMemoryHandle handle = shared_memory_.handle(); | 213 SharedMemoryHandle handle = shared_memory_.handle(); |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 245 | 245 |
| 246 size_t start = offset / base::GetPageSize(); | 246 size_t start = offset / base::GetPageSize(); |
| 247 size_t end = start + length / base::GetPageSize(); | 247 size_t end = start + length / base::GetPageSize(); |
| 248 DCHECK_LT(start, end); | 248 DCHECK_LT(start, end); |
| 249 DCHECK_LE(end, AlignToPageSize(mapped_size_) / base::GetPageSize()); | 249 DCHECK_LE(end, AlignToPageSize(mapped_size_) / base::GetPageSize()); |
| 250 | 250 |
| 251 // Remove pages from |locked_page_count_|. | 251 // Remove pages from |locked_page_count_|. |
| 252 // Note: Unlocking a page that is not locked is an error. | 252 // Note: Unlocking a page that is not locked is an error. |
| 253 DCHECK_GE(locked_page_count_, end - start); | 253 DCHECK_GE(locked_page_count_, end - start); |
| 254 locked_page_count_ -= end - start; | 254 locked_page_count_ -= end - start; |
| 255 #if DCHECK_IS_ON | 255 #if DCHECK_IS_ON() |
| 256 // Detect incorrect usage by keeping track of exactly what pages are locked. | 256 // Detect incorrect usage by keeping track of exactly what pages are locked. |
| 257 for (auto page = start; page < end; ++page) { | 257 for (auto page = start; page < end; ++page) { |
| 258 auto erased_count = locked_pages_.erase(page); | 258 auto erased_count = locked_pages_.erase(page); |
| 259 DCHECK_EQ(1u, erased_count); | 259 DCHECK_EQ(1u, erased_count); |
| 260 } | 260 } |
| 261 DCHECK_EQ(locked_pages_.size(), locked_page_count_); | 261 DCHECK_EQ(locked_pages_.size(), locked_page_count_); |
| 262 #endif | 262 #endif |
| 263 | 263 |
| 264 // Early out and avoid releasing the platform independent lock if some pages | 264 // Early out and avoid releasing the platform independent lock if some pages |
| 265 // are still locked. | 265 // are still locked. |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 346 SharedState result(subtle::NoBarrier_Load( | 346 SharedState result(subtle::NoBarrier_Load( |
| 347 &SharedStateFromSharedMemory(shared_memory_)->value.i)); | 347 &SharedStateFromSharedMemory(shared_memory_)->value.i)); |
| 348 | 348 |
| 349 return result.GetLockState() == SharedState::LOCKED || | 349 return result.GetLockState() == SharedState::LOCKED || |
| 350 !result.GetTimestamp().is_null(); | 350 !result.GetTimestamp().is_null(); |
| 351 } | 351 } |
| 352 | 352 |
| 353 void DiscardableSharedMemory::Close() { | 353 void DiscardableSharedMemory::Close() { |
| 354 shared_memory_.Unmap(); | 354 shared_memory_.Unmap(); |
| 355 shared_memory_.Close(); | 355 shared_memory_.Close(); |
| 356 mapped_size_ = 0; |
| 356 } | 357 } |
| 357 | 358 |
| 358 Time DiscardableSharedMemory::Now() const { | 359 Time DiscardableSharedMemory::Now() const { |
| 359 return Time::Now(); | 360 return Time::Now(); |
| 360 } | 361 } |
| 361 | 362 |
| 362 } // namespace base | 363 } // namespace base |
| OLD | NEW |