Index: cc/resources/raster_worker_pool_unittest.cc |
diff --git a/cc/resources/raster_worker_pool_unittest.cc b/cc/resources/raster_worker_pool_unittest.cc |
index faa0cf7c7fd2a0512005ab79df46c1047571fdb9..2edc9c0ed4ac62b462d436256c6b26bf3eb019e3 100644 |
--- a/cc/resources/raster_worker_pool_unittest.cc |
+++ b/cc/resources/raster_worker_pool_unittest.cc |
@@ -70,6 +70,39 @@ class TestRasterWorkerPoolTaskImpl : public internal::RasterWorkerPoolTask { |
DISALLOW_COPY_AND_ASSIGN(TestRasterWorkerPoolTaskImpl); |
}; |
+class BlockingRasterWorkerPoolTaskImpl : public TestRasterWorkerPoolTaskImpl { |
+ public: |
+ BlockingRasterWorkerPoolTaskImpl(const Resource* resource, |
+ const Reply& reply, |
+ base::Lock* lock, |
+ TaskVector* dependencies, |
+ bool use_gpu_rasterization) |
+ : TestRasterWorkerPoolTaskImpl(resource, |
+ reply, |
+ dependencies, |
+ use_gpu_rasterization), |
+ lock_(lock) {} |
+ |
+ // Overridden from TestRasterWorkerPoolTaskImpl: |
+ virtual bool RunOnWorkerThread(unsigned thread_index, |
+ void* buffer, |
+ gfx::Size size, |
+ int stride) OVERRIDE { |
+ base::AutoLock lock(*lock_); |
+ return TestRasterWorkerPoolTaskImpl::RunOnWorkerThread( |
+ thread_index, buffer, size, stride); |
+ } |
+ virtual void CompleteOnOriginThread() OVERRIDE {} |
+ |
+ protected: |
+ virtual ~BlockingRasterWorkerPoolTaskImpl() {} |
+ |
+ private: |
+ base::Lock* lock_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(BlockingRasterWorkerPoolTaskImpl); |
+}; |
+ |
class RasterWorkerPoolTest : public testing::Test, |
public RasterWorkerPoolClient { |
public: |
@@ -190,6 +223,27 @@ class RasterWorkerPoolTest : public testing::Test, |
use_gpu_rasterization))); |
} |
+ void AppendBlockingTask(unsigned id, base::Lock* lock) { |
+ const gfx::Size size(1, 1); |
+ |
+ scoped_ptr<ScopedResource> resource( |
+ ScopedResource::Create(resource_provider())); |
+ resource->Allocate(size, ResourceProvider::TextureUsageAny, RGBA_8888); |
+ const Resource* const_resource = resource.get(); |
+ |
+ RasterWorkerPool::Task::Set empty; |
+ tasks_.push_back( |
+ RasterWorkerPool::RasterTask(new BlockingRasterWorkerPoolTaskImpl( |
+ const_resource, |
+ base::Bind(&RasterWorkerPoolTest::OnTaskCompleted, |
+ base::Unretained(this), |
+ base::Passed(&resource), |
+ id), |
+ lock, |
+ &empty.tasks_, |
+ false))); |
+ } |
+ |
virtual void OnTaskCompleted( |
scoped_ptr<ScopedResource> resource, |
unsigned id, |
@@ -379,6 +433,40 @@ class RasterWorkerPoolTestFailedMapResource : public RasterWorkerPoolTest { |
PIXEL_BUFFER_AND_IMAGE_TEST_F(RasterWorkerPoolTestFailedMapResource); |
+class RasterWorkerPoolTestFalseThrottling : public RasterWorkerPoolTest { |
+ public: |
+ // Overridden from RasterWorkerPoolTest: |
+ virtual void BeginTest() OVERRIDE { |
+ // This test checks that replacing a pending raster task with another does |
+ // not prevent the DidFinishRunningTasks notification from being sent. |
+ |
+ // Schedule a task that is prevented from completing with a lock. |
+ lock_.Acquire(); |
+ AppendBlockingTask(0u, &lock_); |
+ ScheduleTasks(); |
+ |
+ // Schedule another task to replace the still-pending task. Because the old |
+ // task is not a throttled task in the new task set, it should not prevent |
+ // DidFinishRunningTasks from getting signaled. |
+ tasks_.clear(); |
+ AppendTask(1u, false); |
+ ScheduleTasks(); |
+ |
+ // Unblock the first task to allow the second task to complete. |
+ lock_.Release(); |
+ } |
+ |
+ virtual void AfterTest() OVERRIDE {} |
+ |
+ virtual void DidFinishRunningTasks() OVERRIDE { |
+ EndTest(); |
+ } |
+ |
+ base::Lock lock_; |
+}; |
+ |
+PIXEL_BUFFER_AND_IMAGE_TEST_F(RasterWorkerPoolTestFalseThrottling); |
+ |
} // namespace |
} // namespace cc |