summaryrefslogtreecommitdiffstats
path: root/chrome/browser/worker_host/worker_service.cc
diff options
context:
space:
mode:
authorjam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-05-01 21:20:47 +0000
committerjam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-05-01 21:20:47 +0000
commitec775ef9b36dbcb5ebbd4fa550443bfa94c53a9f (patch)
tree5400ae2c5876e13aeeec2ab6ebcfc54f3f479840 /chrome/browser/worker_host/worker_service.cc
parent4b5d64ff3d7d95247ed4f078d8bf585a1726794d (diff)
downloadchromium_src-ec775ef9b36dbcb5ebbd4fa550443bfa94c53a9f.zip
chromium_src-ec775ef9b36dbcb5ebbd4fa550443bfa94c53a9f.tar.gz
chromium_src-ec775ef9b36dbcb5ebbd4fa550443bfa94c53a9f.tar.bz2
Run workers in separate processes.
Review URL: http://codereview.chromium.org/99016 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@15098 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/worker_host/worker_service.cc')
-rw-r--r--chrome/browser/worker_host/worker_service.cc37
1 files changed, 27 insertions, 10 deletions
diff --git a/chrome/browser/worker_host/worker_service.cc b/chrome/browser/worker_host/worker_service.cc
index 49e25bc..a90c30e 100644
--- a/chrome/browser/worker_host/worker_service.cc
+++ b/chrome/browser/worker_host/worker_service.cc
@@ -25,7 +25,10 @@ WorkerService* WorkerService::GetInstance() {
return Singleton<WorkerService>::get();
}
-WorkerService::WorkerService() : next_worker_route_id_(0) {
+WorkerService::WorkerService()
+ : next_worker_route_id_(0),
+ resource_dispatcher_host_(NULL),
+ ui_loop_(NULL) {
// Receive a notification if the message filter is deleted.
NotificationService::current()->AddObserver(
this,
@@ -33,24 +36,33 @@ WorkerService::WorkerService() : next_worker_route_id_(0) {
NotificationService::AllSources());
}
+void WorkerService::Initialize(ResourceDispatcherHost* rdh,
+ MessageLoop* ui_loop) {
+ resource_dispatcher_host_ = rdh;
+ ui_loop_ = ui_loop;
+}
+
WorkerService::~WorkerService() {
}
bool WorkerService::CreateDedicatedWorker(const GURL &url,
+ int renderer_process_id,
int render_view_route_id,
- ResourceMessageFilter* filter,
- int renderer_route_id) {
+ IPC::Message::Sender* sender,
+ int sender_pid,
+ int sender_route_id) {
WorkerProcessHost* worker = NULL;
if (CommandLine::ForCurrentProcess()->HasSwitch(
switches::kWebWorkerProcessPerCore)) {
worker = GetProcessToFillUpCores();
- } else {
+ } else if (CommandLine::ForCurrentProcess()->HasSwitch(
+ switches::kWebWorkerShareProcesses)) {
worker = GetProcessForDomain(url);
}
if (!worker) {
- worker = new WorkerProcessHost(filter->resource_dispatcher_host());
+ worker = new WorkerProcessHost(resource_dispatcher_host_);
if (!worker->Init()) {
delete worker;
return false;
@@ -61,17 +73,19 @@ bool WorkerService::CreateDedicatedWorker(const GURL &url,
// unique among all worker processes. That way when the worker process sends
// a wrapped IPC message through us, we know which WorkerProcessHost to give
// it to.
- worker->CreateWorker(url, render_view_route_id, ++next_worker_route_id_,
- renderer_route_id, filter);
+ worker->CreateWorker(url, renderer_process_id, render_view_route_id,
+ next_worker_route_id(), sender, sender_pid,
+ sender_route_id);
return true;
}
-void WorkerService::ForwardMessage(const IPC::Message& message) {
+void WorkerService::ForwardMessage(const IPC::Message& message,
+ int sender_pid) {
for (ChildProcessHost::Iterator iter(ChildProcessInfo::WORKER_PROCESS);
!iter.Done(); ++iter) {
WorkerProcessHost* worker = static_cast<WorkerProcessHost*>(*iter);
- if (worker->FilterMessage(message))
+ if (worker->FilterMessage(message, sender_pid))
return;
}
@@ -131,10 +145,13 @@ void WorkerService::Observe(NotificationType type,
const NotificationDetails& details) {
DCHECK(type.value == NotificationType::RESOURCE_MESSAGE_FILTER_SHUTDOWN);
ResourceMessageFilter* filter = Source<ResourceMessageFilter>(source).ptr();
+ NotifySenderShutdown(filter);
+}
+void WorkerService::NotifySenderShutdown(IPC::Message::Sender* sender) {
for (ChildProcessHost::Iterator iter(ChildProcessInfo::WORKER_PROCESS);
!iter.Done(); ++iter) {
WorkerProcessHost* worker = static_cast<WorkerProcessHost*>(*iter);
- worker->RendererShutdown(filter);
+ worker->SenderShutdown(sender);
}
}