Index: trunk/src/ppapi/native_client/src/trusted/plugin/pnacl_coordinator.cc |
=================================================================== |
--- trunk/src/ppapi/native_client/src/trusted/plugin/pnacl_coordinator.cc (revision 268294) |
+++ trunk/src/ppapi/native_client/src/trusted/plugin/pnacl_coordinator.cc (working copy) |
@@ -16,6 +16,7 @@ |
#include "ppapi/c/pp_errors.h" |
#include "ppapi/c/private/ppb_uma_private.h" |
+#include "ppapi/native_client/src/trusted/plugin/manifest.h" |
#include "ppapi/native_client/src/trusted/plugin/plugin.h" |
#include "ppapi/native_client/src/trusted/plugin/plugin_error.h" |
#include "ppapi/native_client/src/trusted/plugin/pnacl_translate_thread.h" |
@@ -25,6 +26,62 @@ |
namespace plugin { |
////////////////////////////////////////////////////////////////////// |
+// Pnacl-specific manifest support. |
+////////////////////////////////////////////////////////////////////// |
+ |
+// The PNaCl linker gets file descriptors via the service runtime's |
+// reverse service lookup. The reverse service lookup requires a manifest. |
+// Normally, that manifest is an NMF containing mappings for shared libraries. |
+// Here, we provide a manifest that redirects to PNaCl component files |
+// that are part of Chrome. |
+class PnaclManifest : public Manifest { |
+ public: |
+ PnaclManifest(const nacl::string& sandbox_arch) |
+ : sandbox_arch_(sandbox_arch) { } |
+ |
+ virtual ~PnaclManifest() { } |
+ |
+ virtual bool GetProgramURL(nacl::string* full_url, |
+ PP_PNaClOptions* pnacl_options, |
+ bool* uses_nonsfi_mode, |
+ ErrorInfo* error_info) const { |
+ // Does not contain program urls. |
+ UNREFERENCED_PARAMETER(full_url); |
+ UNREFERENCED_PARAMETER(pnacl_options); |
+ UNREFERENCED_PARAMETER(uses_nonsfi_mode); |
+ UNREFERENCED_PARAMETER(error_info); |
+ PLUGIN_PRINTF(("PnaclManifest does not contain a program\n")); |
+ error_info->SetReport(PP_NACL_ERROR_MANIFEST_GET_NEXE_URL, |
+ "pnacl manifest does not contain a program."); |
+ return false; |
+ } |
+ |
+ virtual bool ResolveKey(const nacl::string& key, |
+ nacl::string* full_url, |
+ PP_PNaClOptions* pnacl_options) const { |
+ // All of the component files are native (do not require pnacl translate). |
+ pnacl_options->translate = PP_FALSE; |
+ // We can only resolve keys in the files/ namespace. |
+ const nacl::string kFilesPrefix = "files/"; |
+ size_t files_prefix_pos = key.find(kFilesPrefix); |
+ if (files_prefix_pos == nacl::string::npos) { |
+ PLUGIN_PRINTF(("key did not start with files/")); |
+ return false; |
+ } |
+ // Resolve the full URL to the file. Provide it with a platform-specific |
+ // prefix. |
+ nacl::string key_basename = key.substr(kFilesPrefix.length()); |
+ *full_url = PnaclUrls::GetBaseUrl() + sandbox_arch_ + "/" + key_basename; |
+ return true; |
+ } |
+ |
+ private: |
+ NACL_DISALLOW_COPY_AND_ASSIGN(PnaclManifest); |
+ |
+ nacl::string sandbox_arch_; |
+}; |
+ |
+////////////////////////////////////////////////////////////////////// |
// UMA stat helpers. |
////////////////////////////////////////////////////////////////////// |
@@ -123,10 +180,10 @@ |
new PnaclCoordinator(plugin, pexe_url, |
pnacl_options, |
translate_notify_callback); |
- PLUGIN_PRINTF(("PnaclCoordinator::BitcodeToNative (manifest_id=%d)\n", |
- coordinator->manifest_id_)); |
+ coordinator->pnacl_init_time_ = NaClGetTimeOfDayMicroseconds(); |
+ PLUGIN_PRINTF(("PnaclCoordinator::BitcodeToNative (manifest=%p, ", |
+ reinterpret_cast<const void*>(coordinator->manifest_.get()))); |
- coordinator->pnacl_init_time_ = NaClGetTimeOfDayMicroseconds(); |
int cpus = plugin->nacl_interface()->GetNumberOfProcessors(); |
coordinator->split_module_count_ = std::min(4, std::max(1, cpus)); |
@@ -147,8 +204,7 @@ |
plugin_(plugin), |
translate_notify_callback_(translate_notify_callback), |
translation_finished_reported_(false), |
- manifest_id_( |
- GetNaClInterface()->CreatePnaclManifest(plugin->pp_instance())), |
+ manifest_(new PnaclManifest(plugin->nacl_interface()->GetSandboxArch())), |
pexe_url_(pexe_url), |
pnacl_options_(pnacl_options), |
split_module_count_(1), |
@@ -612,7 +668,7 @@ |
CHECK(translate_thread_ != NULL); |
translate_thread_->RunTranslate(report_translate_finished, |
- manifest_id_, |
+ manifest_.get(), |
&obj_files_, |
temp_nexe_file_.get(), |
invalid_desc_wrapper_.get(), |