Index: content/browser/service_worker/service_worker_process_manager.cc |
diff --git a/content/browser/service_worker/service_worker_process_manager.cc b/content/browser/service_worker/service_worker_process_manager.cc |
index b6a2891e2d2254d718312c68c5daee83369051a3..fdc1aa63602088d2238177fad6dfd70ebabd337d 100644 |
--- a/content/browser/service_worker/service_worker_process_manager.cc |
+++ b/content/browser/service_worker/service_worker_process_manager.cc |
@@ -12,9 +12,20 @@ |
namespace content { |
+static bool IncrementWorkerRefCountByPid( |
+ int process_id) { |
kinuko
2014/05/20 06:30:03
nit: line 15-16 would probably fit into single lin
Jeffrey Yasskin
2014/05/21 02:01:11
Done.
|
+ RenderProcessHost* rph = RenderProcessHost::FromID(process_id); |
+ if (!rph || rph->FastShutdownStarted()) |
+ return false; |
+ |
+ static_cast<RenderProcessHostImpl*>(rph)->IncrementWorkerRefCount(); |
+ return true; |
+} |
+ |
ServiceWorkerProcessManager::ServiceWorkerProcessManager( |
ServiceWorkerContextWrapper* context_wrapper) |
: context_wrapper_(context_wrapper), |
+ process_id_for_test_(-1), |
weak_this_factory_(this), |
weak_this_(weak_this_factory_.GetWeakPtr()) { |
} |
@@ -24,26 +35,43 @@ ServiceWorkerProcessManager::~ServiceWorkerProcessManager() { |
} |
void ServiceWorkerProcessManager::AllocateWorkerProcess( |
+ int embedded_worker_id, |
const std::vector<int>& process_ids, |
const GURL& script_url, |
const base::Callback<void(ServiceWorkerStatusCode, int process_id)>& |
- callback) const { |
+ callback) { |
if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) { |
BrowserThread::PostTask( |
BrowserThread::UI, |
FROM_HERE, |
base::Bind(&ServiceWorkerProcessManager::AllocateWorkerProcess, |
weak_this_, |
+ embedded_worker_id, |
process_ids, |
script_url, |
callback)); |
return; |
} |
+ if (process_id_for_test_ != -1) { |
+ // Let tests specify the returned process ID. Note: We may need to be able |
+ // to specify the error code too. |
+ BrowserThread::PostTask( |
+ BrowserThread::IO, |
+ FROM_HERE, |
+ base::Bind(callback, SERVICE_WORKER_OK, process_id_for_test_)); |
+ return; |
+ } |
+ |
+ DCHECK(!ContainsKey(instance_info_, embedded_worker_id)) |
+ << embedded_worker_id << " already has a process allocated"; |
+ |
for (std::vector<int>::const_iterator it = process_ids.begin(); |
it != process_ids.end(); |
++it) { |
- if (IncrementWorkerRefcountByPid(*it)) { |
+ if (IncrementWorkerRefCountByPid(*it)) { |
+ instance_info_.insert( |
+ std::make_pair(embedded_worker_id, ProcessInfo(*it))); |
BrowserThread::PostTask(BrowserThread::IO, |
FROM_HERE, |
base::Bind(callback, SERVICE_WORKER_OK, *it)); |
@@ -75,6 +103,9 @@ void ServiceWorkerProcessManager::AllocateWorkerProcess( |
return; |
} |
+ instance_info_.insert( |
+ std::make_pair(embedded_worker_id, ProcessInfo(site_instance))); |
+ |
static_cast<RenderProcessHostImpl*>(rph)->IncrementWorkerRefCount(); |
BrowserThread::PostTask( |
BrowserThread::IO, |
@@ -82,53 +113,49 @@ void ServiceWorkerProcessManager::AllocateWorkerProcess( |
base::Bind(callback, SERVICE_WORKER_OK, rph->GetID())); |
} |
-void ServiceWorkerProcessManager::ReleaseWorkerProcess(int process_id) { |
+void ServiceWorkerProcessManager::ReleaseWorkerProcess(int embedded_worker_id) { |
if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) { |
BrowserThread::PostTask( |
BrowserThread::UI, |
FROM_HERE, |
base::Bind(&ServiceWorkerProcessManager::ReleaseWorkerProcess, |
weak_this_, |
- process_id)); |
+ embedded_worker_id)); |
+ return; |
+ } |
+ if (process_id_for_test_ != -1) { |
+ // Unittests don't increment or decrement the worker refcount of a |
+ // RenderProcessHost. |
return; |
} |
- if (!DecrementWorkerRefcountByPid(process_id)) { |
- DCHECK(false) << "DecrementWorkerRef(" << process_id |
- << ") doesn't match a previous IncrementWorkerRef"; |
+ std::map<int, ProcessInfo>::iterator info = |
+ instance_info_.find(embedded_worker_id); |
+ DCHECK(info != instance_info_.end()); |
+ RenderProcessHost* rph = NULL; |
+ if (info->second.site_instance) { |
+ rph = info->second.site_instance->GetProcess(); |
+ DCHECK_EQ(info->second.process_id, rph->GetID()) |
+ << "A SiteInstance's process shouldn't get destroyed while we're " |
+ "holding a reference to it. Was the reference actually held?"; |
+ } else { |
+ rph = RenderProcessHost::FromID(info->second.process_id); |
+ DCHECK(rph) |
+ << "Process " << info->second.process_id |
+ << " was destroyed unexpectedly. Did we actually hold a reference?"; |
} |
+ static_cast<RenderProcessHostImpl*>(rph)->DecrementWorkerRefCount(); |
+ instance_info_.erase(info); |
} |
-void ServiceWorkerProcessManager::SetProcessRefcountOpsForTest( |
- const base::Callback<bool(int)>& increment_for_test, |
- const base::Callback<bool(int)>& decrement_for_test) { |
- increment_for_test_ = increment_for_test; |
- decrement_for_test_ = decrement_for_test; |
+ServiceWorkerProcessManager::ProcessInfo::ProcessInfo( |
kinuko
2014/05/20 06:30:03
nit: can these ProcessInfo definitions be placed b
Jeffrey Yasskin
2014/05/21 02:01:11
Done.
|
+ const scoped_refptr<SiteInstance>& site_instance) |
+ : site_instance(site_instance), |
+ process_id(site_instance->GetProcess()->GetID()) { |
} |
- |
-bool ServiceWorkerProcessManager::IncrementWorkerRefcountByPid( |
- int process_id) const { |
- if (!increment_for_test_.is_null()) |
- return increment_for_test_.Run(process_id); |
- |
- RenderProcessHost* rph = RenderProcessHost::FromID(process_id); |
- if (rph && !rph->FastShutdownStarted()) { |
- static_cast<RenderProcessHostImpl*>(rph)->IncrementWorkerRefCount(); |
- return true; |
- } |
- |
- return false; |
+ServiceWorkerProcessManager::ProcessInfo::ProcessInfo(int process_id) |
+ : process_id(process_id) { |
} |
- |
-bool ServiceWorkerProcessManager::DecrementWorkerRefcountByPid( |
- int process_id) const { |
- if (!decrement_for_test_.is_null()) |
- return decrement_for_test_.Run(process_id); |
- |
- RenderProcessHost* rph = RenderProcessHost::FromID(process_id); |
- if (rph) |
- static_cast<RenderProcessHostImpl*>(rph)->DecrementWorkerRefCount(); |
- |
- return rph != NULL; |
+ServiceWorkerProcessManager::ProcessInfo::~ProcessInfo() { |
} |
} // namespace content |