diff options
author | kinuko@chromium.org <kinuko@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-04-22 00:10:10 +0000 |
---|---|---|
committer | kinuko@chromium.org <kinuko@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-04-22 00:10:10 +0000 |
commit | 447741dcbfc8088854b701d0e6bd726ad308c449 (patch) | |
tree | 7e63def79d9378b7a5d1cc9f35e30b85c768ba1d /content/child/service_worker | |
parent | 0318f92ba7c54fc5ef6397c6d58250fea95c7196 (diff) | |
download | chromium_src-447741dcbfc8088854b701d0e6bd726ad308c449.zip chromium_src-447741dcbfc8088854b701d0e6bd726ad308c449.tar.gz chromium_src-447741dcbfc8088854b701d0e6bd726ad308c449.tar.bz2 |
Don't try to create ServiceWorkerDispatcher in destruction path
If dispatcher is already deleted we don't need to bother re-creating it (as it could lead to a leak in worker shutdown
sequence).
BUG=364822
Review URL: https://codereview.chromium.org/243123002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@265121 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content/child/service_worker')
3 files changed, 19 insertions, 2 deletions
diff --git a/content/child/service_worker/service_worker_dispatcher.cc b/content/child/service_worker/service_worker_dispatcher.cc index fe665cb..100693b 100644 --- a/content/child/service_worker/service_worker_dispatcher.cc +++ b/content/child/service_worker/service_worker_dispatcher.cc @@ -39,6 +39,13 @@ ServiceWorkerDispatcher::ServiceWorkerDispatcher( } ServiceWorkerDispatcher::~ServiceWorkerDispatcher() { + for (ScriptClientMap::iterator it = script_clients_.begin(); + it != script_clients_.end(); + ++it) { + Send(new ServiceWorkerHostMsg_RemoveScriptClient( + CurrentWorkerId(), it->first)); + } + g_dispatcher_tls.Pointer()->Set(kHasBeenDeleted); } diff --git a/content/child/service_worker/web_service_worker_provider_impl.cc b/content/child/service_worker/web_service_worker_provider_impl.cc index e1bcfb5..99f9738 100644 --- a/content/child/service_worker/web_service_worker_provider_impl.cc +++ b/content/child/service_worker/web_service_worker_provider_impl.cc @@ -24,7 +24,7 @@ WebServiceWorkerProviderImpl::WebServiceWorkerProviderImpl( WebServiceWorkerProviderImpl::~WebServiceWorkerProviderImpl() { // Make sure the script client is removed. - GetDispatcher()->RemoveScriptClient(provider_id_); + RemoveScriptClient(); } void WebServiceWorkerProviderImpl::setClient( @@ -32,7 +32,7 @@ void WebServiceWorkerProviderImpl::setClient( if (client) GetDispatcher()->AddScriptClient(provider_id_, client); else - GetDispatcher()->RemoveScriptClient(provider_id_); + RemoveScriptClient(); } void WebServiceWorkerProviderImpl::registerServiceWorker( @@ -50,6 +50,15 @@ void WebServiceWorkerProviderImpl::unregisterServiceWorker( provider_id_, pattern, callbacks); } +void WebServiceWorkerProviderImpl::RemoveScriptClient() { + // Remove the script client, but only if the dispatcher is still there. + // (For cleanup path we don't need to bother creating a new dispatcher) + ServiceWorkerDispatcher* dispatcher = + ServiceWorkerDispatcher::GetThreadSpecificInstance(); + if (dispatcher) + dispatcher->RemoveScriptClient(provider_id_); +} + ServiceWorkerDispatcher* WebServiceWorkerProviderImpl::GetDispatcher() { return ServiceWorkerDispatcher::GetOrCreateThreadSpecificInstance( thread_safe_sender_); diff --git a/content/child/service_worker/web_service_worker_provider_impl.h b/content/child/service_worker/web_service_worker_provider_impl.h index d0a641f..69aeed6 100644 --- a/content/child/service_worker/web_service_worker_provider_impl.h +++ b/content/child/service_worker/web_service_worker_provider_impl.h @@ -37,6 +37,7 @@ class WebServiceWorkerProviderImpl WebServiceWorkerCallbacks*); private: + void RemoveScriptClient(); ServiceWorkerDispatcher* GetDispatcher(); scoped_refptr<ThreadSafeSender> thread_safe_sender_; |