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

Side by Side Diff: chrome/renderer/webworker_proxy.cc

Issue 151125: Fix the GC of workers. When Worker object is GC'ed in the renderer, we need t... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 11 years, 5 months 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 | « chrome/renderer/webworker_proxy.h ('k') | webkit/glue/webworker_impl.h » ('j') | 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) 2009 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2009 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 "chrome/renderer/webworker_proxy.h" 5 #include "chrome/renderer/webworker_proxy.h"
6 6
7 #include "chrome/common/child_thread.h" 7 #include "chrome/common/child_thread.h"
8 #include "chrome/common/render_messages.h" 8 #include "chrome/common/render_messages.h"
9 #include "chrome/common/worker_messages.h" 9 #include "chrome/common/worker_messages.h"
10 #include "webkit/api/public/WebURL.h" 10 #include "webkit/api/public/WebURL.h"
11 #include "webkit/api/public/WebWorkerClient.h" 11 #include "webkit/api/public/WebWorkerClient.h"
12 12
13 using WebKit::WebString; 13 using WebKit::WebString;
14 using WebKit::WebURL; 14 using WebKit::WebURL;
15 using WebKit::WebWorkerClient; 15 using WebKit::WebWorkerClient;
16 16
17 WebWorkerProxy::WebWorkerProxy( 17 WebWorkerProxy::WebWorkerProxy(
18 WebWorkerClient* client, 18 WebWorkerClient* client,
19 ChildThread* child_thread, 19 ChildThread* child_thread,
20 int render_view_route_id) 20 int render_view_route_id)
21 : route_id_(MSG_ROUTING_NONE), 21 : route_id_(MSG_ROUTING_NONE),
22 child_thread_(child_thread), 22 child_thread_(child_thread),
23 render_view_route_id_(render_view_route_id), 23 render_view_route_id_(render_view_route_id),
24 client_(client) { 24 client_(client) {
25 } 25 }
26 26
27 WebWorkerProxy::~WebWorkerProxy() { 27 WebWorkerProxy::~WebWorkerProxy() {
28 if (queued_messages_.empty()) 28 Disconnect();
29 return;
30 29
31 for (size_t i = 0; i < queued_messages_.size(); ++i) 30 for (size_t i = 0; i < queued_messages_.size(); ++i)
32 delete queued_messages_[i]; 31 delete queued_messages_[i];
32 }
33
34 void WebWorkerProxy::Disconnect() {
35 if (route_id_ == MSG_ROUTING_NONE)
36 return;
37
38 // So the messages from WorkerContext (like WorkerContextDestroyed) do not
39 // come after nobody is listening. Since Worker and WorkerContext can
40 // terminate independently, already sent messages may still be in the pipe.
41 child_thread_->RemoveRoute(route_id_);
33 42
34 // Tell the browser to not start our queued worker. 43 // Tell the browser to not start our queued worker.
35 if (route_id_ != MSG_ROUTING_NONE) 44 if (!queued_messages_.empty())
36 child_thread_->Send(new ViewHostMsg_CancelCreateDedicatedWorker(route_id_)); 45 child_thread_->Send(new ViewHostMsg_CancelCreateDedicatedWorker(route_id_));
46
47 route_id_ = MSG_ROUTING_NONE;
37 } 48 }
38 49
39 void WebWorkerProxy::startWorkerContext( 50 void WebWorkerProxy::startWorkerContext(
40 const WebURL& script_url, 51 const WebURL& script_url,
41 const WebString& user_agent, 52 const WebString& user_agent,
42 const WebString& source_code) { 53 const WebString& source_code) {
43 child_thread_->Send(new ViewHostMsg_CreateDedicatedWorker( 54 child_thread_->Send(new ViewHostMsg_CreateDedicatedWorker(
44 script_url, render_view_route_id_, &route_id_)); 55 script_url, render_view_route_id_, &route_id_));
45 if (route_id_ == MSG_ROUTING_NONE) 56 if (route_id_ == MSG_ROUTING_NONE)
46 return; 57 return;
47 58
48 child_thread_->AddRoute(route_id_, this); 59 child_thread_->AddRoute(route_id_, this);
49 60
50 // We make sure that the start message is the first, since postMessage might 61 // We make sure that the start message is the first, since postMessage might
51 // have already been called. 62 // have already been called.
52 queued_messages_.insert(queued_messages_.begin(), 63 queued_messages_.insert(queued_messages_.begin(),
53 new WorkerMsg_StartWorkerContext( 64 new WorkerMsg_StartWorkerContext(
54 route_id_, script_url, user_agent, source_code)); 65 route_id_, script_url, user_agent, source_code));
55 } 66 }
56 67
57 void WebWorkerProxy::terminateWorkerContext() { 68 void WebWorkerProxy::terminateWorkerContext() {
58 if (route_id_ != MSG_ROUTING_NONE) { 69 if (route_id_ != MSG_ROUTING_NONE) {
59 Send(new WorkerMsg_TerminateWorkerContext(route_id_)); 70 Send(new WorkerMsg_TerminateWorkerContext(route_id_));
60 child_thread_->RemoveRoute(route_id_); 71 Disconnect();
61 route_id_ = MSG_ROUTING_NONE;
62 } 72 }
63 } 73 }
64 74
65 void WebWorkerProxy::postMessageToWorkerContext( 75 void WebWorkerProxy::postMessageToWorkerContext(
66 const WebString& message) { 76 const WebString& message) {
67 Send(new WorkerMsg_PostMessageToWorkerContext(route_id_, message)); 77 Send(new WorkerMsg_PostMessageToWorkerContext(route_id_, message));
68 } 78 }
69 79
70 void WebWorkerProxy::workerObjectDestroyed() { 80 void WebWorkerProxy::workerObjectDestroyed() {
71 Send(new WorkerMsg_WorkerObjectDestroyed(route_id_)); 81 Send(new WorkerMsg_WorkerObjectDestroyed(route_id_));
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
120 130
121 void WebWorkerProxy::OnDedicatedWorkerCreated() { 131 void WebWorkerProxy::OnDedicatedWorkerCreated() {
122 DCHECK(queued_messages_.size()); 132 DCHECK(queued_messages_.size());
123 std::vector<IPC::Message*> queued_messages = queued_messages_; 133 std::vector<IPC::Message*> queued_messages = queued_messages_;
124 queued_messages_.clear(); 134 queued_messages_.clear();
125 for (size_t i = 0; i < queued_messages.size(); ++i) { 135 for (size_t i = 0; i < queued_messages.size(); ++i) {
126 queued_messages[i]->set_routing_id(route_id_); 136 queued_messages[i]->set_routing_id(route_id_);
127 Send(queued_messages[i]); 137 Send(queued_messages[i]);
128 } 138 }
129 } 139 }
OLDNEW
« no previous file with comments | « chrome/renderer/webworker_proxy.h ('k') | webkit/glue/webworker_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698