diff options
author | gregoryd@google.com <gregoryd@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-02-01 18:57:09 +0000 |
---|---|---|
committer | gregoryd@google.com <gregoryd@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-02-01 18:57:09 +0000 |
commit | 103607e7bb3d18c9c5b78cf8dc558c2504047b1d (patch) | |
tree | 650fd33a0dfeded9eec339c24856307de5a86248 /chrome/browser/nacl_host/nacl_broker_service.cc | |
parent | 20c01928492aca53ee6ba6e1c84a199e889cb74d (diff) | |
download | chromium_src-103607e7bb3d18c9c5b78cf8dc558c2504047b1d.zip chromium_src-103607e7bb3d18c9c5b78cf8dc558c2504047b1d.tar.gz chromium_src-103607e7bb3d18c9c5b78cf8dc558c2504047b1d.tar.bz2 |
Implement the broker process that launches NaCl loader processes on 64-bit Windows systems.
BUG=28176
TEST=none
Committed: http://src.chromium.org/viewvc/chrome?view=rev&revision=37578
Review URL: http://codereview.chromium.org/542030
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@37720 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/nacl_host/nacl_broker_service.cc')
-rw-r--r-- | chrome/browser/nacl_host/nacl_broker_service.cc | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/chrome/browser/nacl_host/nacl_broker_service.cc b/chrome/browser/nacl_host/nacl_broker_service.cc new file mode 100644 index 0000000..ef659cd --- /dev/null +++ b/chrome/browser/nacl_host/nacl_broker_service.cc @@ -0,0 +1,69 @@ +// Copyright (c) 2010 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/nacl_host/nacl_broker_service.h" + +#include "chrome/browser/browser_process.h" +#include "chrome/browser/nacl_process_host.h" +#include "chrome/common/chrome_switches.h" + +NaClBrokerService* NaClBrokerService::GetInstance() { + return Singleton<NaClBrokerService>::get(); +} + +NaClBrokerService::NaClBrokerService() + : broker_started_(false), + broker_host_(NULL), + resource_dispatcher_host_(NULL), + initialized_(false) { +} + +void NaClBrokerService::Init(ResourceDispatcherHost* resource_dispatcher_host) { + if (initialized_) { + return; + } + resource_dispatcher_host_ = resource_dispatcher_host; + StartBroker(); + initialized_ = true; +} + +bool NaClBrokerService::StartBroker() { + broker_host_.reset(new NaClBrokerHost(resource_dispatcher_host_)); + if (!broker_host_->Init()) { + // Initialization failed, we will not retry in the future + broker_host_.reset(NULL); + } + return (broker_host_ != NULL); +} + +bool NaClBrokerService::LaunchLoader(NaClProcessHost* nacl_process_host, + const std::wstring& loader_channel_id) { + if (broker_started_) { + broker_host_->LaunchLoader(loader_channel_id); + } else { + // Add task to the list + pending_launches_[loader_channel_id] = nacl_process_host; + } + return true; +} + +void NaClBrokerService::OnBrokerStarted() { + PendingLaunchesMap::iterator it; + for (it = pending_launches_.begin(); it != pending_launches_.end(); it++) { + broker_host_->LaunchLoader(it->first); + } + broker_started_ = true; +} + +void NaClBrokerService::OnLoaderLaunched(const std::wstring& channel_id, + base::ProcessHandle handle) { + NaClProcessHost* client; + PendingLaunchesMap::iterator it = pending_launches_.find(channel_id); + if (pending_launches_.end() == it) { + NOTREACHED(); + } + client = it->second; + client->OnProcessLaunchedByBroker(handle); + pending_launches_.erase(it); +} |