Index: cc/tiles/tile_manager.cc |
diff --git a/cc/tiles/tile_manager.cc b/cc/tiles/tile_manager.cc |
index 743ef85ca4fef1c29668a56a3d42f98d5c810e5a..af016ffbc5eb33194136a2d53100652c7e49b062 100644 |
--- a/cc/tiles/tile_manager.cc |
+++ b/cc/tiles/tile_manager.cc |
@@ -18,6 +18,7 @@ |
#include "base/memory/ptr_util.h" |
#include "base/metrics/histogram.h" |
#include "base/numerics/safe_conversions.h" |
+#include "base/threading/platform_thread.h" |
#include "base/trace_event/trace_event_argument.h" |
#include "cc/base/histograms.h" |
#include "cc/debug/devtools_instrumentation.h" |
@@ -45,8 +46,14 @@ DEFINE_SCOPED_UMA_HISTOGRAM_AREA_TIMER( |
// OnTaskCompleted() in RasterTaskImpl. crbug.com/613812. |
prashant.n
2016/05/24 15:46:09
I'll remove this comment.
|
class RasterTaskImpl : public TileTask { |
public: |
- RasterTaskImpl(TileManager* tile_manager, |
- Resource* resource, |
+ struct CompletionData { |
reveman
2016/05/25 04:19:44
not sure moving it to a struct makes much differen
prashant.n
2016/05/25 04:25:06
Hmm. So we can have another approach mentioned in
|
+ TileManager* tile_manager; |
+ Resource* resource; |
+ Tile* tile; |
+ }; |
prashant.n
2016/05/25 03:48:04
Another approach -
1. Have empty CompletionData
|
+ |
+ RasterTaskImpl(const CompletionData& completion_data, |
+ base::PlatformThreadId origin_thread_id, |
scoped_refptr<RasterSource> raster_source, |
const gfx::Rect& content_rect, |
const gfx::Rect& invalid_content_rect, |
@@ -55,7 +62,7 @@ class RasterTaskImpl : public TileTask { |
TileResolution tile_resolution, |
int layer_id, |
uint64_t source_prepare_tiles_id, |
- Tile* tile, |
+ void* tile_ptr, |
uint64_t new_content_id, |
uint64_t previous_content_id, |
uint64_t resource_content_id, |
@@ -64,8 +71,8 @@ class RasterTaskImpl : public TileTask { |
TileTask::Vector* dependencies, |
bool supports_concurrent_execution) |
: TileTask(supports_concurrent_execution, dependencies), |
- tile_manager_(tile_manager), |
- resource_(resource), |
+ completion_data_(completion_data), |
+ origin_thread_id_(origin_thread_id), |
raster_source_(std::move(raster_source)), |
content_rect_(content_rect), |
invalid_content_rect_(invalid_content_rect), |
@@ -74,7 +81,7 @@ class RasterTaskImpl : public TileTask { |
tile_resolution_(tile_resolution), |
layer_id_(layer_id), |
source_prepare_tiles_id_(source_prepare_tiles_id), |
- tile_(tile), |
+ tile_ptr_(tile_ptr), |
new_content_id_(new_content_id), |
previous_content_id_(previous_content_id), |
resource_content_id_(resource_content_id), |
@@ -90,7 +97,7 @@ class RasterTaskImpl : public TileTask { |
DCHECK(raster_buffer_); |
frame_viewer_instrumentation::ScopedRasterTask raster_task( |
- tile_, tile_resolution_, source_frame_number_, layer_id_); |
+ tile_ptr_, tile_resolution_, source_frame_number_, layer_id_); |
ScopedRasterTaskTimer timer; |
timer.SetArea(content_rect_.size().GetArea()); |
@@ -103,16 +110,31 @@ class RasterTaskImpl : public TileTask { |
// Overridden from TileTask: |
void OnTaskCompleted() override { |
- tile_manager_->OnRasterTaskCompleted(std::move(raster_buffer_), tile_, |
- resource_, state().IsCanceled()); |
+ CompletionData& data = GetCompletionData(); |
+ data.tile_manager->OnRasterTaskCompleted(std::move(raster_buffer_), |
+ data.tile, data.resource, |
+ state().IsCanceled()); |
} |
protected: |
~RasterTaskImpl() override { DCHECK(!raster_buffer_); } |
private: |
- TileManager* tile_manager_; |
- Resource* resource_; |
+ bool IsRunningOnOriginThread() { |
reveman
2016/05/25 04:19:44
hm, can we use base::ThreadChecker instead?
|
+ return origin_thread_id_ == base::PlatformThread::CurrentId(); |
+ } |
+ |
+ CompletionData& GetCompletionData() { |
+ DCHECK(IsRunningOnOriginThread()); |
+ return completion_data_; |
+ } |
+ |
+ // This member is accessed only in origin thread and do not access it |
+ // directly. Use accessor method GetCompletionData() instead. |
+ CompletionData completion_data_; |
+ |
+ // Members accessed on worker or origin thread. |
+ base::PlatformThreadId origin_thread_id_; |
scoped_refptr<RasterSource> raster_source_; |
gfx::Rect content_rect_; |
gfx::Rect invalid_content_rect_; |
@@ -121,7 +143,7 @@ class RasterTaskImpl : public TileTask { |
TileResolution tile_resolution_; |
int layer_id_; |
uint64_t source_prepare_tiles_id_; |
- Tile* tile_; |
+ void* tile_ptr_; |
reveman
2016/05/25 04:19:44
what is this tile_ptr used for? logging? do we hav
prashant.n
2016/05/25 04:25:06
Yes for logging it is used (frame_viewer_instrumen
|
uint64_t new_content_id_; |
uint64_t previous_content_id_; |
uint64_t resource_content_id_; |
@@ -940,13 +962,20 @@ scoped_refptr<TileTask> TileManager::CreateRasterTask( |
std::unique_ptr<RasterBuffer> raster_buffer = |
tile_task_manager_->GetRasterBufferProvider()->AcquireBufferForRaster( |
resource, resource_content_id, tile->invalidated_id()); |
+ RasterTaskImpl::CompletionData completion_data; |
+ completion_data.tile_manager = this; |
+ completion_data.resource = resource; |
+ completion_data.tile = tile; |
+ // TODO(prashant.n): Cache thread id in TileManager. |
return make_scoped_refptr(new RasterTaskImpl( |
- this, resource, prioritized_tile.raster_source(), tile->content_rect(), |
+ completion_data, base::PlatformThread::CurrentId(), |
+ prioritized_tile.raster_source(), tile->content_rect(), |
tile->invalidated_content_rect(), tile->contents_scale(), |
playback_settings, prioritized_tile.priority().resolution, |
- tile->layer_id(), prepare_tiles_count_, tile, tile->id(), |
- tile->invalidated_id(), resource_content_id, tile->source_frame_number(), |
- std::move(raster_buffer), &decode_tasks, supports_concurrent_execution)); |
+ tile->layer_id(), prepare_tiles_count_, static_cast<void*>(tile), |
+ tile->id(), tile->invalidated_id(), resource_content_id, |
+ tile->source_frame_number(), std::move(raster_buffer), &decode_tasks, |
+ supports_concurrent_execution)); |
} |
void TileManager::OnRasterTaskCompleted( |