| 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 "components/discardable_memory/service/discardable_shared_memory_manage
r.h" | 5 #include "components/discardable_memory/service/discardable_shared_memory_manage
r.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <utility> | 8 #include <utility> |
| 9 | 9 |
| 10 #include "base/atomic_sequence_num.h" | 10 #include "base/atomic_sequence_num.h" |
| (...skipping 11 matching lines...) Expand all Loading... |
| 22 #include "base/strings/string_number_conversions.h" | 22 #include "base/strings/string_number_conversions.h" |
| 23 #include "base/strings/stringprintf.h" | 23 #include "base/strings/stringprintf.h" |
| 24 #include "base/sys_info.h" | 24 #include "base/sys_info.h" |
| 25 #include "base/threading/thread_task_runner_handle.h" | 25 #include "base/threading/thread_task_runner_handle.h" |
| 26 #include "base/trace_event/memory_allocator_dump.h" | 26 #include "base/trace_event/memory_allocator_dump.h" |
| 27 #include "base/trace_event/memory_dump_manager.h" | 27 #include "base/trace_event/memory_dump_manager.h" |
| 28 #include "base/trace_event/process_memory_dump.h" | 28 #include "base/trace_event/process_memory_dump.h" |
| 29 #include "base/trace_event/trace_event.h" | 29 #include "base/trace_event/trace_event.h" |
| 30 #include "build/build_config.h" | 30 #include "build/build_config.h" |
| 31 #include "components/discardable_memory/common/discardable_shared_memory_heap.h" | 31 #include "components/discardable_memory/common/discardable_shared_memory_heap.h" |
| 32 #include "mojo/public/cpp/bindings/strong_binding.h" |
| 33 #include "mojo/public/cpp/system/platform_handle.h" |
| 32 | 34 |
| 33 #if defined(OS_LINUX) | 35 #if defined(OS_LINUX) |
| 34 #include "base/files/file_path.h" | 36 #include "base/files/file_path.h" |
| 35 #include "base/files/file_util.h" | 37 #include "base/files/file_util.h" |
| 36 #include "base/metrics/histogram_macros.h" | 38 #include "base/metrics/histogram_macros.h" |
| 37 #endif | 39 #endif |
| 38 | 40 |
| 39 namespace discardable_memory { | 41 namespace discardable_memory { |
| 40 namespace { | 42 namespace { |
| 41 | 43 |
| 42 const char kSingleProcess[] = "single-process"; | 44 const char kSingleProcess[] = "single-process"; |
| 43 | 45 |
| 44 const int kInvalidUniqueClientID = -1; | 46 const int kInvalidUniqueClientID = -1; |
| 45 | 47 |
| 46 const uint64_t kBrowserTracingProcessId = std::numeric_limits<uint64_t>::max(); | 48 const uint64_t kBrowserTracingProcessId = std::numeric_limits<uint64_t>::max(); |
| 47 | 49 |
| 48 uint64_t ClientProcessUniqueIdToTracingProcessId(int client_id) { | 50 uint64_t ClientProcessUniqueIdToTracingProcessId(int client_id) { |
| 49 // TODO(penghuang): Move this function to right place. | 51 // TODO(penghuang): Move this function to right place. |
| 50 // https://crbug.com/661257 | 52 // https://crbug.com/661257 |
| 51 if (base::CommandLine::ForCurrentProcess()->HasSwitch(kSingleProcess)) | 53 if (base::CommandLine::ForCurrentProcess()->HasSwitch(kSingleProcess)) |
| 52 return kBrowserTracingProcessId; | 54 return kBrowserTracingProcessId; |
| 53 // The hash value is incremented so that the tracing id is never equal to | 55 // The hash value is incremented so that the tracing id is never equal to |
| 54 // MemoryDumpManager::kInvalidTracingProcessId. | 56 // MemoryDumpManager::kInvalidTracingProcessId. |
| 55 return static_cast<uint64_t>(base::Hash( | 57 return static_cast<uint64_t>(base::Hash( |
| 56 reinterpret_cast<const char*>(&client_id), sizeof(client_id))) + | 58 reinterpret_cast<const char*>(&client_id), sizeof(client_id))) + |
| 57 1; | 59 1; |
| 58 } | 60 } |
| 59 | 61 |
| 62 class DiscardableSharedMemoryManagerProxy |
| 63 : public mojom::DiscardableSharedMemoryManager { |
| 64 public: |
| 65 DiscardableSharedMemoryManagerProxy( |
| 66 int32_t client_id, |
| 67 ::discardable_memory::DiscardableSharedMemoryManager* manager) |
| 68 : client_id_(client_id), manager_(manager) {} |
| 69 |
| 70 ~DiscardableSharedMemoryManagerProxy() override { |
| 71 manager_->ClientRemoved(client_id_); |
| 72 } |
| 73 |
| 74 // mojom::DiscardableSharedMemoryManager overrides: |
| 75 void AllocateLockedDiscardableSharedMemory( |
| 76 uint32_t size, |
| 77 int32_t id, |
| 78 const AllocateLockedDiscardableSharedMemoryCallback& callback) override { |
| 79 base::SharedMemoryHandle handle; |
| 80 manager_->AllocateLockedDiscardableSharedMemoryForClient(client_id_, size, |
| 81 id, &handle); |
| 82 mojo::ScopedSharedBufferHandle memory; |
| 83 if (handle != base::SharedMemory::NULLHandle()) { |
| 84 memory = |
| 85 mojo::WrapSharedMemoryHandle(handle, size, false /* ready_only */); |
| 86 } |
| 87 return callback.Run(std::move(memory)); |
| 88 } |
| 89 |
| 90 void DeletedDiscardableSharedMemory(int32_t id) override { |
| 91 manager_->ClientRemoved(client_id_); |
| 92 } |
| 93 |
| 94 private: |
| 95 const int32_t client_id_; |
| 96 ::discardable_memory::DiscardableSharedMemoryManager* const manager_; |
| 97 |
| 98 DISALLOW_COPY_AND_ASSIGN(DiscardableSharedMemoryManagerProxy); |
| 99 }; |
| 100 |
| 60 class DiscardableMemoryImpl : public base::DiscardableMemory { | 101 class DiscardableMemoryImpl : public base::DiscardableMemory { |
| 61 public: | 102 public: |
| 62 DiscardableMemoryImpl( | 103 DiscardableMemoryImpl( |
| 63 std::unique_ptr<base::DiscardableSharedMemory> shared_memory, | 104 std::unique_ptr<base::DiscardableSharedMemory> shared_memory, |
| 64 const base::Closure& deleted_callback) | 105 const base::Closure& deleted_callback) |
| 65 : shared_memory_(std::move(shared_memory)), | 106 : shared_memory_(std::move(shared_memory)), |
| 66 deleted_callback_(deleted_callback), | 107 deleted_callback_(deleted_callback), |
| 67 is_locked_(true) {} | 108 is_locked_(true) {} |
| 68 | 109 |
| 69 ~DiscardableMemoryImpl() override { | 110 ~DiscardableMemoryImpl() override { |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 173 | 214 |
| 174 } // namespace | 215 } // namespace |
| 175 | 216 |
| 176 DiscardableSharedMemoryManager::MemorySegment::MemorySegment( | 217 DiscardableSharedMemoryManager::MemorySegment::MemorySegment( |
| 177 std::unique_ptr<base::DiscardableSharedMemory> memory) | 218 std::unique_ptr<base::DiscardableSharedMemory> memory) |
| 178 : memory_(std::move(memory)) {} | 219 : memory_(std::move(memory)) {} |
| 179 | 220 |
| 180 DiscardableSharedMemoryManager::MemorySegment::~MemorySegment() {} | 221 DiscardableSharedMemoryManager::MemorySegment::~MemorySegment() {} |
| 181 | 222 |
| 182 DiscardableSharedMemoryManager::DiscardableSharedMemoryManager() | 223 DiscardableSharedMemoryManager::DiscardableSharedMemoryManager() |
| 183 : default_memory_limit_(GetDefaultMemoryLimit()), | 224 : last_client_id_(0), |
| 225 default_memory_limit_(GetDefaultMemoryLimit()), |
| 184 memory_limit_(default_memory_limit_), | 226 memory_limit_(default_memory_limit_), |
| 185 bytes_allocated_(0), | 227 bytes_allocated_(0), |
| 186 memory_pressure_listener_(new base::MemoryPressureListener( | 228 memory_pressure_listener_(new base::MemoryPressureListener( |
| 187 base::Bind(&DiscardableSharedMemoryManager::OnMemoryPressure, | 229 base::Bind(&DiscardableSharedMemoryManager::OnMemoryPressure, |
| 188 base::Unretained(this)))), | 230 base::Unretained(this)))), |
| 189 // Current thread might not have a task runner in tests. | 231 // Current thread might not have a task runner in tests. |
| 190 enforce_memory_policy_task_runner_(base::ThreadTaskRunnerHandle::Get()), | 232 enforce_memory_policy_task_runner_(base::ThreadTaskRunnerHandle::Get()), |
| 191 enforce_memory_policy_pending_(false), | 233 enforce_memory_policy_pending_(false), |
| 192 weak_ptr_factory_(this) { | 234 weak_ptr_factory_(this) { |
| 193 DCHECK_NE(memory_limit_, 0u); | 235 DCHECK_NE(memory_limit_, 0u); |
| 194 enforce_memory_policy_callback_ = | 236 enforce_memory_policy_callback_ = |
| 195 base::Bind(&DiscardableSharedMemoryManager::EnforceMemoryPolicy, | 237 base::Bind(&DiscardableSharedMemoryManager::EnforceMemoryPolicy, |
| 196 weak_ptr_factory_.GetWeakPtr()); | 238 weak_ptr_factory_.GetWeakPtr()); |
| 197 base::trace_event::MemoryDumpManager::GetInstance()->RegisterDumpProvider( | 239 base::trace_event::MemoryDumpManager::GetInstance()->RegisterDumpProvider( |
| 198 this, "DiscardableSharedMemoryManager", | 240 this, "DiscardableSharedMemoryManager", |
| 199 base::ThreadTaskRunnerHandle::Get()); | 241 base::ThreadTaskRunnerHandle::Get()); |
| 200 base::MemoryCoordinatorClientRegistry::GetInstance()->Register(this); | 242 base::MemoryCoordinatorClientRegistry::GetInstance()->Register(this); |
| 201 } | 243 } |
| 202 | 244 |
| 203 DiscardableSharedMemoryManager::~DiscardableSharedMemoryManager() { | 245 DiscardableSharedMemoryManager::~DiscardableSharedMemoryManager() { |
| 204 base::trace_event::MemoryDumpManager::GetInstance()->UnregisterDumpProvider( | 246 base::trace_event::MemoryDumpManager::GetInstance()->UnregisterDumpProvider( |
| 205 this); | 247 this); |
| 206 } | 248 } |
| 207 | 249 |
| 208 DiscardableSharedMemoryManager* DiscardableSharedMemoryManager::current() { | 250 DiscardableSharedMemoryManager* DiscardableSharedMemoryManager::current() { |
| 209 return g_discardable_shared_memory_manager.Pointer(); | 251 return g_discardable_shared_memory_manager.Pointer(); |
| 210 } | 252 } |
| 211 | 253 |
| 254 DiscardableSharedMemoryManager::BindCallback |
| 255 DiscardableSharedMemoryManager::GetBindCallback() { |
| 256 return base::Bind(&DiscardableSharedMemoryManager::Bind, |
| 257 weak_ptr_factory_.GetWeakPtr()); |
| 258 } |
| 259 |
| 212 std::unique_ptr<base::DiscardableMemory> | 260 std::unique_ptr<base::DiscardableMemory> |
| 213 DiscardableSharedMemoryManager::AllocateLockedDiscardableMemory(size_t size) { | 261 DiscardableSharedMemoryManager::AllocateLockedDiscardableMemory(size_t size) { |
| 214 DCHECK_NE(size, 0u); | 262 DCHECK_NE(size, 0u); |
| 215 | 263 |
| 216 DiscardableSharedMemoryId new_id = | 264 int32_t new_id = g_next_discardable_shared_memory_id.GetNext(); |
| 217 g_next_discardable_shared_memory_id.GetNext(); | |
| 218 base::ProcessHandle current_process_handle = base::GetCurrentProcessHandle(); | |
| 219 | 265 |
| 220 // Note: Use DiscardableSharedMemoryHeap for in-process allocation | 266 // Note: Use DiscardableSharedMemoryHeap for in-process allocation |
| 221 // of discardable memory if the cost of each allocation is too high. | 267 // of discardable memory if the cost of each allocation is too high. |
| 222 base::SharedMemoryHandle handle; | 268 base::SharedMemoryHandle handle; |
| 223 AllocateLockedDiscardableSharedMemory( | 269 AllocateLockedDiscardableSharedMemory(kInvalidUniqueClientID, size, new_id, |
| 224 current_process_handle, kInvalidUniqueClientID, size, new_id, &handle); | 270 &handle); |
| 225 std::unique_ptr<base::DiscardableSharedMemory> memory( | 271 std::unique_ptr<base::DiscardableSharedMemory> memory( |
| 226 new base::DiscardableSharedMemory(handle)); | 272 new base::DiscardableSharedMemory(handle)); |
| 227 if (!memory->Map(size)) | 273 if (!memory->Map(size)) |
| 228 base::TerminateBecauseOutOfMemory(size); | 274 base::TerminateBecauseOutOfMemory(size); |
| 229 // Close file descriptor to avoid running out. | 275 // Close file descriptor to avoid running out. |
| 230 memory->Close(); | 276 memory->Close(); |
| 231 return base::MakeUnique<DiscardableMemoryImpl>( | 277 return base::MakeUnique<DiscardableMemoryImpl>( |
| 232 std::move(memory), | 278 std::move(memory), |
| 233 base::Bind( | 279 base::Bind( |
| 234 &DiscardableSharedMemoryManager::DeletedDiscardableSharedMemory, | 280 &DiscardableSharedMemoryManager::DeletedDiscardableSharedMemory, |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 301 static_cast<uint64_t>(resident_size)); | 347 static_cast<uint64_t>(resident_size)); |
| 302 } | 348 } |
| 303 #endif // defined(COUNT_RESIDENT_BYTES_SUPPORTED) | 349 #endif // defined(COUNT_RESIDENT_BYTES_SUPPORTED) |
| 304 } | 350 } |
| 305 } | 351 } |
| 306 return true; | 352 return true; |
| 307 } | 353 } |
| 308 | 354 |
| 309 void DiscardableSharedMemoryManager:: | 355 void DiscardableSharedMemoryManager:: |
| 310 AllocateLockedDiscardableSharedMemoryForClient( | 356 AllocateLockedDiscardableSharedMemoryForClient( |
| 311 base::ProcessHandle process_handle, | |
| 312 int client_id, | 357 int client_id, |
| 313 size_t size, | 358 size_t size, |
| 314 DiscardableSharedMemoryId id, | 359 int32_t id, |
| 315 base::SharedMemoryHandle* shared_memory_handle) { | 360 base::SharedMemoryHandle* shared_memory_handle) { |
| 316 AllocateLockedDiscardableSharedMemory(process_handle, client_id, size, id, | 361 AllocateLockedDiscardableSharedMemory(client_id, size, id, |
| 317 shared_memory_handle); | 362 shared_memory_handle); |
| 318 } | 363 } |
| 319 | 364 |
| 320 void DiscardableSharedMemoryManager::ClientDeletedDiscardableSharedMemory( | 365 void DiscardableSharedMemoryManager::ClientDeletedDiscardableSharedMemory( |
| 321 DiscardableSharedMemoryId id, | 366 int32_t id, |
| 322 int client_id) { | 367 int client_id) { |
| 323 DeletedDiscardableSharedMemory(id, client_id); | 368 DeletedDiscardableSharedMemory(id, client_id); |
| 324 } | 369 } |
| 325 | 370 |
| 326 void DiscardableSharedMemoryManager::ClientRemoved(int client_id) { | 371 void DiscardableSharedMemoryManager::ClientRemoved(int client_id) { |
| 327 base::AutoLock lock(lock_); | 372 base::AutoLock lock(lock_); |
| 328 | 373 |
| 329 auto it = clients_.find(client_id); | 374 auto it = clients_.find(client_id); |
| 330 if (it == clients_.end()) | 375 if (it == clients_.end()) |
| 331 return; | 376 return; |
| (...skipping 22 matching lines...) Expand all Loading... |
| 354 enforce_memory_policy_pending_ = false; | 399 enforce_memory_policy_pending_ = false; |
| 355 ReduceMemoryUsageUntilWithinMemoryLimit(); | 400 ReduceMemoryUsageUntilWithinMemoryLimit(); |
| 356 } | 401 } |
| 357 | 402 |
| 358 size_t DiscardableSharedMemoryManager::GetBytesAllocated() { | 403 size_t DiscardableSharedMemoryManager::GetBytesAllocated() { |
| 359 base::AutoLock lock(lock_); | 404 base::AutoLock lock(lock_); |
| 360 | 405 |
| 361 return bytes_allocated_; | 406 return bytes_allocated_; |
| 362 } | 407 } |
| 363 | 408 |
| 409 void DiscardableSharedMemoryManager::Bind( |
| 410 mojom::DiscardableSharedMemoryManagerRequest request) { |
| 411 mojo::MakeStrongBinding(base::MakeUnique<DiscardableSharedMemoryManagerProxy>( |
| 412 ++last_client_id_, this), |
| 413 std::move(request)); |
| 414 } |
| 415 |
| 364 void DiscardableSharedMemoryManager::OnMemoryStateChange( | 416 void DiscardableSharedMemoryManager::OnMemoryStateChange( |
| 365 base::MemoryState state) { | 417 base::MemoryState state) { |
| 366 switch (state) { | 418 switch (state) { |
| 367 case base::MemoryState::NORMAL: | 419 case base::MemoryState::NORMAL: |
| 368 SetMemoryLimit(default_memory_limit_); | 420 SetMemoryLimit(default_memory_limit_); |
| 369 break; | 421 break; |
| 370 case base::MemoryState::THROTTLED: | 422 case base::MemoryState::THROTTLED: |
| 371 SetMemoryLimit(0); | 423 SetMemoryLimit(0); |
| 372 break; | 424 break; |
| 373 case base::MemoryState::SUSPENDED: | 425 case base::MemoryState::SUSPENDED: |
| 374 // Note that SUSPENDED never occurs in the main browser process so far. | 426 // Note that SUSPENDED never occurs in the main browser process so far. |
| 375 // Fall through. | 427 // Fall through. |
| 376 case base::MemoryState::UNKNOWN: | 428 case base::MemoryState::UNKNOWN: |
| 377 NOTREACHED(); | 429 NOTREACHED(); |
| 378 break; | 430 break; |
| 379 } | 431 } |
| 380 } | 432 } |
| 381 | 433 |
| 382 void DiscardableSharedMemoryManager::AllocateLockedDiscardableSharedMemory( | 434 void DiscardableSharedMemoryManager::AllocateLockedDiscardableSharedMemory( |
| 383 base::ProcessHandle process_handle, | |
| 384 int client_id, | 435 int client_id, |
| 385 size_t size, | 436 size_t size, |
| 386 DiscardableSharedMemoryId id, | 437 int32_t id, |
| 387 base::SharedMemoryHandle* shared_memory_handle) { | 438 base::SharedMemoryHandle* shared_memory_handle) { |
| 388 base::AutoLock lock(lock_); | 439 base::AutoLock lock(lock_); |
| 389 | 440 |
| 390 // Make sure |id| is not already in use. | 441 // Make sure |id| is not already in use. |
| 391 MemorySegmentMap& client_segments = clients_[client_id]; | 442 MemorySegmentMap& client_segments = clients_[client_id]; |
| 392 if (client_segments.find(id) != client_segments.end()) { | 443 if (client_segments.find(id) != client_segments.end()) { |
| 393 LOG(ERROR) << "Invalid discardable shared memory ID"; | 444 LOG(ERROR) << "Invalid discardable shared memory ID"; |
| 394 *shared_memory_handle = base::SharedMemory::NULLHandle(); | 445 *shared_memory_handle = base::SharedMemory::NULLHandle(); |
| 395 return; | 446 return; |
| 396 } | 447 } |
| (...skipping 12 matching lines...) Expand all Loading... |
| 409 if (bytes_allocated_ > limit) | 460 if (bytes_allocated_ > limit) |
| 410 ReduceMemoryUsageUntilWithinLimit(limit); | 461 ReduceMemoryUsageUntilWithinLimit(limit); |
| 411 | 462 |
| 412 std::unique_ptr<base::DiscardableSharedMemory> memory( | 463 std::unique_ptr<base::DiscardableSharedMemory> memory( |
| 413 new base::DiscardableSharedMemory); | 464 new base::DiscardableSharedMemory); |
| 414 if (!memory->CreateAndMap(size)) { | 465 if (!memory->CreateAndMap(size)) { |
| 415 *shared_memory_handle = base::SharedMemory::NULLHandle(); | 466 *shared_memory_handle = base::SharedMemory::NULLHandle(); |
| 416 return; | 467 return; |
| 417 } | 468 } |
| 418 | 469 |
| 419 if (!memory->ShareToProcess(process_handle, shared_memory_handle)) { | 470 *shared_memory_handle = base::SharedMemory::DuplicateHandle(memory->handle()); |
| 420 LOG(ERROR) << "Cannot share discardable memory segment"; | |
| 421 *shared_memory_handle = base::SharedMemory::NULLHandle(); | |
| 422 return; | |
| 423 } | |
| 424 | 471 |
| 425 // Close file descriptor to avoid running out. | 472 // Close file descriptor to avoid running out. |
| 426 memory->Close(); | 473 memory->Close(); |
| 427 | 474 |
| 428 base::CheckedNumeric<size_t> checked_bytes_allocated = bytes_allocated_; | 475 base::CheckedNumeric<size_t> checked_bytes_allocated = bytes_allocated_; |
| 429 checked_bytes_allocated += memory->mapped_size(); | 476 checked_bytes_allocated += memory->mapped_size(); |
| 430 if (!checked_bytes_allocated.IsValid()) { | 477 if (!checked_bytes_allocated.IsValid()) { |
| 431 *shared_memory_handle = base::SharedMemory::NULLHandle(); | 478 *shared_memory_handle = base::SharedMemory::NULLHandle(); |
| 432 return; | 479 return; |
| 433 } | 480 } |
| 434 | 481 |
| 435 bytes_allocated_ = checked_bytes_allocated.ValueOrDie(); | 482 bytes_allocated_ = checked_bytes_allocated.ValueOrDie(); |
| 436 BytesAllocatedChanged(bytes_allocated_); | 483 BytesAllocatedChanged(bytes_allocated_); |
| 437 | 484 |
| 438 scoped_refptr<MemorySegment> segment(new MemorySegment(std::move(memory))); | 485 scoped_refptr<MemorySegment> segment(new MemorySegment(std::move(memory))); |
| 439 client_segments[id] = segment.get(); | 486 client_segments[id] = segment.get(); |
| 440 segments_.push_back(segment.get()); | 487 segments_.push_back(segment.get()); |
| 441 std::push_heap(segments_.begin(), segments_.end(), CompareMemoryUsageTime); | 488 std::push_heap(segments_.begin(), segments_.end(), CompareMemoryUsageTime); |
| 442 | 489 |
| 443 if (bytes_allocated_ > memory_limit_) | 490 if (bytes_allocated_ > memory_limit_) |
| 444 ScheduleEnforceMemoryPolicy(); | 491 ScheduleEnforceMemoryPolicy(); |
| 445 } | 492 } |
| 446 | 493 |
| 447 void DiscardableSharedMemoryManager::DeletedDiscardableSharedMemory( | 494 void DiscardableSharedMemoryManager::DeletedDiscardableSharedMemory( |
| 448 DiscardableSharedMemoryId id, | 495 int32_t id, |
| 449 int client_id) { | 496 int client_id) { |
| 450 base::AutoLock lock(lock_); | 497 base::AutoLock lock(lock_); |
| 451 | 498 |
| 452 MemorySegmentMap& client_segments = clients_[client_id]; | 499 MemorySegmentMap& client_segments = clients_[client_id]; |
| 453 | 500 |
| 454 MemorySegmentMap::iterator segment_it = client_segments.find(id); | 501 MemorySegmentMap::iterator segment_it = client_segments.find(id); |
| 455 if (segment_it == client_segments.end()) { | 502 if (segment_it == client_segments.end()) { |
| 456 LOG(ERROR) << "Invalid discardable shared memory ID"; | 503 LOG(ERROR) << "Invalid discardable shared memory ID"; |
| 457 return; | 504 return; |
| 458 } | 505 } |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 581 return; | 628 return; |
| 582 | 629 |
| 583 enforce_memory_policy_pending_ = true; | 630 enforce_memory_policy_pending_ = true; |
| 584 DCHECK(enforce_memory_policy_task_runner_); | 631 DCHECK(enforce_memory_policy_task_runner_); |
| 585 enforce_memory_policy_task_runner_->PostDelayedTask( | 632 enforce_memory_policy_task_runner_->PostDelayedTask( |
| 586 FROM_HERE, enforce_memory_policy_callback_, | 633 FROM_HERE, enforce_memory_policy_callback_, |
| 587 base::TimeDelta::FromMilliseconds(kEnforceMemoryPolicyDelayMs)); | 634 base::TimeDelta::FromMilliseconds(kEnforceMemoryPolicyDelayMs)); |
| 588 } | 635 } |
| 589 | 636 |
| 590 } // namespace discardable_memory | 637 } // namespace discardable_memory |
| OLD | NEW |