| Index: content/browser/worker_host/worker_service.cc
|
| diff --git a/content/browser/worker_host/worker_service.cc b/content/browser/worker_host/worker_service.cc
|
| index dd30448d2a2ccc96f39d615fc3deafbd61e7f2c4..dd2e09c37353dfdd9c86e3e3e74cb40562814419 100644
|
| --- a/content/browser/worker_host/worker_service.cc
|
| +++ b/content/browser/worker_host/worker_service.cc
|
| @@ -7,6 +7,7 @@
|
| #include <string>
|
|
|
| #include "base/command_line.h"
|
| +#include "base/logging.h"
|
| #include "base/sys_info.h"
|
| #include "base/threading/thread.h"
|
| #include "chrome/common/chrome_switches.h"
|
| @@ -21,6 +22,7 @@ const int WorkerService::kMaxWorkersWhenSeparate = 64;
|
| const int WorkerService::kMaxWorkersPerTabWhenSeparate = 16;
|
|
|
| WorkerService* WorkerService::GetInstance() {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| return Singleton<WorkerService>::get();
|
| }
|
|
|
| @@ -28,9 +30,12 @@ WorkerService::WorkerService() : next_worker_route_id_(0) {
|
| }
|
|
|
| WorkerService::~WorkerService() {
|
| + // Since we're a Singleton, we are deleted on the UI thread instead.
|
| + DetachFromThread();
|
| }
|
|
|
| void WorkerService::OnWorkerMessageFilterClosing(WorkerMessageFilter* filter) {
|
| + DCHECK(CalledOnValidThread());
|
| for (BrowserChildProcessHost::Iterator iter(ChildProcessInfo::WORKER_PROCESS);
|
| !iter.Done(); ++iter) {
|
| WorkerProcessHost* worker = static_cast<WorkerProcessHost*>(*iter);
|
| @@ -71,10 +76,12 @@ void WorkerService::CreateWorker(
|
| const ViewHostMsg_CreateWorker_Params& params,
|
| int route_id,
|
| WorkerMessageFilter* filter,
|
| - net::URLRequestContextGetter* request_context) {
|
| -
|
| + net::URLRequestContextGetter* request_context_getter,
|
| + const content::ResourceContext& resource_context) {
|
| + DCHECK(CalledOnValidThread());
|
| + // TODO(willchan): Eliminate the need for this downcast.
|
| ChromeURLRequestContext* context = static_cast<ChromeURLRequestContext*>(
|
| - request_context->GetURLRequestContext());
|
| + request_context_getter->GetURLRequestContext());
|
|
|
| // Generate a unique route id for the browser-worker communication that's
|
| // unique among all worker processes. That way when the worker process sends
|
| @@ -89,7 +96,8 @@ void WorkerService::CreateWorker(
|
| params.is_shared ? 0 : filter->render_process_id(),
|
| params.is_shared ? 0 : params.parent_appcache_host_id,
|
| params.is_shared ? params.script_resource_appcache_id : 0,
|
| - request_context);
|
| + request_context_getter,
|
| + resource_context);
|
| instance.AddFilter(filter, route_id);
|
| instance.worker_document_set()->Add(
|
| filter, params.document_id, filter->render_process_id(),
|
| @@ -105,7 +113,7 @@ void WorkerService::LookupSharedWorker(
|
| bool incognito,
|
| bool* exists,
|
| bool* url_mismatch) {
|
| -
|
| + DCHECK(CalledOnValidThread());
|
| *exists = true;
|
| WorkerProcessHost::WorkerInstance* instance = FindSharedWorkerInstance(
|
| params.url, params.name, incognito);
|
| @@ -144,6 +152,7 @@ void WorkerService::LookupSharedWorker(
|
| void WorkerService::CancelCreateDedicatedWorker(
|
| int route_id,
|
| WorkerMessageFilter* filter) {
|
| + DCHECK(CalledOnValidThread());
|
| for (WorkerProcessHost::Instances::iterator i = queued_workers_.begin();
|
| i != queued_workers_.end(); ++i) {
|
| if (i->HasFilter(filter, route_id)) {
|
| @@ -177,6 +186,7 @@ void WorkerService::CancelCreateDedicatedWorker(
|
|
|
| void WorkerService::ForwardToWorker(const IPC::Message& message,
|
| WorkerMessageFilter* filter) {
|
| + DCHECK(CalledOnValidThread());
|
| for (BrowserChildProcessHost::Iterator iter(ChildProcessInfo::WORKER_PROCESS);
|
| !iter.Done(); ++iter) {
|
| WorkerProcessHost* worker = static_cast<WorkerProcessHost*>(*iter);
|
| @@ -189,6 +199,7 @@ void WorkerService::ForwardToWorker(const IPC::Message& message,
|
|
|
| void WorkerService::DocumentDetached(unsigned long long document_id,
|
| WorkerMessageFilter* filter) {
|
| + DCHECK(CalledOnValidThread());
|
| // Any associated shared workers can be shut down.
|
| for (BrowserChildProcessHost::Iterator iter(ChildProcessInfo::WORKER_PROCESS);
|
| !iter.Done(); ++iter) {
|
| @@ -224,6 +235,7 @@ void WorkerService::DocumentDetached(unsigned long long document_id,
|
|
|
| bool WorkerService::CreateWorkerFromInstance(
|
| WorkerProcessHost::WorkerInstance instance) {
|
| + DCHECK(CalledOnValidThread());
|
| // TODO(michaeln): We need to ensure that a process is working
|
| // on behalf of a single profile. The process sharing logic below
|
| // does not ensure that. Consider making WorkerService a per profile
|
| @@ -309,8 +321,9 @@ bool WorkerService::CreateWorkerFromInstance(
|
| if (!worker) {
|
| WorkerMessageFilter* first_filter = instance.filters().begin()->first;
|
| worker = new WorkerProcessHost(
|
| - first_filter->resource_dispatcher_host(),
|
| - instance.request_context());
|
| + instance.request_context_getter(),
|
| + instance.resource_context(),
|
| + first_filter->resource_dispatcher_host());
|
| // TODO(atwilson): This won't work if the message is from a worker process.
|
| // We don't support that yet though (this message is only sent from
|
| // renderers) but when we do, we'll need to add code to pass in the current
|
| @@ -330,6 +343,7 @@ bool WorkerService::CreateWorkerFromInstance(
|
| }
|
|
|
| WorkerProcessHost* WorkerService::GetProcessForDomain(const GURL& url) {
|
| + DCHECK(CalledOnValidThread());
|
| int num_processes = 0;
|
| std::string domain =
|
| net::RegistryControlledDomainService::GetDomainAndRegistry(url);
|
| @@ -354,6 +368,7 @@ WorkerProcessHost* WorkerService::GetProcessForDomain(const GURL& url) {
|
| }
|
|
|
| WorkerProcessHost* WorkerService::GetProcessToFillUpCores() {
|
| + DCHECK(CalledOnValidThread());
|
| int num_processes = 0;
|
| BrowserChildProcessHost::Iterator iter(ChildProcessInfo::WORKER_PROCESS);
|
| for (; !iter.Done(); ++iter)
|
| @@ -366,6 +381,7 @@ WorkerProcessHost* WorkerService::GetProcessToFillUpCores() {
|
| }
|
|
|
| WorkerProcessHost* WorkerService::GetLeastLoadedWorker() {
|
| + DCHECK(CalledOnValidThread());
|
| WorkerProcessHost* smallest = NULL;
|
| for (BrowserChildProcessHost::Iterator iter(ChildProcessInfo::WORKER_PROCESS);
|
| !iter.Done(); ++iter) {
|
| @@ -379,6 +395,7 @@ WorkerProcessHost* WorkerService::GetLeastLoadedWorker() {
|
|
|
| bool WorkerService::CanCreateWorkerProcess(
|
| const WorkerProcessHost::WorkerInstance& instance) {
|
| + DCHECK(CalledOnValidThread());
|
| // Worker can be fired off if *any* parent has room.
|
| const WorkerDocumentSet::DocumentInfoSet& parents =
|
| instance.worker_document_set()->documents();
|
| @@ -405,6 +422,7 @@ bool WorkerService::CanCreateWorkerProcess(
|
| bool WorkerService::TabCanCreateWorkerProcess(int render_process_id,
|
| int render_view_id,
|
| bool* hit_total_worker_limit) {
|
| + DCHECK(CalledOnValidThread());
|
| int total_workers = 0;
|
| int workers_per_tab = 0;
|
| *hit_total_worker_limit = false;
|
| @@ -431,6 +449,7 @@ bool WorkerService::TabCanCreateWorkerProcess(int render_process_id,
|
| }
|
|
|
| void WorkerService::TryStartingQueuedWorker() {
|
| + DCHECK(CalledOnValidThread());
|
| if (queued_workers_.empty())
|
| return;
|
|
|
| @@ -456,6 +475,7 @@ void WorkerService::TryStartingQueuedWorker() {
|
| bool WorkerService::GetRendererForWorker(int worker_process_id,
|
| int* render_process_id,
|
| int* render_view_id) const {
|
| + DCHECK(CalledOnValidThread());
|
| for (BrowserChildProcessHost::Iterator iter(ChildProcessInfo::WORKER_PROCESS);
|
| !iter.Done(); ++iter) {
|
| if (iter->id() != worker_process_id)
|
| @@ -479,6 +499,7 @@ bool WorkerService::GetRendererForWorker(int worker_process_id,
|
|
|
| const WorkerProcessHost::WorkerInstance* WorkerService::FindWorkerInstance(
|
| int worker_process_id) {
|
| + DCHECK(CalledOnValidThread());
|
| for (BrowserChildProcessHost::Iterator iter(ChildProcessInfo::WORKER_PROCESS);
|
| !iter.Done(); ++iter) {
|
| if (iter->id() != worker_process_id)
|
| @@ -495,6 +516,7 @@ const WorkerProcessHost::WorkerInstance* WorkerService::FindWorkerInstance(
|
| WorkerProcessHost::WorkerInstance*
|
| WorkerService::FindSharedWorkerInstance(const GURL& url, const string16& name,
|
| bool incognito) {
|
| + DCHECK(CalledOnValidThread());
|
| for (BrowserChildProcessHost::Iterator iter(ChildProcessInfo::WORKER_PROCESS);
|
| !iter.Done(); ++iter) {
|
| WorkerProcessHost* worker = static_cast<WorkerProcessHost*>(*iter);
|
| @@ -512,6 +534,7 @@ WorkerService::FindSharedWorkerInstance(const GURL& url, const string16& name,
|
| WorkerProcessHost::WorkerInstance*
|
| WorkerService::FindPendingInstance(const GURL& url, const string16& name,
|
| bool incognito) {
|
| + DCHECK(CalledOnValidThread());
|
| // Walk the pending instances looking for a matching pending worker.
|
| for (WorkerProcessHost::Instances::iterator iter =
|
| pending_shared_workers_.begin();
|
| @@ -528,6 +551,7 @@ WorkerService::FindPendingInstance(const GURL& url, const string16& name,
|
| void WorkerService::RemovePendingInstances(const GURL& url,
|
| const string16& name,
|
| bool incognito) {
|
| + DCHECK(CalledOnValidThread());
|
| // Walk the pending instances looking for a matching pending worker.
|
| for (WorkerProcessHost::Instances::iterator iter =
|
| pending_shared_workers_.begin();
|
| @@ -544,6 +568,7 @@ WorkerProcessHost::WorkerInstance*
|
| WorkerService::CreatePendingInstance(const GURL& url,
|
| const string16& name,
|
| bool incognito) {
|
| + DCHECK(CalledOnValidThread());
|
| // Look for an existing pending shared worker.
|
| WorkerProcessHost::WorkerInstance* instance =
|
| FindPendingInstance(url, name, incognito);
|
| @@ -551,8 +576,7 @@ WorkerService::CreatePendingInstance(const GURL& url,
|
| return instance;
|
|
|
| // No existing pending worker - create a new one.
|
| - WorkerProcessHost::WorkerInstance pending(
|
| - url, true, incognito, name, MSG_ROUTING_NONE, 0, 0, 0, NULL);
|
| + WorkerProcessHost::WorkerInstance pending(url, true, incognito, name);
|
| pending_shared_workers_.push_back(pending);
|
| return &pending_shared_workers_.back();
|
| }
|
|
|