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

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

Issue 1018743003: Re-land: base: Replace PurgeAndTruncate with Shrink function. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: avoid using ftruncate on android Created 5 years, 9 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 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
109 DiscardableSharedMemory::DiscardableSharedMemory( 109 DiscardableSharedMemory::DiscardableSharedMemory(
110 SharedMemoryHandle shared_memory_handle) 110 SharedMemoryHandle shared_memory_handle)
111 : shared_memory_(shared_memory_handle, false), 111 : shared_memory_(shared_memory_handle, false),
112 mapped_size_(0), 112 mapped_size_(0),
113 locked_page_count_(0) { 113 locked_page_count_(0) {
114 } 114 }
115 115
116 DiscardableSharedMemory::~DiscardableSharedMemory() { 116 DiscardableSharedMemory::~DiscardableSharedMemory() {
117 } 117 }
118 118
119 // static
120 bool DiscardableSharedMemory::IsShrinkingSupported() {
121 #if defined(OS_POSIX) && !defined(OS_ANDROID)
122 // ftruncate() can be used on to shrink memory segments.
123 return true;
124 #else
125 return false;
126 #endif
127 }
128
119 bool DiscardableSharedMemory::CreateAndMap(size_t size) { 129 bool DiscardableSharedMemory::CreateAndMap(size_t size) {
120 CheckedNumeric<size_t> checked_size = size; 130 CheckedNumeric<size_t> checked_size = size;
121 checked_size += AlignToPageSize(sizeof(SharedState)); 131 checked_size += AlignToPageSize(sizeof(SharedState));
122 if (!checked_size.IsValid()) 132 if (!checked_size.IsValid())
123 return false; 133 return false;
124 134
125 if (!shared_memory_.CreateAndMapAnonymous(checked_size.ValueOrDie())) 135 if (!shared_memory_.CreateAndMapAnonymous(checked_size.ValueOrDie()))
126 return false; 136 return false;
127 137
128 mapped_size_ = 138 mapped_size_ =
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after
318 last_known_usage_ = result.GetLockState() == SharedState::LOCKED 328 last_known_usage_ = result.GetLockState() == SharedState::LOCKED
319 ? current_time 329 ? current_time
320 : result.GetTimestamp(); 330 : result.GetTimestamp();
321 return false; 331 return false;
322 } 332 }
323 333
324 last_known_usage_ = Time(); 334 last_known_usage_ = Time();
325 return true; 335 return true;
326 } 336 }
327 337
328 bool DiscardableSharedMemory::PurgeAndTruncate(Time current_time) { 338 void DiscardableSharedMemory::Shrink() {
329 if (!Purge(current_time)) 339 DCHECK(IsShrinkingSupported());
330 return false; 340 #if defined(OS_POSIX) && !defined(OS_ANDROID)
331
332 #if defined(OS_POSIX)
333 // Truncate shared memory to size of SharedState.
334 SharedMemoryHandle handle = shared_memory_.handle(); 341 SharedMemoryHandle handle = shared_memory_.handle();
335 if (SharedMemory::IsHandleValid(handle)) { 342 if (SharedMemory::IsHandleValid(handle)) {
336 if (HANDLE_EINTR(ftruncate(handle.fd, sizeof(SharedState))) != 0) 343 // Truncate shared memory to size of SharedState.
344 if (HANDLE_EINTR(
345 ftruncate(handle.fd, AlignToPageSize(sizeof(SharedState)))) != 0) {
337 DPLOG(ERROR) << "ftruncate() failed"; 346 DPLOG(ERROR) << "ftruncate() failed";
347 return;
348 }
349
350 mapped_size_ = 0;
338 } 351 }
339 #endif 352 #endif
340
341 return true;
342 } 353 }
343 354
344 bool DiscardableSharedMemory::IsMemoryResident() const { 355 bool DiscardableSharedMemory::IsMemoryResident() const {
345 DCHECK(shared_memory_.memory()); 356 DCHECK(shared_memory_.memory());
346 357
347 SharedState result(subtle::NoBarrier_Load( 358 SharedState result(subtle::NoBarrier_Load(
348 &SharedStateFromSharedMemory(shared_memory_)->value.i)); 359 &SharedStateFromSharedMemory(shared_memory_)->value.i));
349 360
350 return result.GetLockState() == SharedState::LOCKED || 361 return result.GetLockState() == SharedState::LOCKED ||
351 !result.GetTimestamp().is_null(); 362 !result.GetTimestamp().is_null();
352 } 363 }
353 364
354 void DiscardableSharedMemory::Close() { 365 void DiscardableSharedMemory::Close() {
355 shared_memory_.Unmap(); 366 shared_memory_.Unmap();
356 shared_memory_.Close(); 367 shared_memory_.Close();
357 mapped_size_ = 0; 368 mapped_size_ = 0;
358 } 369 }
359 370
360 Time DiscardableSharedMemory::Now() const { 371 Time DiscardableSharedMemory::Now() const {
361 return Time::Now(); 372 return Time::Now();
362 } 373 }
363 374
364 } // namespace base 375 } // namespace base
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698