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

Side by Side Diff: cc/resources/tile_manager.cc

Issue 23231002: cc: Prevent the tile manager from allocating more memory than allowed. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase Created 7 years, 4 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 | Annotate | Revision Log
« no previous file with comments | « cc/resources/resource_pool.cc ('k') | cc/resources/tile_manager_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/tile_manager.h" 5 #include "cc/resources/tile_manager.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <limits> 8 #include <limits>
9 #include <string> 9 #include <string>
10 10
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after
173 raster_worker_pool_->Shutdown(); 173 raster_worker_pool_->Shutdown();
174 raster_worker_pool_->CheckForCompletedTasks(); 174 raster_worker_pool_->CheckForCompletedTasks();
175 175
176 DCHECK_EQ(0u, bytes_releasable_); 176 DCHECK_EQ(0u, bytes_releasable_);
177 DCHECK_EQ(0u, resources_releasable_); 177 DCHECK_EQ(0u, resources_releasable_);
178 } 178 }
179 179
180 void TileManager::SetGlobalState( 180 void TileManager::SetGlobalState(
181 const GlobalStateThatImpactsTilePriority& global_state) { 181 const GlobalStateThatImpactsTilePriority& global_state) {
182 global_state_ = global_state; 182 global_state_ = global_state;
183 resource_pool_->SetMemoryUsageLimits( 183 resource_pool_->SetResourceUsageLimits(
184 global_state_.memory_limit_in_bytes, 184 global_state_.memory_limit_in_bytes,
185 global_state_.unused_memory_limit_in_bytes, 185 global_state_.unused_memory_limit_in_bytes,
186 global_state_.num_resources_limit); 186 global_state_.num_resources_limit);
187 } 187 }
188 188
189 void TileManager::RegisterTile(Tile* tile) { 189 void TileManager::RegisterTile(Tile* tile) {
190 DCHECK(!tile->required_for_activation()); 190 DCHECK(!tile->required_for_activation());
191 DCHECK(tiles_.find(tile->id()) == tiles_.end()); 191 DCHECK(tiles_.find(tile->id()) == tiles_.end());
192 192
193 tiles_[tile->id()] = tile; 193 tiles_[tile->id()] = tile;
(...skipping 298 matching lines...) Expand 10 before | Expand all | Expand 10 after
492 // the needs-to-be-rasterized queue. 492 // the needs-to-be-rasterized queue.
493 all_tiles_that_need_to_be_rasterized_have_memory_ = true; 493 all_tiles_that_need_to_be_rasterized_have_memory_ = true;
494 all_tiles_required_for_activation_have_memory_ = true; 494 all_tiles_required_for_activation_have_memory_ = true;
495 all_tiles_required_for_activation_have_been_initialized_ = true; 495 all_tiles_required_for_activation_have_been_initialized_ = true;
496 496
497 // Cast to prevent overflow. 497 // Cast to prevent overflow.
498 int64 bytes_available = 498 int64 bytes_available =
499 static_cast<int64>(bytes_releasable_) + 499 static_cast<int64>(bytes_releasable_) +
500 static_cast<int64>(global_state_.memory_limit_in_bytes) - 500 static_cast<int64>(global_state_.memory_limit_in_bytes) -
501 static_cast<int64>(resource_pool_->acquired_memory_usage_bytes()); 501 static_cast<int64>(resource_pool_->acquired_memory_usage_bytes());
502 int resources_available = resources_releasable_ + 502 int resources_available =
503 global_state_.num_resources_limit - 503 resources_releasable_ +
504 resource_pool_->NumResources(); 504 global_state_.num_resources_limit -
505 resource_pool_->acquired_resource_count();
505 506
506 size_t bytes_allocatable = 507 size_t bytes_allocatable =
507 std::max(static_cast<int64>(0), bytes_available); 508 std::max(static_cast<int64>(0), bytes_available);
508 size_t resources_allocatable = std::max(0, resources_available); 509 size_t resources_allocatable = std::max(0, resources_available);
509 510
510 size_t bytes_that_exceeded_memory_budget = 0; 511 size_t bytes_that_exceeded_memory_budget = 0;
511 size_t bytes_left = bytes_allocatable; 512 size_t bytes_left = bytes_allocatable;
512 size_t resources_left = resources_allocatable; 513 size_t resources_left = resources_allocatable;
513 bool oomed = false; 514 bool oomed = false;
514 515
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after
698 699
699 DCHECK(tile_version.requires_resource()); 700 DCHECK(tile_version.requires_resource());
700 DCHECK(!tile_version.resource_); 701 DCHECK(!tile_version.resource_);
701 702
702 if (tile_version.raster_task_.is_null()) 703 if (tile_version.raster_task_.is_null())
703 tile_version.raster_task_ = CreateRasterTask(tile); 704 tile_version.raster_task_ = CreateRasterTask(tile);
704 705
705 tasks.Append(tile_version.raster_task_, tile->required_for_activation()); 706 tasks.Append(tile_version.raster_task_, tile->required_for_activation());
706 } 707 }
707 708
709 // We must reduce the amount of unused resoruces before calling
710 // ScheduleTasks to prevent usage from rising above limits.
711 resource_pool_->ReduceResourceUsage();
712
708 // Schedule running of |tasks|. This replaces any previously 713 // Schedule running of |tasks|. This replaces any previously
709 // scheduled tasks and effectively cancels all tasks not present 714 // scheduled tasks and effectively cancels all tasks not present
710 // in |tasks|. 715 // in |tasks|.
711 raster_worker_pool_->ScheduleTasks(&tasks); 716 raster_worker_pool_->ScheduleTasks(&tasks);
712 } 717 }
713 718
714 RasterWorkerPool::Task TileManager::CreateImageDecodeTask( 719 RasterWorkerPool::Task TileManager::CreateImageDecodeTask(
715 Tile* tile, skia::LazyPixelRef* pixel_ref) { 720 Tile* tile, skia::LazyPixelRef* pixel_ref) {
716 return RasterWorkerPool::CreateImageDecodeTask( 721 return RasterWorkerPool::CreateImageDecodeTask(
717 pixel_ref, 722 pixel_ref,
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
837 bytes_releasable_ += tile->bytes_consumed_if_allocated(); 842 bytes_releasable_ += tile->bytes_consumed_if_allocated();
838 ++resources_releasable_; 843 ++resources_releasable_;
839 } 844 }
840 845
841 FreeUnusedResourcesForTile(tile); 846 FreeUnusedResourcesForTile(tile);
842 if (tile->priority(ACTIVE_TREE).distance_to_visible_in_pixels == 0) 847 if (tile->priority(ACTIVE_TREE).distance_to_visible_in_pixels == 0)
843 did_initialize_visible_tile_ = true; 848 did_initialize_visible_tile_ = true;
844 } 849 }
845 850
846 } // namespace cc 851 } // namespace cc
OLDNEW
« no previous file with comments | « cc/resources/resource_pool.cc ('k') | cc/resources/tile_manager_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698