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