Index: gpu/command_buffer/service/in_process_command_buffer.cc |
diff --git a/gpu/command_buffer/service/in_process_command_buffer.cc b/gpu/command_buffer/service/in_process_command_buffer.cc |
index c3123457f64ff1c42bbffcef368c49d86ba3f149..7f4276f027731a259b2cf7b8e2f7e09b76475297 100644 |
--- a/gpu/command_buffer/service/in_process_command_buffer.cc |
+++ b/gpu/command_buffer/service/in_process_command_buffer.cc |
@@ -82,13 +82,22 @@ class GpuInProcessThread |
private: |
~GpuInProcessThread() override; |
+ |
+ void CheckIdleTasksLocked(); |
+ void RunIdleTask(); |
+ |
friend class base::RefCountedThreadSafe<GpuInProcessThread>; |
scoped_refptr<gpu::gles2::ShaderTranslatorCache> shader_translator_cache_; |
+ |
+ base::Lock lock_; |
+ bool idle_post_pending_; |
+ std::queue<base::Closure> pending_idle_tasks_; |
DISALLOW_COPY_AND_ASSIGN(GpuInProcessThread); |
}; |
-GpuInProcessThread::GpuInProcessThread() : base::Thread("GpuThread") { |
+GpuInProcessThread::GpuInProcessThread() |
+ : base::Thread("GpuThread"), idle_post_pending_(false) { |
Start(); |
} |
@@ -101,8 +110,34 @@ void GpuInProcessThread::ScheduleTask(const base::Closure& task) { |
} |
void GpuInProcessThread::ScheduleIdleWork(const base::Closure& callback) { |
- message_loop()->PostDelayedTask( |
- FROM_HERE, callback, base::TimeDelta::FromMilliseconds(5)); |
+ base::AutoLock lock(lock_); |
+ pending_idle_tasks_.push(callback); |
+ CheckIdleTasksLocked(); |
+} |
+ |
+void GpuInProcessThread::CheckIdleTasksLocked() { |
+ lock_.AssertAcquired(); |
+ if (pending_idle_tasks_.size() && !idle_post_pending_) { |
+ idle_post_pending_ = true; |
+ message_loop()->PostTask( |
+ FROM_HERE, base::Bind(&GpuInProcessThread::RunIdleTask, this)); |
+ } |
+} |
+ |
+void GpuInProcessThread::RunIdleTask() { |
+ base::Closure idle_task; |
+ base::AutoLock lock(lock_); |
+ idle_post_pending_ = false; |
+ DCHECK(pending_idle_tasks_.size()); |
+ idle_task = pending_idle_tasks_.front(); |
+ pending_idle_tasks_.pop(); |
+ |
+ { |
+ base::AutoUnlock unlock(lock_); |
+ idle_task.Run(); |
+ } |
+ |
+ CheckIdleTasksLocked(); |
} |
scoped_refptr<gles2::ShaderTranslatorCache> |