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

Side by Side Diff: content/renderer/service_worker/embedded_worker_context_client.cc

Issue 287193011: Clear EmbeddedWorkerContextClient's thread-local ptr in willDestroyWorkerContext() (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fixed todo comment Created 6 years, 7 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 | « 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 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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/renderer/service_worker/embedded_worker_context_client.h" 5 #include "content/renderer/service_worker/embedded_worker_context_client.h"
6 6
7 #include "base/lazy_instance.h" 7 #include "base/lazy_instance.h"
8 #include "base/message_loop/message_loop_proxy.h" 8 #include "base/message_loop/message_loop_proxy.h"
9 #include "base/pickle.h" 9 #include "base/pickle.h"
10 #include "base/threading/thread_local.h" 10 #include "base/threading/thread_local.h"
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
90 service_worker_version_id_(service_worker_version_id), 90 service_worker_version_id_(service_worker_version_id),
91 service_worker_scope_(service_worker_scope), 91 service_worker_scope_(service_worker_scope),
92 script_url_(script_url), 92 script_url_(script_url),
93 worker_devtools_agent_route_id_(worker_devtools_agent_route_id), 93 worker_devtools_agent_route_id_(worker_devtools_agent_route_id),
94 sender_(ChildThread::current()->thread_safe_sender()), 94 sender_(ChildThread::current()->thread_safe_sender()),
95 main_thread_proxy_(base::MessageLoopProxy::current()), 95 main_thread_proxy_(base::MessageLoopProxy::current()),
96 weak_factory_(this) { 96 weak_factory_(this) {
97 } 97 }
98 98
99 EmbeddedWorkerContextClient::~EmbeddedWorkerContextClient() { 99 EmbeddedWorkerContextClient::~EmbeddedWorkerContextClient() {
100 // g_worker_client_tls.Pointer()->Get() could be NULL if this gets
101 // deleted before workerContextStarted() is called.
102 g_worker_client_tls.Pointer()->Set(NULL);
103 } 100 }
104 101
105 bool EmbeddedWorkerContextClient::OnMessageReceived( 102 bool EmbeddedWorkerContextClient::OnMessageReceived(
106 const IPC::Message& msg) { 103 const IPC::Message& msg) {
107 bool handled = true; 104 bool handled = true;
108 IPC_BEGIN_MESSAGE_MAP(EmbeddedWorkerContextClient, msg) 105 IPC_BEGIN_MESSAGE_MAP(EmbeddedWorkerContextClient, msg)
109 IPC_MESSAGE_HANDLER(EmbeddedWorkerContextMsg_MessageToWorker, 106 IPC_MESSAGE_HANDLER(EmbeddedWorkerContextMsg_MessageToWorker,
110 OnMessageToWorker) 107 OnMessageToWorker)
111 IPC_MESSAGE_UNHANDLED(handled = false) 108 IPC_MESSAGE_UNHANDLED(handled = false)
112 IPC_END_MESSAGE_MAP() 109 IPC_END_MESSAGE_MAP()
(...skipping 23 matching lines...) Expand all
136 RenderThreadImpl::current()->embedded_worker_dispatcher()-> 133 RenderThreadImpl::current()->embedded_worker_dispatcher()->
137 WorkerContextDestroyed(embedded_worker_id_); 134 WorkerContextDestroyed(embedded_worker_id_);
138 } 135 }
139 136
140 void EmbeddedWorkerContextClient::workerContextStarted( 137 void EmbeddedWorkerContextClient::workerContextStarted(
141 blink::WebServiceWorkerContextProxy* proxy) { 138 blink::WebServiceWorkerContextProxy* proxy) {
142 DCHECK(!worker_task_runner_); 139 DCHECK(!worker_task_runner_);
143 worker_task_runner_ = new WorkerThreadTaskRunner( 140 worker_task_runner_ = new WorkerThreadTaskRunner(
144 WorkerTaskRunner::Instance()->CurrentWorkerId()); 141 WorkerTaskRunner::Instance()->CurrentWorkerId());
145 DCHECK_NE(0, WorkerTaskRunner::Instance()->CurrentWorkerId()); 142 DCHECK_NE(0, WorkerTaskRunner::Instance()->CurrentWorkerId());
143 // g_worker_client_tls.Pointer()->Get() could return NULL if this context
144 // gets deleted before workerContextStarted() is called.
146 DCHECK(g_worker_client_tls.Pointer()->Get() == NULL); 145 DCHECK(g_worker_client_tls.Pointer()->Get() == NULL);
147 DCHECK(!script_context_); 146 DCHECK(!script_context_);
148 g_worker_client_tls.Pointer()->Set(this); 147 g_worker_client_tls.Pointer()->Set(this);
149 script_context_.reset(new ServiceWorkerScriptContext(this, proxy)); 148 script_context_.reset(new ServiceWorkerScriptContext(this, proxy));
150 149
151 Send(new EmbeddedWorkerHostMsg_WorkerScriptLoaded(embedded_worker_id_)); 150 Send(new EmbeddedWorkerHostMsg_WorkerScriptLoaded(embedded_worker_id_));
152 151
153 // Schedule a task to send back WorkerStarted asynchronously, 152 // Schedule a task to send back WorkerStarted asynchronously,
154 // so that at the time we send it we can be sure that the worker 153 // so that at the time we send it we can be sure that the worker
155 // script has been evaluated and worker run loop has been started. 154 // script has been evaluated and worker run loop has been started.
156 worker_task_runner_->PostTask( 155 worker_task_runner_->PostTask(
157 FROM_HERE, 156 FROM_HERE,
158 base::Bind(&EmbeddedWorkerContextClient::SendWorkerStarted, 157 base::Bind(&EmbeddedWorkerContextClient::SendWorkerStarted,
159 weak_factory_.GetWeakPtr())); 158 weak_factory_.GetWeakPtr()));
160 } 159 }
161 160
162 void EmbeddedWorkerContextClient::willDestroyWorkerContext() { 161 void EmbeddedWorkerContextClient::willDestroyWorkerContext() {
163 // At this point OnWorkerRunLoopStopped is already called, so 162 // At this point OnWorkerRunLoopStopped is already called, so
164 // worker_task_runner_->RunsTasksOnCurrentThread() returns false 163 // worker_task_runner_->RunsTasksOnCurrentThread() returns false
165 // (while we're still on the worker thread). 164 // (while we're still on the worker thread).
166 script_context_.reset(); 165 script_context_.reset();
166
167 // This also lets the message filter stop dispatching messages to
168 // this client.
169 g_worker_client_tls.Pointer()->Set(NULL);
167 } 170 }
168 171
169 void EmbeddedWorkerContextClient::workerContextDestroyed() { 172 void EmbeddedWorkerContextClient::workerContextDestroyed() {
173 DCHECK(g_worker_client_tls.Pointer()->Get() == NULL);
174
170 // Now we should be able to free the WebEmbeddedWorker container on the 175 // Now we should be able to free the WebEmbeddedWorker container on the
171 // main thread. 176 // main thread.
172 main_thread_proxy_->PostTask( 177 main_thread_proxy_->PostTask(
173 FROM_HERE, 178 FROM_HERE,
174 base::Bind(&CallWorkerContextDestroyedOnMainThread, 179 base::Bind(&CallWorkerContextDestroyedOnMainThread,
175 embedded_worker_id_)); 180 embedded_worker_id_));
176 } 181 }
177 182
178 void EmbeddedWorkerContextClient::reportException( 183 void EmbeddedWorkerContextClient::reportException(
179 const blink::WebString& error_message, 184 const blink::WebString& error_message,
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
295 } 300 }
296 301
297 void EmbeddedWorkerContextClient::SendWorkerStarted() { 302 void EmbeddedWorkerContextClient::SendWorkerStarted() {
298 DCHECK(worker_task_runner_->RunsTasksOnCurrentThread()); 303 DCHECK(worker_task_runner_->RunsTasksOnCurrentThread());
299 Send(new EmbeddedWorkerHostMsg_WorkerStarted( 304 Send(new EmbeddedWorkerHostMsg_WorkerStarted(
300 WorkerTaskRunner::Instance()->CurrentWorkerId(), 305 WorkerTaskRunner::Instance()->CurrentWorkerId(),
301 embedded_worker_id_)); 306 embedded_worker_id_));
302 } 307 }
303 308
304 } // namespace content 309 } // namespace content
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