Index: cc/resources/raster_worker_pool.cc |
diff --git a/cc/resources/raster_worker_pool.cc b/cc/resources/raster_worker_pool.cc |
index b1ab2108ea6ac9881ef3e86397d3854c7d3f049a..754e964c5a36d5bc4dc8f734891cab62a52b5335 100644 |
--- a/cc/resources/raster_worker_pool.cc |
+++ b/cc/resources/raster_worker_pool.cc |
@@ -228,30 +228,38 @@ class ImageDecodeWorkerPoolTaskImpl : public internal::WorkerPoolTask { |
class RasterFinishedWorkerPoolTaskImpl : public internal::WorkerPoolTask { |
public: |
+ typedef base::Callback<void(const internal::WorkerPoolTask* source)> |
+ Callback; |
+ |
RasterFinishedWorkerPoolTaskImpl( |
- base::MessageLoopProxy* origin_loop, |
- const base::Closure& on_raster_finished_callback) |
- : origin_loop_(origin_loop), |
+ const Callback& on_raster_finished_callback) |
+ : origin_loop_(base::MessageLoopProxy::current().get()), |
on_raster_finished_callback_(on_raster_finished_callback) { |
} |
// Overridden from internal::WorkerPoolTask: |
virtual void RunOnWorkerThread(unsigned thread_index) OVERRIDE { |
- origin_loop_->PostTask(FROM_HERE, on_raster_finished_callback_); |
+ TRACE_EVENT0("cc", "RasterFinishedWorkerPoolTaskImpl::RunOnWorkerThread"); |
+ origin_loop_->PostTask( |
+ FROM_HERE, |
+ base::Bind(&RasterFinishedWorkerPoolTaskImpl::RunOnOriginThread, |
+ this)); |
} |
virtual void CompleteOnOriginThread() OVERRIDE {} |
private: |
virtual ~RasterFinishedWorkerPoolTaskImpl() {} |
+ void RunOnOriginThread() const { |
+ on_raster_finished_callback_.Run(this); |
+ } |
+ |
scoped_refptr<base::MessageLoopProxy> origin_loop_; |
- const base::Closure on_raster_finished_callback_; |
+ const Callback on_raster_finished_callback_; |
DISALLOW_COPY_AND_ASSIGN(RasterFinishedWorkerPoolTaskImpl); |
}; |
-void Noop() {} |
- |
const char* kWorkerThreadNamePrefix = "CompositorRaster"; |
} // namespace |
@@ -363,56 +371,6 @@ void RasterWorkerPool::RasterTask::Reset() { |
RasterWorkerPool::RasterTask::~RasterTask() { |
} |
-RasterWorkerPool::RasterTaskGraph::RasterTaskGraph() |
- : raster_finished_node_(new GraphNode), |
- next_priority_(1u) { |
-} |
- |
-RasterWorkerPool::RasterTaskGraph::~RasterTaskGraph() { |
-} |
- |
-void RasterWorkerPool::RasterTaskGraph::InsertRasterTask( |
- internal::WorkerPoolTask* raster_task, |
- const TaskVector& decode_tasks) { |
- DCHECK(!raster_task->HasCompleted()); |
- DCHECK(graph_.find(raster_task) == graph_.end()); |
- |
- scoped_ptr<GraphNode> raster_node(new GraphNode); |
- raster_node->set_task(raster_task); |
- raster_node->set_priority(next_priority_++); |
- |
- // Insert image decode tasks. |
- for (TaskVector::const_iterator it = decode_tasks.begin(); |
- it != decode_tasks.end(); ++it) { |
- internal::WorkerPoolTask* decode_task = it->get(); |
- |
- // Skip if already decoded. |
- if (decode_task->HasCompleted()) |
- continue; |
- |
- raster_node->add_dependency(); |
- |
- // Check if decode task already exists in graph. |
- GraphNodeMap::iterator decode_it = graph_.find(decode_task); |
- if (decode_it != graph_.end()) { |
- GraphNode* decode_node = decode_it->second; |
- decode_node->add_dependent(raster_node.get()); |
- continue; |
- } |
- |
- scoped_ptr<GraphNode> decode_node(new GraphNode); |
- decode_node->set_task(decode_task); |
- decode_node->set_priority(next_priority_++); |
- decode_node->add_dependent(raster_node.get()); |
- graph_.set(decode_task, decode_node.Pass()); |
- } |
- |
- raster_finished_node_->add_dependency(); |
- raster_node->add_dependent(raster_finished_node_.get()); |
- |
- graph_.set(raster_task, raster_node.Pass()); |
-} |
- |
// static |
RasterWorkerPool::RasterTask RasterWorkerPool::CreateRasterTask( |
const Resource* resource, |
@@ -452,8 +410,7 @@ RasterWorkerPool::RasterWorkerPool(ResourceProvider* resource_provider, |
: WorkerPool(num_threads, kWorkerThreadNamePrefix), |
client_(NULL), |
resource_provider_(resource_provider), |
- weak_ptr_factory_(this), |
- schedule_raster_tasks_count_(0) { |
+ weak_ptr_factory_(this) { |
} |
RasterWorkerPool::~RasterWorkerPool() { |
@@ -464,11 +421,10 @@ void RasterWorkerPool::SetClient(RasterWorkerPoolClient* client) { |
} |
void RasterWorkerPool::Shutdown() { |
+ raster_tasks_.clear(); |
TaskGraph empty; |
SetTaskGraph(&empty); |
WorkerPool::Shutdown(); |
- raster_tasks_.clear(); |
- // Cancel any pending OnRasterFinished callback. |
weak_ptr_factory_.InvalidateWeakPtrs(); |
} |
@@ -478,48 +434,107 @@ void RasterWorkerPool::SetRasterTasks(RasterTask::Queue* queue) { |
queue->tasks_required_for_activation_); |
} |
-void RasterWorkerPool::SetRasterTaskGraph(RasterTaskGraph* graph) { |
- scoped_ptr<GraphNode> raster_finished_node( |
- graph->raster_finished_node_.Pass()); |
- TaskGraph new_graph; |
- new_graph.swap(graph->graph_); |
+bool RasterWorkerPool::IsRasterTaskRequiredForActivation( |
+ internal::RasterWorkerPoolTask* task) const { |
+ return |
+ raster_tasks_required_for_activation_.find(task) != |
+ raster_tasks_required_for_activation_.end(); |
+} |
- if (new_graph.empty()) { |
- SetTaskGraph(&new_graph); |
- raster_finished_task_ = NULL; |
+scoped_refptr<internal::WorkerPoolTask> |
+ RasterWorkerPool::CreateRasterFinishedTask() { |
+ return make_scoped_refptr( |
+ new RasterFinishedWorkerPoolTaskImpl( |
+ base::Bind(&RasterWorkerPool::OnRasterFinished, |
+ weak_ptr_factory_.GetWeakPtr()))); |
+} |
+ |
+scoped_refptr<internal::WorkerPoolTask> |
+ RasterWorkerPool::CreateRasterRequiredForActivationFinishedTask() { |
+ return make_scoped_refptr( |
+ new RasterFinishedWorkerPoolTaskImpl( |
+ base::Bind(&RasterWorkerPool::OnRasterRequiredForActivationFinished, |
+ weak_ptr_factory_.GetWeakPtr()))); |
+} |
+ |
+void RasterWorkerPool::OnRasterFinished( |
+ const internal::WorkerPoolTask* source) { |
+ TRACE_EVENT0("cc", "RasterWorkerPool::OnRasterFinished"); |
+ |
+ // Early out if current |raster_finished_task_| is not the source. |
+ if (source != raster_finished_task_.get()) |
return; |
- } |
- ++schedule_raster_tasks_count_; |
+ OnRasterTasksFinished(); |
+} |
- scoped_refptr<internal::WorkerPoolTask> new_raster_finished_task( |
- new RasterFinishedWorkerPoolTaskImpl( |
- base::MessageLoopProxy::current().get(), |
- base::Bind(&RasterWorkerPool::OnRasterFinished, |
- weak_ptr_factory_.GetWeakPtr(), |
- schedule_raster_tasks_count_))); |
- raster_finished_node->set_task(new_raster_finished_task.get()); |
- // Insert "raster finished" task before switching to new graph. |
- new_graph.set(new_raster_finished_task.get(), raster_finished_node.Pass()); |
- SetTaskGraph(&new_graph); |
- raster_finished_task_.swap(new_raster_finished_task); |
+void RasterWorkerPool::OnRasterRequiredForActivationFinished( |
+ const internal::WorkerPoolTask* source) { |
+ TRACE_EVENT0("cc", "RasterWorkerPool::OnRasterRequiredForActivationFinished"); |
+ |
+ // Early out if current |raster_required_for_activation_finished_task_| |
+ // is not the source. |
+ if (source != raster_required_for_activation_finished_task_.get()) |
+ return; |
+ |
+ OnRasterTasksRequiredForActivationFinished(); |
} |
-bool RasterWorkerPool::IsRasterTaskRequiredForActivation( |
- internal::RasterWorkerPoolTask* task) const { |
- return |
- raster_tasks_required_for_activation_.find(task) != |
- raster_tasks_required_for_activation_.end(); |
+scoped_ptr<base::Value> RasterWorkerPool::ScheduledStateAsValue() const { |
+ scoped_ptr<base::DictionaryValue> scheduled_state(new base::DictionaryValue); |
+ scheduled_state->SetInteger("task_count", raster_tasks_.size()); |
+ scheduled_state->SetInteger("task_required_for_activation_count", |
+ raster_tasks_required_for_activation_.size()); |
+ return scheduled_state.PassAs<base::Value>(); |
} |
-void RasterWorkerPool::OnRasterFinished(int64 schedule_raster_tasks_count) { |
- TRACE_EVENT1("cc", "RasterWorkerPool::OnRasterFinished", |
- "schedule_raster_tasks_count", schedule_raster_tasks_count); |
- DCHECK_GE(schedule_raster_tasks_count_, schedule_raster_tasks_count); |
- // Call OnRasterTasksFinished() when we've finished running all raster |
- // tasks needed since last time SetRasterTaskGraph() was called. |
- if (schedule_raster_tasks_count_ == schedule_raster_tasks_count) |
- OnRasterTasksFinished(); |
+// static |
+internal::GraphNode* RasterWorkerPool::CreateGraphNodeForTask( |
+ internal::WorkerPoolTask* task, |
+ unsigned priority, |
+ TaskGraph* graph) { |
+ internal::GraphNode* node = new internal::GraphNode(task, priority); |
+ DCHECK(graph->find(task) == graph->end()); |
+ graph->set(task, make_scoped_ptr(node)); |
+ return node; |
+} |
+ |
+// static |
+internal::GraphNode* RasterWorkerPool::CreateGraphNodeForRasterTask( |
+ internal::WorkerPoolTask* raster_task, |
+ const TaskVector& decode_tasks, |
+ unsigned priority, |
+ TaskGraph* graph) { |
+ DCHECK(!raster_task->HasCompleted()); |
+ |
+ internal::GraphNode* raster_node = CreateGraphNodeForTask( |
+ raster_task, priority, graph); |
+ |
+ // Insert image decode tasks. |
+ for (TaskVector::const_iterator it = decode_tasks.begin(); |
+ it != decode_tasks.end(); ++it) { |
+ internal::WorkerPoolTask* decode_task = it->get(); |
+ |
+ // Skip if already decoded. |
+ if (decode_task->HasCompleted()) |
+ continue; |
+ |
+ raster_node->add_dependency(); |
+ |
+ // Check if decode task already exists in graph. |
+ GraphNodeMap::iterator decode_it = graph->find(decode_task); |
+ if (decode_it != graph->end()) { |
+ internal::GraphNode* decode_node = decode_it->second; |
+ decode_node->add_dependent(raster_node); |
+ continue; |
+ } |
+ |
+ internal::GraphNode* decode_node = CreateGraphNodeForTask( |
+ decode_task, priority, graph); |
+ decode_node->add_dependent(raster_node); |
+ } |
+ |
+ return raster_node; |
} |
} // namespace cc |