| OLD | NEW |
| 1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 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 "cc/resources/resource_pool.h" | 5 #include "cc/resources/resource_pool.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 #include <stdint.h> | 8 #include <stdint.h> |
| 9 | 9 |
| 10 #include <algorithm> | 10 #include <algorithm> |
| 11 #include <utility> | 11 #include <utility> |
| 12 | 12 |
| 13 #include "base/format_macros.h" | 13 #include "base/format_macros.h" |
| 14 #include "base/memory/memory_coordinator_client_registry.h" | 14 #include "base/memory/memory_coordinator_client_registry.h" |
| 15 #include "base/strings/stringprintf.h" | 15 #include "base/strings/stringprintf.h" |
| 16 #include "base/threading/thread_task_runner_handle.h" | 16 #include "base/threading/thread_task_runner_handle.h" |
| 17 #include "base/trace_event/memory_dump_manager.h" | 17 #include "base/trace_event/memory_dump_manager.h" |
| 18 #include "cc/base/container_util.h" | 18 #include "cc/base/container_util.h" |
| 19 #include "cc/resources/resource_provider.h" | 19 #include "cc/resources/resource_provider.h" |
| 20 #include "cc/resources/resource_util.h" | 20 #include "cc/resources/resource_util.h" |
| 21 #include "cc/resources/scoped_resource.h" | 21 #include "cc/resources/scoped_resource.h" |
| 22 | 22 |
| 23 using base::trace_event::MemoryAllocatorDump; | |
| 24 using base::trace_event::MemoryDumpLevelOfDetail; | |
| 25 | |
| 26 namespace cc { | 23 namespace cc { |
| 27 base::TimeDelta ResourcePool::kDefaultExpirationDelay = | 24 base::TimeDelta ResourcePool::kDefaultExpirationDelay = |
| 28 base::TimeDelta::FromSeconds(1); | 25 base::TimeDelta::FromSeconds(1); |
| 29 | 26 |
| 30 void ResourcePool::PoolResource::OnMemoryDump( | 27 void ResourcePool::PoolResource::OnMemoryDump( |
| 31 base::trace_event::ProcessMemoryDump* pmd, | 28 base::trace_event::ProcessMemoryDump* pmd, |
| 32 const ResourceProvider* resource_provider, | 29 const ResourceProvider* resource_provider, |
| 33 bool is_free) const { | 30 bool is_free) const { |
| 34 // Resource IDs are not process-unique, so log with the ResourceProvider's | 31 // Resource IDs are not process-unique, so log with the ResourceProvider's |
| 35 // unique id. | 32 // unique id. |
| 36 std::string parent_node = | 33 std::string parent_node = |
| 37 base::StringPrintf("cc/resource_memory/provider_%d/resource_%d", | 34 base::StringPrintf("cc/resource_memory/provider_%d/resource_%d", |
| 38 resource_provider->tracing_id(), id()); | 35 resource_provider->tracing_id(), id()); |
| 39 | 36 |
| 40 std::string dump_name = | 37 std::string dump_name = |
| 41 base::StringPrintf("cc/tile_memory/provider_%d/resource_%d", | 38 base::StringPrintf("cc/tile_memory/provider_%d/resource_%d", |
| 42 resource_provider->tracing_id(), id()); | 39 resource_provider->tracing_id(), id()); |
| 43 MemoryAllocatorDump* dump = pmd->CreateAllocatorDump(dump_name); | 40 base::trace_event::MemoryAllocatorDump* dump = |
| 41 pmd->CreateAllocatorDump(dump_name); |
| 42 |
| 44 pmd->AddSuballocation(dump->guid(), parent_node); | 43 pmd->AddSuballocation(dump->guid(), parent_node); |
| 45 | 44 |
| 46 uint64_t total_bytes = | 45 uint64_t total_bytes = |
| 47 ResourceUtil::UncheckedSizeInBytesAligned<size_t>(size(), format()); | 46 ResourceUtil::UncheckedSizeInBytesAligned<size_t>(size(), format()); |
| 48 dump->AddScalar(MemoryAllocatorDump::kNameSize, | 47 dump->AddScalar(base::trace_event::MemoryAllocatorDump::kNameSize, |
| 49 MemoryAllocatorDump::kUnitsBytes, total_bytes); | 48 base::trace_event::MemoryAllocatorDump::kUnitsBytes, |
| 49 total_bytes); |
| 50 | 50 |
| 51 if (is_free) { | 51 if (is_free) { |
| 52 dump->AddScalar("free_size", MemoryAllocatorDump::kUnitsBytes, total_bytes); | 52 dump->AddScalar("free_size", |
| 53 base::trace_event::MemoryAllocatorDump::kUnitsBytes, |
| 54 total_bytes); |
| 53 } | 55 } |
| 54 } | 56 } |
| 55 | 57 |
| 56 ResourcePool::ResourcePool(ResourceProvider* resource_provider, | 58 ResourcePool::ResourcePool(ResourceProvider* resource_provider, |
| 57 base::SingleThreadTaskRunner* task_runner, | 59 base::SingleThreadTaskRunner* task_runner, |
| 58 bool use_gpu_memory_buffers, | 60 bool use_gpu_memory_buffers, |
| 59 const base::TimeDelta& expiration_delay) | 61 const base::TimeDelta& expiration_delay) |
| 60 : resource_provider_(resource_provider), | 62 : resource_provider_(resource_provider), |
| 61 use_gpu_memory_buffers_(use_gpu_memory_buffers), | 63 use_gpu_memory_buffers_(use_gpu_memory_buffers), |
| 62 max_memory_usage_bytes_(0), | 64 max_memory_usage_bytes_(0), |
| (...skipping 375 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 438 return unused_resources_.back()->last_usage(); | 440 return unused_resources_.back()->last_usage(); |
| 439 } | 441 } |
| 440 | 442 |
| 441 // This is only called when we have at least one evictable resource. | 443 // This is only called when we have at least one evictable resource. |
| 442 DCHECK(!busy_resources_.empty()); | 444 DCHECK(!busy_resources_.empty()); |
| 443 return busy_resources_.back()->last_usage(); | 445 return busy_resources_.back()->last_usage(); |
| 444 } | 446 } |
| 445 | 447 |
| 446 bool ResourcePool::OnMemoryDump(const base::trace_event::MemoryDumpArgs& args, | 448 bool ResourcePool::OnMemoryDump(const base::trace_event::MemoryDumpArgs& args, |
| 447 base::trace_event::ProcessMemoryDump* pmd) { | 449 base::trace_event::ProcessMemoryDump* pmd) { |
| 448 if (args.level_of_detail == MemoryDumpLevelOfDetail::BACKGROUND) { | 450 for (const auto& resource : unused_resources_) { |
| 449 std::string dump_name = base::StringPrintf( | 451 resource->OnMemoryDump(pmd, resource_provider_, true /* is_free */); |
| 450 "cc/tile_memory/provider_%d", resource_provider_->tracing_id()); | 452 } |
| 451 MemoryAllocatorDump* dump = pmd->CreateAllocatorDump(dump_name); | 453 for (const auto& resource : busy_resources_) { |
| 452 dump->AddScalar(MemoryAllocatorDump::kNameSize, | 454 resource->OnMemoryDump(pmd, resource_provider_, false /* is_free */); |
| 453 MemoryAllocatorDump::kUnitsBytes, | 455 } |
| 454 total_memory_usage_bytes_); | 456 for (const auto& entry : in_use_resources_) { |
| 455 } else { | 457 entry.second->OnMemoryDump(pmd, resource_provider_, false /* is_free */); |
| 456 for (const auto& resource : unused_resources_) { | |
| 457 resource->OnMemoryDump(pmd, resource_provider_, true /* is_free */); | |
| 458 } | |
| 459 for (const auto& resource : busy_resources_) { | |
| 460 resource->OnMemoryDump(pmd, resource_provider_, false /* is_free */); | |
| 461 } | |
| 462 for (const auto& entry : in_use_resources_) { | |
| 463 entry.second->OnMemoryDump(pmd, resource_provider_, false /* is_free */); | |
| 464 } | |
| 465 } | 458 } |
| 466 return true; | 459 return true; |
| 467 } | 460 } |
| 468 | 461 |
| 469 void ResourcePool::OnMemoryStateChange(base::MemoryState state) { | 462 void ResourcePool::OnMemoryStateChange(base::MemoryState state) { |
| 470 switch (state) { | 463 switch (state) { |
| 471 case base::MemoryState::NORMAL: | 464 case base::MemoryState::NORMAL: |
| 472 // TODO(tasak): go back to normal state. | 465 // TODO(tasak): go back to normal state. |
| 473 break; | 466 break; |
| 474 case base::MemoryState::THROTTLED: | 467 case base::MemoryState::THROTTLED: |
| 475 // TODO(tasak): make the limits of this component's caches smaller to | 468 // TODO(tasak): make the limits of this component's caches smaller to |
| 476 // save memory usage. | 469 // save memory usage. |
| 477 break; | 470 break; |
| 478 case base::MemoryState::SUSPENDED: | 471 case base::MemoryState::SUSPENDED: |
| 479 // Release all resources, regardless of how recently they were used. | 472 // Release all resources, regardless of how recently they were used. |
| 480 EvictResourcesNotUsedSince(base::TimeTicks() + base::TimeDelta::Max()); | 473 EvictResourcesNotUsedSince(base::TimeTicks() + base::TimeDelta::Max()); |
| 481 break; | 474 break; |
| 482 case base::MemoryState::UNKNOWN: | 475 case base::MemoryState::UNKNOWN: |
| 483 // NOT_REACHED. | 476 // NOT_REACHED. |
| 484 break; | 477 break; |
| 485 } | 478 } |
| 486 } | 479 } |
| 487 | 480 |
| 488 } // namespace cc | 481 } // namespace cc |
| OLD | NEW |