Index: components/nacl/renderer/ppb_nacl_private_impl.cc |
diff --git a/components/nacl/renderer/ppb_nacl_private_impl.cc b/components/nacl/renderer/ppb_nacl_private_impl.cc |
index 539c7104d6e4cdaecce2ac3b161290f44eafaff1..2d6d1c77352505dd11e65ea3bbd95ea286233fb4 100644 |
--- a/components/nacl/renderer/ppb_nacl_private_impl.cc |
+++ b/components/nacl/renderer/ppb_nacl_private_impl.cc |
@@ -102,19 +102,11 @@ typedef base::ScopedPtrHashMap<PP_Instance, NexeLoadManager> |
base::LazyInstance<NexeLoadManagerMap> g_load_manager_map = |
LAZY_INSTANCE_INITIALIZER; |
-typedef base::ScopedPtrHashMap<int32_t, nacl::JsonManifest> JsonManifestMap; |
+typedef base::ScopedPtrHashMap<PP_Instance, nacl::JsonManifest> JsonManifestMap; |
base::LazyInstance<JsonManifestMap> g_manifest_map = |
LAZY_INSTANCE_INITIALIZER; |
-base::LazyInstance<int32_t> g_next_manifest_id = |
- LAZY_INSTANCE_INITIALIZER; |
- |
-// We have to define a method here since we can't use a static initializer. |
-int32_t GetPNaClManifestId() { |
- return std::numeric_limits<int32_t>::max(); |
-} |
- |
nacl::NexeLoadManager* GetNexeLoadManager(PP_Instance instance) { |
NexeLoadManagerMap& map = g_load_manager_map.Get(); |
NexeLoadManagerMap::iterator iter = map.find(instance); |
@@ -746,6 +738,8 @@ void InstanceCreated(PP_Instance instance) { |
} |
void InstanceDestroyed(PP_Instance instance) { |
+ g_manifest_map.Get().erase(instance); |
+ |
NexeLoadManagerMap& map = g_load_manager_map.Get(); |
DLOG_IF(ERROR, map.count(instance) == 0) << "Could not find instance ID"; |
// The erase may call NexeLoadManager's destructor prior to removing it from |
@@ -832,16 +826,14 @@ int64_t GetNexeSize(PP_Instance instance) { |
} |
void DownloadManifestToBuffer(PP_Instance instance, |
- int32_t* out_manifest_id, |
struct PP_CompletionCallback callback); |
-int32_t CreateJsonManifest(PP_Instance instance, |
- const std::string& manifest_url, |
- const std::string& manifest_data); |
+bool CreateJsonManifest(PP_Instance instance, |
+ const std::string& manifest_url, |
+ const std::string& manifest_data); |
void RequestNaClManifest(PP_Instance instance, |
const char* url, |
- int32_t* out_manifest_id, |
PP_CompletionCallback callback) { |
NexeLoadManager* load_manager = GetNexeLoadManager(instance); |
DCHECK(load_manager); |
@@ -870,8 +862,8 @@ void RequestNaClManifest(PP_Instance instance, |
int32_t error = PP_ERROR_FAILED; |
if (net::DataURL::Parse(gurl, &mime_type, &charset, &data)) { |
if (data.size() <= ManifestDownloader::kNaClManifestMaxFileBytes) { |
- error = PP_OK; |
- *out_manifest_id = CreateJsonManifest(instance, base_url.spec(), data); |
+ if (CreateJsonManifest(instance, base_url.spec(), data)) |
+ error = PP_OK; |
} else { |
load_manager->ReportLoadError(PP_NACL_ERROR_MANIFEST_TOO_LARGE, |
"manifest file too large."); |
@@ -884,7 +876,7 @@ void RequestNaClManifest(PP_Instance instance, |
FROM_HERE, |
base::Bind(callback.func, callback.user_data, error)); |
} else { |
- DownloadManifestToBuffer(instance, out_manifest_id, callback); |
+ DownloadManifestToBuffer(instance, callback); |
} |
} |
@@ -923,13 +915,11 @@ PP_Bool DevInterfacesEnabled(PP_Instance instance) { |
void DownloadManifestToBufferCompletion(PP_Instance instance, |
struct PP_CompletionCallback callback, |
- int32_t* out_manifest_id, |
base::Time start_time, |
PP_NaClError pp_nacl_error, |
const std::string& data); |
void DownloadManifestToBuffer(PP_Instance instance, |
- int32_t* out_manifest_id, |
struct PP_CompletionCallback callback) { |
nacl::NexeLoadManager* load_manager = GetNexeLoadManager(instance); |
DCHECK(load_manager); |
@@ -954,13 +944,12 @@ void DownloadManifestToBuffer(PP_Instance instance, |
url_loader.Pass(), |
load_manager->is_installed(), |
base::Bind(DownloadManifestToBufferCompletion, |
- instance, callback, out_manifest_id, base::Time::Now())); |
+ instance, callback, base::Time::Now())); |
manifest_downloader->Load(request); |
} |
void DownloadManifestToBufferCompletion(PP_Instance instance, |
struct PP_CompletionCallback callback, |
- int32_t* out_manifest_id, |
base::Time start_time, |
PP_NaClError pp_nacl_error, |
const std::string& data) { |
@@ -1003,26 +992,21 @@ void DownloadManifestToBufferCompletion(PP_Instance instance, |
if (pp_error == PP_OK) { |
std::string base_url = load_manager->manifest_base_url().spec(); |
- *out_manifest_id = CreateJsonManifest(instance, base_url, data); |
+ if (!CreateJsonManifest(instance, base_url, data)) |
+ pp_error = PP_ERROR_FAILED; |
} |
callback.func(callback.user_data, pp_error); |
} |
-int32_t CreatePNaClManifest(PP_Instance /* instance */) { |
- return GetPNaClManifestId(); |
-} |
- |
-int32_t CreateJsonManifest(PP_Instance instance, |
- const std::string& manifest_url, |
- const std::string& manifest_data) { |
+bool CreateJsonManifest(PP_Instance instance, |
+ const std::string& manifest_url, |
+ const std::string& manifest_data) { |
HistogramSizeKB("NaCl.Perf.Size.Manifest", |
static_cast<int32_t>(manifest_data.length() / 1024)); |
nacl::NexeLoadManager* load_manager = GetNexeLoadManager(instance); |
if (!load_manager) |
- return -1; |
- int32_t manifest_id = g_next_manifest_id.Get(); |
- g_next_manifest_id.Get()++; |
+ return false; |
const char* isa_type; |
if (load_manager->IsPNaCl()) |
@@ -1038,36 +1022,20 @@ int32_t CreateJsonManifest(PP_Instance instance, |
PP_ToBool(NaClDebugEnabledForURL(manifest_url.c_str())))); |
JsonManifest::ErrorInfo error_info; |
if (j->Init(manifest_data.c_str(), &error_info)) { |
- g_manifest_map.Get().add(manifest_id, j.Pass()); |
- return manifest_id; |
+ g_manifest_map.Get().add(instance, j.Pass()); |
+ return true; |
} |
load_manager->ReportLoadError(error_info.error, error_info.string); |
- return -1; |
-} |
- |
-void DestroyManifest(PP_Instance /* instance */, |
- int32_t manifest_id) { |
- if (manifest_id == GetPNaClManifestId()) |
- return; |
- g_manifest_map.Get().erase(manifest_id); |
+ return false; |
} |
PP_Bool ManifestGetProgramURL(PP_Instance instance, |
- int32_t manifest_id, |
PP_Var* pp_full_url, |
PP_PNaClOptions* pnacl_options, |
PP_Bool* pp_uses_nonsfi_mode) { |
nacl::NexeLoadManager* load_manager = GetNexeLoadManager(instance); |
- if (manifest_id == GetPNaClManifestId()) { |
- if (load_manager) { |
- load_manager->ReportLoadError( |
- PP_NACL_ERROR_MANIFEST_GET_NEXE_URL, |
- "pnacl manifest does not contain a program."); |
- } |
- return PP_FALSE; |
- } |
- JsonManifestMap::iterator it = g_manifest_map.Get().find(manifest_id); |
+ JsonManifestMap::iterator it = g_manifest_map.Get().find(instance); |
if (it == g_manifest_map.Get().end()) |
return PP_FALSE; |
@@ -1087,11 +1055,13 @@ PP_Bool ManifestGetProgramURL(PP_Instance instance, |
} |
PP_Bool ManifestResolveKey(PP_Instance instance, |
- int32_t manifest_id, |
+ PP_Bool is_helper_process, |
const char* key, |
PP_Var* pp_full_url, |
PP_PNaClOptions* pnacl_options) { |
- if (manifest_id == GetPNaClManifestId()) { |
+ // For "helper" processes (llc and ld), we resolve keys manually as there is |
+ // no existing .nmf file to parse. |
+ if (PP_ToBool(is_helper_process)) { |
pnacl_options->translate = PP_FALSE; |
// We can only resolve keys in the files/ namespace. |
const std::string kFilesPrefix = "files/"; |
@@ -1111,7 +1081,7 @@ PP_Bool ManifestResolveKey(PP_Instance instance, |
return PP_TRUE; |
} |
- JsonManifestMap::iterator it = g_manifest_map.Get().find(manifest_id); |
+ JsonManifestMap::iterator it = g_manifest_map.Get().find(instance); |
if (it == g_manifest_map.Get().end()) |
return PP_FALSE; |
@@ -1542,8 +1512,6 @@ const PPB_NaCl_Private nacl_interface = { |
&ProcessNaClManifest, |
&GetManifestURLArgument, |
&DevInterfacesEnabled, |
- &CreatePNaClManifest, |
- &DestroyManifest, |
&ManifestGetProgramURL, |
&ManifestResolveKey, |
&GetPNaClResourceInfo, |