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 |