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

Unified Diff: cc/worker_pool.h

Issue 12217105: cc: Check for completed raster tasks at interval. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: confine polling to inside worker pool Created 7 years, 10 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 side-by-side diff with in-line comments
Download patch
Index: cc/worker_pool.h
diff --git a/cc/worker_pool.h b/cc/worker_pool.h
index f47dd70b9981b23af18184c6c3f0ea911b051c12..d6e91587ae51a00bda5a10a0dc8ad653a701dab0 100644
--- a/cc/worker_pool.h
+++ b/cc/worker_pool.h
@@ -9,6 +9,7 @@
#include "base/basictypes.h"
#include "base/callback.h"
+#include "base/cancelable_callback.h"
#include "base/memory/scoped_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/threading/thread.h"
@@ -24,12 +25,16 @@ class WorkerPoolTask {
virtual void Run(RenderingStats* rendering_stats) = 0;
- void Completed();
+ bool IsPending();
nduca 2013/02/13 08:29:32 Can you say HasCompleted? So we dont mix completed
reveman 2013/02/13 08:46:38 Done.
+ void Completed(bool more_tasks_completed);
protected:
- WorkerPoolTask(const base::Closure& reply);
+ WorkerPoolTask(const base::Callback<void(bool)>& reply);
- base::Closure reply_;
+ base::Callback<void(bool)> reply_;
+
+ // Accessed from multiple threads. Set to 1 when task has completed.
+ base::subtle::Atomic32 completed_;
};
} // namespace internal
@@ -39,6 +44,7 @@ class WorkerPoolTask {
class WorkerPool {
public:
typedef base::Callback<void(RenderingStats*)> Callback;
+ typedef base::Callback<void(bool)> Reply;
virtual ~WorkerPool();
@@ -52,11 +58,7 @@ class WorkerPool {
// Posts |task| to worker pool. On completion, |reply|
// is posted to the thread that called PostTaskAndReply().
- void PostTaskAndReply(const Callback& task, const base::Closure& reply);
-
- // Returns true when worker pool has reached its internal limit for number
- // of pending tasks.
nduca 2013/02/13 08:29:32 I wonder, can you shift the raster throttle stuff
reveman 2013/02/13 08:46:38 my current throttle values are derived from the kM
- bool IsBusy();
+ void PostTaskAndReply(const Callback& task, const Reply& reply);
// Toggle rendering stats collection.
void SetRecordRenderingStats(bool record_rendering_stats);
@@ -76,6 +78,9 @@ class WorkerPool {
// Posts a task to the worker thread.
void PostTask(scoped_ptr<internal::WorkerPoolTask> task);
+ // Check for completed tasks and run reply callbacks.
+ void CheckForCompletedTasks();
+
int num_pending_tasks() const { return pending_tasks_.size(); }
void set_record_rendering_stats(bool record_rendering_stats) {
record_rendering_stats_ = record_rendering_stats;
@@ -89,12 +94,13 @@ class WorkerPool {
private:
static void RunTask(
- internal::WorkerPoolTask* task, RenderingStats* rendering_stats);
+ internal::WorkerPoolTask* task,
+ WorkerPool* worker_pool,
+ RenderingStats* rendering_stats);
void OnTaskCompleted();
WorkerPool* worker_pool_;
- base::WeakPtrFactory<Worker> weak_ptr_factory_;
ScopedPtrDeque<internal::WorkerPoolTask> pending_tasks_;
scoped_ptr<RenderingStats> rendering_stats_;
bool record_rendering_stats_;
@@ -112,13 +118,43 @@ class WorkerPool {
}
};
- void DidNumPendingTasksChange();
+ // Schedule a completed tasks check if not already pending.
+ void ScheduleCheckForCompletedTasks();
+
+ // Called on origin thread before posting task to worker.
+ void WillPostWorkTask();
+
+ // Called on worker thread after completing work.
+ void OnWorkCompletedOnWorkerThread();
+
+ // Called on origin thread after becoming idle.
+ void OnIdle();
+
+ // Check for completed tasks and run reply callbacks.
+ void CheckForCompletedTasks();
+
+ // Called when processing task completion.
+ void OnTaskCompleted();
+
+ // Returns true when work has completed in worker thread but
+ // task completion has not yet been processed.
+ bool MoreTasksCompleted();
+
+ // Ensure workers are sorted by number of pending tasks.
void SortWorkersIfNeeded();
typedef std::vector<Worker*> WorkerVector;
WorkerVector workers_;
+ scoped_refptr<base::MessageLoopProxy> origin_loop_;
+ base::WeakPtrFactory<WorkerPool> weak_ptr_factory_;
bool workers_need_sorting_;
+ int task_count_;
bool shutdown_;
+ base::CancelableClosure check_for_completed_tasks_callback_;
+ bool check_for_completed_tasks_pending_;
+ base::Closure idle_callback_;
+ // Accessed from multiple threads. 0 when worker pool is idle.
+ base::subtle::Atomic32 work_count_;
nduca 2013/02/13 08:29:32 better name
DISALLOW_COPY_AND_ASSIGN(WorkerPool);
};

Powered by Google App Engine
This is Rietveld 408576698