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 |