Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(138)

Side by Side Diff: content/browser/renderer_host/render_widget_helper.cc

Issue 8872038: Remove custom Task implementation from RenderWidgetHelper::UpdateMsgProxy. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Update comment. Created 9 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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_helper.h" 5 #include "content/browser/renderer_host/render_widget_helper.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/bind_helpers.h"
8 #include "base/eintr_wrapper.h" 9 #include "base/eintr_wrapper.h"
9 #include "base/threading/thread.h" 10 #include "base/threading/thread.h"
10 #include "content/browser/renderer_host/render_process_host_impl.h" 11 #include "content/browser/renderer_host/render_process_host_impl.h"
11 #include "content/browser/renderer_host/render_view_host.h" 12 #include "content/browser/renderer_host/render_view_host.h"
12 #include "content/browser/renderer_host/resource_dispatcher_host.h" 13 #include "content/browser/renderer_host/resource_dispatcher_host.h"
13 #include "content/common/view_messages.h" 14 #include "content/common/view_messages.h"
14 #include "content/public/browser/browser_thread.h" 15 #include "content/public/browser/browser_thread.h"
15 16
16 using content::BrowserThread; 17 using content::BrowserThread;
17 18
18 // A Task used with InvokeLater that we hold a pointer to in pending_paints_. 19 // A helper used with DidReceiveUpdateMsg that we hold a pointer to in
19 // Instances are deleted by MessageLoop after it calls their Run method. 20 // pending_paints_.
20 class RenderWidgetHelper::UpdateMsgProxy : public Task { 21 class RenderWidgetHelper::UpdateMsgProxy {
21 public: 22 public:
22 UpdateMsgProxy(RenderWidgetHelper* h, const IPC::Message& m) 23 UpdateMsgProxy(RenderWidgetHelper* h, const IPC::Message& m);
23 : helper(h), 24 ~UpdateMsgProxy();
24 message(m), 25 void Run();
25 cancelled(false) { 26 void Cancel() { cancelled_ = true; }
26 }
27 27
28 ~UpdateMsgProxy() { 28 const IPC::Message& message() const { return message_; }
29 // If the paint message was never dispatched, then we need to let the
30 // helper know that we are going away.
31 if (!cancelled && helper)
32 helper->OnDiscardUpdateMsg(this);
33 }
34 29
35 virtual void Run() { 30 private:
36 if (!cancelled) { 31 scoped_refptr<RenderWidgetHelper> helper_;
37 helper->OnDispatchUpdateMsg(this); 32 IPC::Message message_;
38 helper = NULL; 33 bool cancelled_; // If true, then the message will not be dispatched.
39 }
40 }
41
42 scoped_refptr<RenderWidgetHelper> helper;
43 IPC::Message message;
44 bool cancelled; // If true, then the message will not be dispatched.
45 34
46 DISALLOW_COPY_AND_ASSIGN(UpdateMsgProxy); 35 DISALLOW_COPY_AND_ASSIGN(UpdateMsgProxy);
47 }; 36 };
48 37
38 RenderWidgetHelper::UpdateMsgProxy::UpdateMsgProxy(
39 RenderWidgetHelper* h, const IPC::Message& m)
40 : helper_(h), message_(m), cancelled_(false) {
brettw 2011/12/10 00:01:55 Initializers should go on separate lines
41 }
42
43 RenderWidgetHelper::UpdateMsgProxy::~UpdateMsgProxy() {
44 // If the paint message was never dispatched, then we need to let the
45 // helper know that we are going away.
46 if (!cancelled_ && helper_)
47 helper_->OnDiscardUpdateMsg(this);
48 }
49
50 void RenderWidgetHelper::UpdateMsgProxy::Run() {
51 if (!cancelled_) {
52 helper_->OnDispatchUpdateMsg(this);
53 helper_ = NULL;
54 }
55 }
56
49 RenderWidgetHelper::RenderWidgetHelper() 57 RenderWidgetHelper::RenderWidgetHelper()
50 : render_process_id_(-1), 58 : render_process_id_(-1),
51 #if defined(OS_WIN) 59 #if defined(OS_WIN)
52 event_(CreateEvent(NULL, FALSE /* auto-reset */, FALSE, NULL)), 60 event_(CreateEvent(NULL, FALSE /* auto-reset */, FALSE, NULL)),
53 #elif defined(OS_POSIX) 61 #elif defined(OS_POSIX)
54 event_(false /* auto-reset */, false), 62 event_(false /* auto-reset */, false),
55 #endif 63 #endif
56 resource_dispatcher_host_(NULL) { 64 resource_dispatcher_host_(NULL) {
57 } 65 }
58 66
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
106 UpdateMsgProxy* proxy = NULL; 114 UpdateMsgProxy* proxy = NULL;
107 { 115 {
108 base::AutoLock lock(pending_paints_lock_); 116 base::AutoLock lock(pending_paints_lock_);
109 117
110 UpdateMsgProxyMap::iterator it = pending_paints_.find(render_widget_id); 118 UpdateMsgProxyMap::iterator it = pending_paints_.find(render_widget_id);
111 if (it != pending_paints_.end()) { 119 if (it != pending_paints_.end()) {
112 proxy = it->second; 120 proxy = it->second;
113 121
114 // Flag the proxy as cancelled so that when it is run as a task it will 122 // Flag the proxy as cancelled so that when it is run as a task it will
115 // do nothing. 123 // do nothing.
116 proxy->cancelled = true; 124 proxy->Cancel();
117 125
118 pending_paints_.erase(it); 126 pending_paints_.erase(it);
119 } 127 }
120 } 128 }
121 129
122 if (proxy) { 130 if (proxy) {
123 *msg = proxy->message; 131 *msg = proxy->message();
124 DCHECK(msg->routing_id() == render_widget_id); 132 DCHECK(msg->routing_id() == render_widget_id);
125 return true; 133 return true;
126 } 134 }
127 135
128 // Calculate the maximum amount of time that we are willing to sleep. 136 // Calculate the maximum amount of time that we are willing to sleep.
129 base::TimeDelta max_sleep_time = 137 base::TimeDelta max_sleep_time =
130 max_delay - (base::TimeTicks::Now() - time_start); 138 max_delay - (base::TimeTicks::Now() - time_start);
131 if (max_sleep_time <= base::TimeDelta::FromMilliseconds(0)) 139 if (max_sleep_time <= base::TimeDelta::FromMilliseconds(0))
132 break; 140 break;
133 141
(...skipping 30 matching lines...) Expand all
164 } 172 }
165 173
166 result.first->second = (proxy = new UpdateMsgProxy(this, msg)); 174 result.first->second = (proxy = new UpdateMsgProxy(this, msg));
167 } 175 }
168 176
169 // Notify anyone waiting on the UI thread that there is a new entry in the 177 // Notify anyone waiting on the UI thread that there is a new entry in the
170 // proxy map. If they don't find the entry they are looking for, then they 178 // proxy map. If they don't find the entry they are looking for, then they
171 // will just continue waiting. 179 // will just continue waiting.
172 event_.Signal(); 180 event_.Signal();
173 181
174 // The proxy will be deleted when it is run as a task. 182 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
175 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, proxy); 183 base::Bind(&UpdateMsgProxy::Run, base::Owned(proxy)));
176 } 184 }
177 185
178 void RenderWidgetHelper::OnDiscardUpdateMsg(UpdateMsgProxy* proxy) { 186 void RenderWidgetHelper::OnDiscardUpdateMsg(UpdateMsgProxy* proxy) {
179 const IPC::Message& msg = proxy->message; 187 const IPC::Message& msg = proxy->message();
180 188
181 // Remove the proxy from the map now that we are going to handle it normally. 189 // Remove the proxy from the map now that we are going to handle it normally.
182 { 190 {
183 base::AutoLock lock(pending_paints_lock_); 191 base::AutoLock lock(pending_paints_lock_);
184 192
185 UpdateMsgProxyMap::iterator it = pending_paints_.find(msg.routing_id()); 193 UpdateMsgProxyMap::iterator it = pending_paints_.find(msg.routing_id());
186 DCHECK(it != pending_paints_.end()); 194 DCHECK(it != pending_paints_.end());
187 DCHECK(it->second == proxy); 195 DCHECK(it->second == proxy);
188 196
189 pending_paints_.erase(it); 197 pending_paints_.erase(it);
190 } 198 }
191 } 199 }
192 200
193 void RenderWidgetHelper::OnDispatchUpdateMsg(UpdateMsgProxy* proxy) { 201 void RenderWidgetHelper::OnDispatchUpdateMsg(UpdateMsgProxy* proxy) {
194 OnDiscardUpdateMsg(proxy); 202 OnDiscardUpdateMsg(proxy);
195 203
196 // It is reasonable for the host to no longer exist. 204 // It is reasonable for the host to no longer exist.
197 content::RenderProcessHost* host = 205 content::RenderProcessHost* host =
198 content::RenderProcessHost::FromID(render_process_id_); 206 content::RenderProcessHost::FromID(render_process_id_);
199 if (host) 207 if (host)
200 host->OnMessageReceived(proxy->message); 208 host->OnMessageReceived(proxy->message());
201 } 209 }
202 210
203 void RenderWidgetHelper::OnCancelResourceRequests( 211 void RenderWidgetHelper::OnCancelResourceRequests(
204 int render_widget_id) { 212 int render_widget_id) {
205 resource_dispatcher_host_->CancelRequestsForRoute( 213 resource_dispatcher_host_->CancelRequestsForRoute(
206 render_process_id_, render_widget_id); 214 render_process_id_, render_widget_id);
207 } 215 }
208 216
209 void RenderWidgetHelper::OnCrossSiteSwapOutACK( 217 void RenderWidgetHelper::OnCrossSiteSwapOutACK(
210 const ViewMsg_SwapOut_Params& params) { 218 const ViewMsg_SwapOut_Params& params) {
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after
350 gfx::PluginWindowHandle RenderWidgetHelper::LookupCompositingSurface( 358 gfx::PluginWindowHandle RenderWidgetHelper::LookupCompositingSurface(
351 int render_widget_id) { 359 int render_widget_id) {
352 base::AutoLock locked(view_compositing_surface_map_lock_); 360 base::AutoLock locked(view_compositing_surface_map_lock_);
353 ViewCompositingSurfaceMap::iterator it = 361 ViewCompositingSurfaceMap::iterator it =
354 view_compositing_surface_map_.find(render_widget_id); 362 view_compositing_surface_map_.find(render_widget_id);
355 if (it == view_compositing_surface_map_.end()) 363 if (it == view_compositing_surface_map_.end())
356 return gfx::kNullPluginWindow; 364 return gfx::kNullPluginWindow;
357 365
358 return it->second; 366 return it->second;
359 } 367 }
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698