| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/browser/renderer_host/render_widget_resize_helper_mac.h" | 5 #include "ui/accelerated_widget_mac/window_resize_helper_mac.h" |
| 6 | 6 |
| 7 #include <list> | 7 #include <list> |
| 8 | 8 |
| 9 #include "content/browser/gpu/gpu_process_host_ui_shim.h" | 9 #include "base/bind.h" |
| 10 #include "content/browser/renderer_host/render_process_host_impl.h" | 10 #include "base/callback.h" |
| 11 #include "content/public/browser/browser_thread.h" | 11 #include "base/single_thread_task_runner.h" |
| 12 #include "base/synchronization/lock.h" |
| 13 #include "base/synchronization/waitable_event.h" |
| 14 #include "base/threading/thread_restrictions.h" |
| 12 | 15 |
| 13 namespace content { | 16 namespace ui { |
| 14 namespace { | 17 namespace { |
| 15 | 18 |
| 16 class WrappedTask; | 19 class WrappedTask; |
| 17 class PumpableTaskRunner; | 20 class PumpableTaskRunner; |
| 18 typedef std::list<WrappedTask*> WrappedTaskQueue; | 21 typedef std::list<WrappedTask*> WrappedTaskQueue; |
| 19 typedef base::Callback<void(base::WaitableEvent*, base::TimeDelta)> | 22 typedef base::Callback<void(base::WaitableEvent*, base::TimeDelta)> |
| 20 EventTimedWaitCallback; | 23 EventTimedWaitCallback; |
| 21 | 24 |
| 22 // A wrapper for IPCs and tasks that we may potentially execute in | 25 // A wrapper for IPCs and tasks that we may potentially execute in |
| 23 // WaitForSingleTaskToRun. Because these tasks are sent to two places to run, | 26 // WaitForSingleTaskToRun. Because these tasks are sent to two places to run, |
| (...skipping 22 matching lines...) Expand all Loading... |
| 46 DISALLOW_COPY_AND_ASSIGN(WrappedTask); | 49 DISALLOW_COPY_AND_ASSIGN(WrappedTask); |
| 47 }; | 50 }; |
| 48 | 51 |
| 49 // The PumpableTaskRunner is a task runner that will wrap tasks in an | 52 // The PumpableTaskRunner is a task runner that will wrap tasks in an |
| 50 // WrappedTask, enqueues that wrapped task in the queue to be pumped via | 53 // WrappedTask, enqueues that wrapped task in the queue to be pumped via |
| 51 // WaitForSingleWrappedTaskToRun during resizes, and posts the task to a | 54 // WaitForSingleWrappedTaskToRun during resizes, and posts the task to a |
| 52 // target task runner. The posted task will run only once, either through a | 55 // target task runner. The posted task will run only once, either through a |
| 53 // WaitForSingleWrappedTaskToRun call or through the target task runner. | 56 // WaitForSingleWrappedTaskToRun call or through the target task runner. |
| 54 class PumpableTaskRunner : public base::SingleThreadTaskRunner { | 57 class PumpableTaskRunner : public base::SingleThreadTaskRunner { |
| 55 public: | 58 public: |
| 56 explicit PumpableTaskRunner( | 59 PumpableTaskRunner( |
| 57 const EventTimedWaitCallback& event_timed_wait_callback); | 60 const EventTimedWaitCallback& event_timed_wait_callback, |
| 61 const scoped_refptr<base::SingleThreadTaskRunner>& target_task_runner); |
| 58 | 62 |
| 59 // Enqueue WrappedTask and post it to |target_task_runner_|. | 63 // Enqueue WrappedTask and post it to |target_task_runner_|. |
| 60 bool EnqueueAndPostWrappedTask(const tracked_objects::Location& from_here, | 64 bool EnqueueAndPostWrappedTask(const tracked_objects::Location& from_here, |
| 61 WrappedTask* task, | 65 WrappedTask* task, |
| 62 base::TimeDelta delay); | 66 base::TimeDelta delay); |
| 63 | 67 |
| 64 // Wait at most |max_delay| to run an enqueued task. | 68 // Wait at most |max_delay| to run an enqueued task. |
| 65 bool WaitForSingleWrappedTaskToRun(const base::TimeDelta& max_delay); | 69 bool WaitForSingleWrappedTaskToRun(const base::TimeDelta& max_delay); |
| 66 | 70 |
| 67 // Remove a wrapped task from the queue. | |
| 68 void RemoveWrappedTaskFromQueue(WrappedTask* task); | |
| 69 | |
| 70 // base::SingleThreadTaskRunner implementation: | 71 // base::SingleThreadTaskRunner implementation: |
| 71 bool PostDelayedTask(const tracked_objects::Location& from_here, | 72 bool PostDelayedTask(const tracked_objects::Location& from_here, |
| 72 const base::Closure& task, | 73 const base::Closure& task, |
| 73 base::TimeDelta delay) override; | 74 base::TimeDelta delay) override; |
| 74 | 75 |
| 75 bool PostNonNestableDelayedTask(const tracked_objects::Location& from_here, | 76 bool PostNonNestableDelayedTask(const tracked_objects::Location& from_here, |
| 76 const base::Closure& task, | 77 const base::Closure& task, |
| 77 base::TimeDelta delay) override; | 78 base::TimeDelta delay) override; |
| 78 | 79 |
| 79 bool RunsTasksOnCurrentThread() const override; | 80 bool RunsTasksOnCurrentThread() const override; |
| (...skipping 16 matching lines...) Expand all Loading... |
| 96 base::WaitableEvent event_; | 97 base::WaitableEvent event_; |
| 97 | 98 |
| 98 // Callback to call TimedWait on |event_| from an appropriate class. | 99 // Callback to call TimedWait on |event_| from an appropriate class. |
| 99 EventTimedWaitCallback event_timed_wait_callback_; | 100 EventTimedWaitCallback event_timed_wait_callback_; |
| 100 | 101 |
| 101 scoped_refptr<base::SingleThreadTaskRunner> target_task_runner_; | 102 scoped_refptr<base::SingleThreadTaskRunner> target_task_runner_; |
| 102 | 103 |
| 103 DISALLOW_COPY_AND_ASSIGN(PumpableTaskRunner); | 104 DISALLOW_COPY_AND_ASSIGN(PumpableTaskRunner); |
| 104 }; | 105 }; |
| 105 | 106 |
| 106 void HandleGpuIPC(int gpu_host_id, const IPC::Message& message) { | 107 base::LazyInstance<WindowResizeHelperMac>::Leaky g_window_resize_helper = |
| 107 GpuProcessHostUIShim* host = GpuProcessHostUIShim::FromID(gpu_host_id); | |
| 108 if (host) | |
| 109 host->OnMessageReceived(message); | |
| 110 } | |
| 111 | |
| 112 void HandleRendererIPC(int render_process_id, const IPC::Message& message) { | |
| 113 RenderProcessHost* host = RenderProcessHost::FromID(render_process_id); | |
| 114 if (host) | |
| 115 host->OnMessageReceived(message); | |
| 116 } | |
| 117 | |
| 118 base::LazyInstance<RenderWidgetResizeHelper> g_render_widget_task_runner = | |
| 119 LAZY_INSTANCE_INITIALIZER; | 108 LAZY_INSTANCE_INITIALIZER; |
| 120 | 109 |
| 121 //////////////////////////////////////////////////////////////////////////////// | 110 //////////////////////////////////////////////////////////////////////////////// |
| 122 // WrappedTask | 111 // WrappedTask |
| 123 | 112 |
| 124 WrappedTask::WrappedTask(const base::Closure& closure, base::TimeDelta delay) | 113 WrappedTask::WrappedTask(const base::Closure& closure, base::TimeDelta delay) |
| 125 : closure_(closure), | 114 : closure_(closure), |
| 126 can_run_time_(base::TimeTicks::Now() + delay), | 115 can_run_time_(base::TimeTicks::Now() + delay), |
| 127 has_run_(false), | 116 has_run_(false), |
| 128 sequence_number_(0) {} | 117 sequence_number_(0) {} |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 174 pumpable_task_runner_->task_queue_.erase(iterator_); | 163 pumpable_task_runner_->task_queue_.erase(iterator_); |
| 175 iterator_ = pumpable_task_runner_->task_queue_.end(); | 164 iterator_ = pumpable_task_runner_->task_queue_.end(); |
| 176 } | 165 } |
| 177 pumpable_task_runner_ = NULL; | 166 pumpable_task_runner_ = NULL; |
| 178 } | 167 } |
| 179 | 168 |
| 180 //////////////////////////////////////////////////////////////////////////////// | 169 //////////////////////////////////////////////////////////////////////////////// |
| 181 // PumpableTaskRunner | 170 // PumpableTaskRunner |
| 182 | 171 |
| 183 PumpableTaskRunner::PumpableTaskRunner( | 172 PumpableTaskRunner::PumpableTaskRunner( |
| 184 const EventTimedWaitCallback& event_timed_wait_callback) | 173 const EventTimedWaitCallback& event_timed_wait_callback, |
| 174 const scoped_refptr<base::SingleThreadTaskRunner>& target_task_runner) |
| 185 : event_(false /* auto-reset */, false /* initially signalled */), | 175 : event_(false /* auto-reset */, false /* initially signalled */), |
| 186 event_timed_wait_callback_(event_timed_wait_callback), | 176 event_timed_wait_callback_(event_timed_wait_callback), |
| 187 target_task_runner_( | 177 target_task_runner_(target_task_runner) {} |
| 188 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI)) {} | |
| 189 | 178 |
| 190 PumpableTaskRunner::~PumpableTaskRunner() { | 179 PumpableTaskRunner::~PumpableTaskRunner() { |
| 191 // Because tasks hold a reference to the task runner, the task queue must | 180 // Because tasks hold a reference to the task runner, the task queue must |
| 192 // be empty when it is destroyed. | 181 // be empty when it is destroyed. |
| 193 DCHECK(task_queue_.empty()); | 182 DCHECK(task_queue_.empty()); |
| 194 } | 183 } |
| 195 | 184 |
| 196 bool PumpableTaskRunner::WaitForSingleWrappedTaskToRun( | 185 bool PumpableTaskRunner::WaitForSingleWrappedTaskToRun( |
| 197 const base::TimeDelta& max_delay) { | 186 const base::TimeDelta& max_delay) { |
| 198 base::TimeTicks stop_waiting_time = base::TimeTicks::Now() + max_delay; | 187 base::TimeTicks stop_waiting_time = base::TimeTicks::Now() + max_delay; |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 282 return false; | 271 return false; |
| 283 } | 272 } |
| 284 | 273 |
| 285 bool PumpableTaskRunner::RunsTasksOnCurrentThread() const { | 274 bool PumpableTaskRunner::RunsTasksOnCurrentThread() const { |
| 286 return target_task_runner_->RunsTasksOnCurrentThread(); | 275 return target_task_runner_->RunsTasksOnCurrentThread(); |
| 287 } | 276 } |
| 288 | 277 |
| 289 } // namespace | 278 } // namespace |
| 290 | 279 |
| 291 //////////////////////////////////////////////////////////////////////////////// | 280 //////////////////////////////////////////////////////////////////////////////// |
| 292 // RenderWidgetResizeHelper | 281 // WindowResizeHelperMac |
| 293 | 282 |
| 294 scoped_refptr<base::SingleThreadTaskRunner> | 283 scoped_refptr<base::SingleThreadTaskRunner> WindowResizeHelperMac::task_runner() |
| 295 RenderWidgetResizeHelper::task_runner() const { | 284 const { |
| 296 return task_runner_; | 285 return task_runner_; |
| 297 } | 286 } |
| 298 | 287 |
| 299 // static | 288 // static |
| 300 RenderWidgetResizeHelper* RenderWidgetResizeHelper::Get() { | 289 WindowResizeHelperMac* WindowResizeHelperMac::Get() { |
| 301 return g_render_widget_task_runner.Pointer(); | 290 return g_window_resize_helper.Pointer(); |
| 302 } | 291 } |
| 303 | 292 |
| 304 bool RenderWidgetResizeHelper::WaitForSingleTaskToRun( | 293 void WindowResizeHelperMac::Init( |
| 294 const scoped_refptr<base::SingleThreadTaskRunner>& target_task_runner) { |
| 295 DCHECK(!task_runner_); |
| 296 task_runner_ = new PumpableTaskRunner( |
| 297 base::Bind(&WindowResizeHelperMac::EventTimedWait), target_task_runner); |
| 298 } |
| 299 |
| 300 bool WindowResizeHelperMac::WaitForSingleTaskToRun( |
| 305 const base::TimeDelta& max_delay) { | 301 const base::TimeDelta& max_delay) { |
| 306 PumpableTaskRunner* pumpable_task_runner = | 302 PumpableTaskRunner* pumpable_task_runner = |
| 307 reinterpret_cast<PumpableTaskRunner*>(task_runner_.get()); | 303 static_cast<PumpableTaskRunner*>(task_runner_.get()); |
| 304 if (!pumpable_task_runner) |
| 305 return false; |
| 308 return pumpable_task_runner->WaitForSingleWrappedTaskToRun(max_delay); | 306 return pumpable_task_runner->WaitForSingleWrappedTaskToRun(max_delay); |
| 309 } | 307 } |
| 310 | 308 |
| 311 void RenderWidgetResizeHelper::PostRendererProcessMsg(int render_process_id, | 309 WindowResizeHelperMac::WindowResizeHelperMac() {} |
| 312 const IPC::Message& msg) { | 310 WindowResizeHelperMac::~WindowResizeHelperMac() {} |
| 313 PumpableTaskRunner* pumpable_task_runner = | |
| 314 reinterpret_cast<PumpableTaskRunner*>(task_runner_.get()); | |
| 315 pumpable_task_runner->EnqueueAndPostWrappedTask( | |
| 316 FROM_HERE, | |
| 317 new WrappedTask(base::Bind(HandleRendererIPC, render_process_id, msg), | |
| 318 base::TimeDelta()), | |
| 319 base::TimeDelta()); | |
| 320 } | |
| 321 | 311 |
| 322 void RenderWidgetResizeHelper::PostGpuProcessMsg(int gpu_host_id, | 312 void WindowResizeHelperMac::EventTimedWait(base::WaitableEvent* event, |
| 323 const IPC::Message& msg) { | 313 base::TimeDelta delay) { |
| 324 PumpableTaskRunner* pumpable_task_runner = | |
| 325 reinterpret_cast<PumpableTaskRunner*>(task_runner_.get()); | |
| 326 pumpable_task_runner->EnqueueAndPostWrappedTask( | |
| 327 FROM_HERE, new WrappedTask(base::Bind(HandleGpuIPC, gpu_host_id, msg), | |
| 328 base::TimeDelta()), | |
| 329 base::TimeDelta()); | |
| 330 } | |
| 331 | |
| 332 RenderWidgetResizeHelper::RenderWidgetResizeHelper() { | |
| 333 task_runner_ = new PumpableTaskRunner(base::Bind(&EventTimedWait)); | |
| 334 } | |
| 335 | |
| 336 RenderWidgetResizeHelper::~RenderWidgetResizeHelper() {} | |
| 337 | |
| 338 // static | |
| 339 void RenderWidgetResizeHelper::EventTimedWait(base::WaitableEvent* event, | |
| 340 base::TimeDelta delay) { | |
| 341 base::ThreadRestrictions::ScopedAllowWait allow_wait; | 314 base::ThreadRestrictions::ScopedAllowWait allow_wait; |
| 342 event->TimedWait(delay); | 315 event->TimedWait(delay); |
| 343 } | 316 } |
| 344 | 317 |
| 345 } // namespace content | 318 } // namespace ui |
| OLD | NEW |