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

Unified Diff: cc/raster_worker_pool.cc

Issue 12079028: cc: Fix RasterWorkerPool shutdown crash. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 11 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
« no previous file with comments | « cc/raster_worker_pool.h ('k') | cc/tile_manager.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: cc/raster_worker_pool.cc
diff --git a/cc/raster_worker_pool.cc b/cc/raster_worker_pool.cc
index cc10956af08b8654de5410b075d44a1a3cfbbd58..8eb92c209da3d368877d8bd47222ebf6c7b56948 100644
--- a/cc/raster_worker_pool.cc
+++ b/cc/raster_worker_pool.cc
@@ -75,11 +75,11 @@ RasterWorkerPool::Thread::Task::~Task() {
RasterWorkerPool::Thread::Thread(const std::string name)
: base::Thread(name.c_str()),
num_pending_tasks_(0) {
- Start();
}
RasterWorkerPool::Thread::~Thread() {
Stop();
+ DCHECK_EQ(num_pending_tasks_, 0);
}
void RasterWorkerPool::Thread::Init() {
@@ -90,7 +90,9 @@ void RasterWorkerPool::Thread::Init() {
#endif
}
-RasterWorkerPool::RasterWorkerPool(size_t num_raster_threads) {
+RasterWorkerPool::RasterWorkerPool(size_t num_raster_threads)
+ : is_running_(false),
+ raster_threads_need_sorting_(false) {
const std::string thread_name_prefix = kRasterThreadNamePrefix;
while (raster_threads_.size() < num_raster_threads) {
int thread_number = raster_threads_.size() + 1;
@@ -101,10 +103,39 @@ RasterWorkerPool::RasterWorkerPool(size_t num_raster_threads) {
}
RasterWorkerPool::~RasterWorkerPool() {
+ Stop();
STLDeleteElements(&raster_threads_);
}
+bool RasterWorkerPool::Start() {
+ for (ThreadVector::iterator it = raster_threads_.begin();
+ it != raster_threads_.end(); it++) {
+ Thread* thread = *it;
+ if (!thread->Start())
+ return false;
+ }
+
+ is_running_ = true;
+ return true;
+}
+
+void RasterWorkerPool::Stop() {
+ if (!is_running_)
+ return;
+
+ for (ThreadVector::iterator it = raster_threads_.begin();
+ it != raster_threads_.end(); it++) {
+ Thread* thread = *it;
+ thread->Stop();
+ }
+
+ is_running_ = false;
+}
+
bool RasterWorkerPool::IsBusy() {
+ DCHECK(is_running_);
+ SortRasterThreadsIfNeeded();
+
Thread* thread = raster_threads_.front();
return thread->num_pending_tasks() >= kNumPendingRasterTasksPerThread;
}
@@ -114,6 +145,7 @@ void RasterWorkerPool::PostRasterTaskAndReply(PicturePileImpl* picture_pile,
const gfx::Rect& rect,
float contents_scale,
const base::Closure& reply) {
+ CHECK(is_running_);
Thread::Task* task = CreateTask();
scoped_refptr<PicturePileImpl> picture_pile_clone =
@@ -137,6 +169,7 @@ void RasterWorkerPool::PostRasterTaskAndReply(PicturePileImpl* picture_pile,
void RasterWorkerPool::PostImageDecodeTaskAndReply(
skia::LazyPixelRef* pixel_ref,
const base::Closure& reply) {
+ CHECK(is_running_);
Thread::Task* task = CreateTask();
task->thread_->message_loop_proxy()->PostTaskAndReply(
@@ -172,15 +205,13 @@ RasterWorkerPool::Thread::Task* RasterWorkerPool::CreateTask() {
DCHECK(thread->num_pending_tasks() < kNumPendingRasterTasksPerThread);
scoped_ptr<Thread::Task> task(new Thread::Task(thread));
- std::sort(raster_threads_.begin(), raster_threads_.end(),
- PendingTaskComparator());
+ raster_threads_need_sorting_ = true;
return task.release();
}
void RasterWorkerPool::DestroyTask(Thread::Task* task) {
delete task;
- std::sort(raster_threads_.begin(), raster_threads_.end(),
- PendingTaskComparator());
+ raster_threads_need_sorting_ = true;
}
void RasterWorkerPool::OnTaskCompleted(
@@ -196,4 +227,13 @@ void RasterWorkerPool::OnRasterTaskCompleted(
OnTaskCompleted(task, reply);
}
+void RasterWorkerPool::SortRasterThreadsIfNeeded() {
+ if (!raster_threads_need_sorting_)
nduca 2013/01/29 00:13:08 Out of curiosity, what does this do?
reveman 2013/01/29 02:49:54 Rather than having iterate over all threads both w
+ return;
+
+ std::sort(raster_threads_.begin(), raster_threads_.end(),
+ PendingTaskComparator());
+ raster_threads_need_sorting_ = false;
+}
+
} // namespace cc
« no previous file with comments | « cc/raster_worker_pool.h ('k') | cc/tile_manager.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698