| 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
|
|
|