Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(24)

Side by Side Diff: base/memory/discardable_shared_memory.cc

Issue 851503003: Update from https://crrev.com/311076 (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
OLDNEW
« no previous file with comments | « base/memory/discardable_shared_memory.h ('k') | base/memory/discardable_shared_memory_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698