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

Side by Side Diff: content/browser/shared_worker/shared_worker_service_impl.cc

Issue 2342523002: Forcibly clear worker ref counts on shutdown. (Closed)
Patch Set: Created 4 years, 3 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
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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/shared_worker/shared_worker_service_impl.h" 5 #include "content/browser/shared_worker/shared_worker_service_impl.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <algorithm> 9 #include <algorithm>
10 #include <iterator> 10 #include <iterator>
(...skipping 13 matching lines...) Expand all
24 #include "content/common/worker_messages.h" 24 #include "content/common/worker_messages.h"
25 #include "content/public/browser/browser_thread.h" 25 #include "content/public/browser/browser_thread.h"
26 #include "content/public/browser/worker_service_observer.h" 26 #include "content/public/browser/worker_service_observer.h"
27 27
28 namespace content { 28 namespace content {
29 29
30 WorkerService* WorkerService::GetInstance() { 30 WorkerService* WorkerService::GetInstance() {
31 return SharedWorkerServiceImpl::GetInstance(); 31 return SharedWorkerServiceImpl::GetInstance();
32 } 32 }
33 33
34 bool IsHostAlive(RenderProcessHost* host) {
35 return host && !host->FastShutdownStarted() &&
36 !host->IsWorkerRefCountDisabled();
37 }
38
34 namespace { 39 namespace {
35 40
36 class ScopedWorkerDependencyChecker { 41 class ScopedWorkerDependencyChecker {
37 public: 42 public:
38 explicit ScopedWorkerDependencyChecker(SharedWorkerServiceImpl* service) 43 explicit ScopedWorkerDependencyChecker(SharedWorkerServiceImpl* service)
39 : service_(service) {} 44 : service_(service) {}
40 ScopedWorkerDependencyChecker(SharedWorkerServiceImpl* service, 45 ScopedWorkerDependencyChecker(SharedWorkerServiceImpl* service,
41 base::Closure done_closure) 46 base::Closure done_closure)
42 : service_(service), done_closure_(done_closure) {} 47 : service_(service), done_closure_(done_closure) {}
43 ~ScopedWorkerDependencyChecker() { 48 ~ScopedWorkerDependencyChecker() {
44 service_->CheckWorkerDependency(); 49 service_->CheckWorkerDependency();
45 if (!done_closure_.is_null()) 50 if (!done_closure_.is_null())
46 done_closure_.Run(); 51 done_closure_.Run();
47 } 52 }
48 53
49 private: 54 private:
50 SharedWorkerServiceImpl* service_; 55 SharedWorkerServiceImpl* service_;
51 base::Closure done_closure_; 56 base::Closure done_closure_;
52 DISALLOW_COPY_AND_ASSIGN(ScopedWorkerDependencyChecker); 57 DISALLOW_COPY_AND_ASSIGN(ScopedWorkerDependencyChecker);
53 }; 58 };
54 59
55 void UpdateWorkerDependencyOnUI(const std::vector<int>& added_ids, 60 void UpdateWorkerDependencyOnUI(const std::vector<int>& added_ids,
56 const std::vector<int>& removed_ids) { 61 const std::vector<int>& removed_ids) {
57 for (int id : added_ids) { 62 for (int id : added_ids) {
58 RenderProcessHostImpl* render_process_host_impl = 63 RenderProcessHostImpl* render_process_host_impl =
59 static_cast<RenderProcessHostImpl*>(RenderProcessHost::FromID(id)); 64 static_cast<RenderProcessHostImpl*>(RenderProcessHost::FromID(id));
60 if (!render_process_host_impl) 65 if (!IsHostAlive(render_process_host_impl))
61 continue; 66 continue;
62 render_process_host_impl->IncrementSharedWorkerRefCount(); 67 render_process_host_impl->IncrementSharedWorkerRefCount();
63 } 68 }
64 for (int id : removed_ids) { 69 for (int id : removed_ids) {
65 RenderProcessHostImpl* render_process_host_impl = 70 RenderProcessHostImpl* render_process_host_impl =
66 static_cast<RenderProcessHostImpl*>(RenderProcessHost::FromID(id)); 71 static_cast<RenderProcessHostImpl*>(RenderProcessHost::FromID(id));
67 if (!render_process_host_impl) 72 if (!IsHostAlive(render_process_host_impl))
68 continue; 73 continue;
69 render_process_host_impl->DecrementSharedWorkerRefCount(); 74 render_process_host_impl->DecrementSharedWorkerRefCount();
70 } 75 }
71 } 76 }
72 77
73 void UpdateWorkerDependency(const std::vector<int>& added_ids, 78 void UpdateWorkerDependency(const std::vector<int>& added_ids,
74 const std::vector<int>& removed_ids) { 79 const std::vector<int>& removed_ids) {
75 BrowserThread::PostTask( 80 BrowserThread::PostTask(
76 BrowserThread::UI, 81 BrowserThread::UI,
77 FROM_HERE, 82 FROM_HERE,
78 base::Bind(&UpdateWorkerDependencyOnUI, added_ids, removed_ids)); 83 base::Bind(&UpdateWorkerDependencyOnUI, added_ids, removed_ids));
79 } 84 }
80 85
81 void DecrementWorkerRefCount(int process_id) { 86 void DecrementWorkerRefCount(int process_id) {
82 if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) { 87 if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) {
83 BrowserThread::PostTask(BrowserThread::UI, 88 BrowserThread::PostTask(BrowserThread::UI,
84 FROM_HERE, 89 FROM_HERE,
85 base::Bind(&DecrementWorkerRefCount, process_id)); 90 base::Bind(&DecrementWorkerRefCount, process_id));
86 return; 91 return;
87 } 92 }
88 RenderProcessHostImpl* render_process_host_impl = 93 RenderProcessHostImpl* render_process_host_impl =
89 static_cast<RenderProcessHostImpl*>( 94 static_cast<RenderProcessHostImpl*>(
90 RenderProcessHost::FromID(process_id)); 95 RenderProcessHost::FromID(process_id));
91 if (render_process_host_impl) 96 if (IsHostAlive(render_process_host_impl))
92 render_process_host_impl->DecrementSharedWorkerRefCount(); 97 render_process_host_impl->DecrementSharedWorkerRefCount();
93 } 98 }
94 99
95 bool TryIncrementWorkerRefCount(int worker_process_id) { 100 bool TryIncrementWorkerRefCount(int worker_process_id) {
96 RenderProcessHostImpl* render_process = static_cast<RenderProcessHostImpl*>( 101 RenderProcessHostImpl* render_process = static_cast<RenderProcessHostImpl*>(
97 RenderProcessHost::FromID(worker_process_id)); 102 RenderProcessHost::FromID(worker_process_id));
98 if (!render_process || render_process->FastShutdownStarted()) 103 if (!IsHostAlive(render_process))
99 return false; 104 return false;
100 render_process->IncrementSharedWorkerRefCount(); 105 render_process->IncrementSharedWorkerRefCount();
101 return true; 106 return true;
102 } 107 }
103 108
104 } // namespace 109 } // namespace
105 110
106 class SharedWorkerServiceImpl::SharedWorkerPendingInstance { 111 class SharedWorkerServiceImpl::SharedWorkerPendingInstance {
107 public: 112 public:
108 struct SharedWorkerPendingRequest { 113 struct SharedWorkerPendingRequest {
(...skipping 574 matching lines...) Expand 10 before | Expand all | Expand 10 after
683 UpdateWorkerDependencyFunc new_func) { 688 UpdateWorkerDependencyFunc new_func) {
684 update_worker_dependency_ = new_func; 689 update_worker_dependency_ = new_func;
685 } 690 }
686 691
687 void SharedWorkerServiceImpl::ChangeTryIncrementWorkerRefCountFuncForTesting( 692 void SharedWorkerServiceImpl::ChangeTryIncrementWorkerRefCountFuncForTesting(
688 bool (*new_func)(int)) { 693 bool (*new_func)(int)) {
689 s_try_increment_worker_ref_count_ = new_func; 694 s_try_increment_worker_ref_count_ = new_func;
690 } 695 }
691 696
692 } // namespace content 697 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698