Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(399)

Side by Side Diff: ppapi/native_client/src/trusted/plugin/plugin.cc

Issue 264943003: Pepper: Move manifest logic to components/nacl. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix typo Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifdef _MSC_VER 5 #ifdef _MSC_VER
6 // Do not warn about use of std::copy with raw pointers. 6 // Do not warn about use of std::copy with raw pointers.
7 #pragma warning(disable : 4996) 7 #pragma warning(disable : 4996)
8 #endif 8 #endif
9 9
10 #include "ppapi/native_client/src/trusted/plugin/plugin.h" 10 #include "ppapi/native_client/src/trusted/plugin/plugin.h"
(...skipping 16 matching lines...) Expand all
27 #include "native_client/src/trusted/desc/nacl_desc_wrapper.h" 27 #include "native_client/src/trusted/desc/nacl_desc_wrapper.h"
28 #include "native_client/src/trusted/nonnacl_util/sel_ldr_launcher.h" 28 #include "native_client/src/trusted/nonnacl_util/sel_ldr_launcher.h"
29 #include "native_client/src/trusted/service_runtime/nacl_error_code.h" 29 #include "native_client/src/trusted/service_runtime/nacl_error_code.h"
30 30
31 #include "ppapi/c/pp_errors.h" 31 #include "ppapi/c/pp_errors.h"
32 #include "ppapi/c/ppb_var.h" 32 #include "ppapi/c/ppb_var.h"
33 #include "ppapi/c/private/ppb_nacl_private.h" 33 #include "ppapi/c/private/ppb_nacl_private.h"
34 #include "ppapi/cpp/dev/url_util_dev.h" 34 #include "ppapi/cpp/dev/url_util_dev.h"
35 #include "ppapi/cpp/module.h" 35 #include "ppapi/cpp/module.h"
36 36
37 #include "ppapi/native_client/src/trusted/plugin/json_manifest.h"
38 #include "ppapi/native_client/src/trusted/plugin/nacl_entry_points.h" 37 #include "ppapi/native_client/src/trusted/plugin/nacl_entry_points.h"
39 #include "ppapi/native_client/src/trusted/plugin/nacl_subprocess.h" 38 #include "ppapi/native_client/src/trusted/plugin/nacl_subprocess.h"
40 #include "ppapi/native_client/src/trusted/plugin/plugin_error.h" 39 #include "ppapi/native_client/src/trusted/plugin/plugin_error.h"
41 #include "ppapi/native_client/src/trusted/plugin/service_runtime.h" 40 #include "ppapi/native_client/src/trusted/plugin/service_runtime.h"
42 #include "ppapi/native_client/src/trusted/plugin/utility.h" 41 #include "ppapi/native_client/src/trusted/plugin/utility.h"
43 42
44 namespace plugin { 43 namespace plugin {
45 44
46 namespace { 45 namespace {
47 46
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
129 // error. 128 // error.
130 // Note: installed files may have "0" for a status code. 129 // Note: installed files may have "0" for a status code.
131 if (status < 0 || status >= 600) 130 if (status < 0 || status >= 600)
132 sample = 6; 131 sample = 6;
133 HistogramEnumerate(name, sample, 7, 6); 132 HistogramEnumerate(name, sample, 7, 6);
134 } 133 }
135 134
136 bool Plugin::LoadNaClModuleFromBackgroundThread( 135 bool Plugin::LoadNaClModuleFromBackgroundThread(
137 nacl::DescWrapper* wrapper, 136 nacl::DescWrapper* wrapper,
138 NaClSubprocess* subprocess, 137 NaClSubprocess* subprocess,
139 const Manifest* manifest, 138 int32_t manifest_id,
140 const SelLdrStartParams& params) { 139 const SelLdrStartParams& params) {
141 CHECK(!pp::Module::Get()->core()->IsMainThread()); 140 CHECK(!pp::Module::Get()->core()->IsMainThread());
142 ServiceRuntime* service_runtime = 141 ServiceRuntime* service_runtime =
143 new ServiceRuntime(this, manifest, false, uses_nonsfi_mode_, 142 new ServiceRuntime(this, manifest_id, false, uses_nonsfi_mode_,
144 pp::BlockUntilComplete(), pp::BlockUntilComplete()); 143 pp::BlockUntilComplete(), pp::BlockUntilComplete());
145 subprocess->set_service_runtime(service_runtime); 144 subprocess->set_service_runtime(service_runtime);
146 PLUGIN_PRINTF(("Plugin::LoadNaClModuleFromBackgroundThread " 145 PLUGIN_PRINTF(("Plugin::LoadNaClModuleFromBackgroundThread "
147 "(service_runtime=%p)\n", 146 "(service_runtime=%p)\n",
148 static_cast<void*>(service_runtime))); 147 static_cast<void*>(service_runtime)));
149 148
150 // Now start the SelLdr instance. This must be created on the main thread. 149 // Now start the SelLdr instance. This must be created on the main thread.
151 bool service_runtime_started = false; 150 bool service_runtime_started = false;
152 pp::CompletionCallback sel_ldr_callback = 151 pp::CompletionCallback sel_ldr_callback =
153 callback_factory_.NewCallback(&Plugin::SignalStartSelLdrDone, 152 callback_factory_.NewCallback(&Plugin::SignalStartSelLdrDone,
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
221 SelLdrStartParams params(manifest_base_url_str, 220 SelLdrStartParams params(manifest_base_url_str,
222 true /* uses_irt */, 221 true /* uses_irt */,
223 true /* uses_ppapi */, 222 true /* uses_ppapi */,
224 uses_nonsfi_mode, 223 uses_nonsfi_mode,
225 enable_dev_interfaces, 224 enable_dev_interfaces,
226 enable_dyncode_syscalls, 225 enable_dyncode_syscalls,
227 enable_exception_handling, 226 enable_exception_handling,
228 enable_crash_throttling); 227 enable_crash_throttling);
229 ErrorInfo error_info; 228 ErrorInfo error_info;
230 ServiceRuntime* service_runtime = 229 ServiceRuntime* service_runtime =
231 new ServiceRuntime(this, manifest_.get(), true, uses_nonsfi_mode, 230 new ServiceRuntime(this, manifest_id_, true, uses_nonsfi_mode,
232 init_done_cb, crash_cb); 231 init_done_cb, crash_cb);
233 main_subprocess_.set_service_runtime(service_runtime); 232 main_subprocess_.set_service_runtime(service_runtime);
234 PLUGIN_PRINTF(("Plugin::LoadNaClModule (service_runtime=%p)\n", 233 PLUGIN_PRINTF(("Plugin::LoadNaClModule (service_runtime=%p)\n",
235 static_cast<void*>(service_runtime))); 234 static_cast<void*>(service_runtime)));
236 if (NULL == service_runtime) { 235 if (NULL == service_runtime) {
237 error_info.SetReport( 236 error_info.SetReport(
238 PP_NACL_ERROR_SEL_LDR_INIT, 237 PP_NACL_ERROR_SEL_LDR_INIT,
239 "sel_ldr init failure " + main_subprocess_.description()); 238 "sel_ldr init failure " + main_subprocess_.description());
240 ReportLoadError(error_info); 239 ReportLoadError(error_info);
241 return; 240 return;
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
286 bool result = PP_ToBool(nacl_interface_->StartPpapiProxy(pp_instance())); 285 bool result = PP_ToBool(nacl_interface_->StartPpapiProxy(pp_instance()));
287 if (result) { 286 if (result) {
288 PLUGIN_PRINTF(("Plugin::LoadNaClModule (%s)\n", 287 PLUGIN_PRINTF(("Plugin::LoadNaClModule (%s)\n",
289 main_subprocess_.detailed_description().c_str())); 288 main_subprocess_.detailed_description().c_str()));
290 } 289 }
291 return result; 290 return result;
292 } 291 }
293 292
294 NaClSubprocess* Plugin::LoadHelperNaClModule(const nacl::string& helper_url, 293 NaClSubprocess* Plugin::LoadHelperNaClModule(const nacl::string& helper_url,
295 nacl::DescWrapper* wrapper, 294 nacl::DescWrapper* wrapper,
296 const Manifest* manifest, 295 int32_t manifest_id,
297 ErrorInfo* error_info) { 296 ErrorInfo* error_info) {
298 nacl::scoped_ptr<NaClSubprocess> nacl_subprocess( 297 nacl::scoped_ptr<NaClSubprocess> nacl_subprocess(
299 new NaClSubprocess("helper module", NULL, NULL)); 298 new NaClSubprocess("helper module", NULL, NULL));
300 if (NULL == nacl_subprocess.get()) { 299 if (NULL == nacl_subprocess.get()) {
301 error_info->SetReport(PP_NACL_ERROR_SEL_LDR_INIT, 300 error_info->SetReport(PP_NACL_ERROR_SEL_LDR_INIT,
302 "unable to allocate helper subprocess."); 301 "unable to allocate helper subprocess.");
303 return NULL; 302 return NULL;
304 } 303 }
305 304
306 // Do not report UMA stats for translator-related nexes. 305 // Do not report UMA stats for translator-related nexes.
307 // TODO(sehr): define new UMA stats for translator related nexe events. 306 // TODO(sehr): define new UMA stats for translator related nexe events.
308 // NOTE: The PNaCl translator nexes are not built to use the IRT. This is 307 // NOTE: The PNaCl translator nexes are not built to use the IRT. This is
309 // done to save on address space and swap space. 308 // done to save on address space and swap space.
310 // TODO(jvoung): See if we still need the uses_ppapi variable, now that 309 // TODO(jvoung): See if we still need the uses_ppapi variable, now that
311 // LaunchSelLdr always happens on the main thread. 310 // LaunchSelLdr always happens on the main thread.
312 bool enable_dev_interfaces = 311 bool enable_dev_interfaces =
313 nacl_interface_->DevInterfacesEnabled(pp_instance()); 312 nacl_interface_->DevInterfacesEnabled(pp_instance());
314 SelLdrStartParams params(helper_url, 313 SelLdrStartParams params(helper_url,
315 false /* uses_irt */, 314 false /* uses_irt */,
316 false /* uses_ppapi */, 315 false /* uses_ppapi */,
317 false /* uses_nonsfi_mode */, 316 false /* uses_nonsfi_mode */,
318 enable_dev_interfaces, 317 enable_dev_interfaces,
319 false /* enable_dyncode_syscalls */, 318 false /* enable_dyncode_syscalls */,
320 false /* enable_exception_handling */, 319 false /* enable_exception_handling */,
321 true /* enable_crash_throttling */); 320 true /* enable_crash_throttling */);
322 if (!LoadNaClModuleFromBackgroundThread(wrapper, nacl_subprocess.get(), 321 if (!LoadNaClModuleFromBackgroundThread(wrapper, nacl_subprocess.get(),
323 manifest, params)) { 322 manifest_id, params)) {
324 return NULL; 323 return NULL;
325 } 324 }
326 // We need not wait for the init_done callback. We can block 325 // We need not wait for the init_done callback. We can block
327 // here in StartSrpcServices, since helper NaCl modules 326 // here in StartSrpcServices, since helper NaCl modules
328 // are spawned from a private thread. 327 // are spawned from a private thread.
329 // 328 //
330 // TODO(bsy): if helper module crashes, we should abort. 329 // TODO(bsy): if helper module crashes, we should abort.
331 // crash_cb is not used here, so we are relying on crashes 330 // crash_cb is not used here, so we are relying on crashes
332 // being detected in StartSrpcServices or later. 331 // being detected in StartSrpcServices or later.
333 // 332 //
(...skipping 29 matching lines...) Expand all
363 return true; 362 return true;
364 } 363 }
365 364
366 Plugin::Plugin(PP_Instance pp_instance) 365 Plugin::Plugin(PP_Instance pp_instance)
367 : pp::Instance(pp_instance), 366 : pp::Instance(pp_instance),
368 main_subprocess_("main subprocess", NULL, NULL), 367 main_subprocess_("main subprocess", NULL, NULL),
369 uses_nonsfi_mode_(false), 368 uses_nonsfi_mode_(false),
370 wrapper_factory_(NULL), 369 wrapper_factory_(NULL),
371 time_of_last_progress_event_(0), 370 time_of_last_progress_event_(0),
372 nexe_open_time_(-1), 371 nexe_open_time_(-1),
372 manifest_id_(-1),
373 nacl_interface_(NULL), 373 nacl_interface_(NULL),
374 uma_interface_(this) { 374 uma_interface_(this) {
375 PLUGIN_PRINTF(("Plugin::Plugin (this=%p, pp_instance=%" 375 PLUGIN_PRINTF(("Plugin::Plugin (this=%p, pp_instance=%"
376 NACL_PRId32 ")\n", static_cast<void*>(this), pp_instance)); 376 NACL_PRId32 ")\n", static_cast<void*>(this), pp_instance));
377 callback_factory_.Initialize(this); 377 callback_factory_.Initialize(this);
378 nexe_downloader_.Initialize(this); 378 nexe_downloader_.Initialize(this);
379 nacl_interface_ = GetNaClInterface(); 379 nacl_interface_ = GetNaClInterface();
380 CHECK(nacl_interface_ != NULL); 380 CHECK(nacl_interface_ != NULL);
381 381
382 // Notify PPB_NaCl_Private that the instance is created before altering any 382 // Notify PPB_NaCl_Private that the instance is created before altering any
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after
573 ProcessNaClManifest(json_buffer); 573 ProcessNaClManifest(json_buffer);
574 } 574 }
575 } 575 }
576 576
577 void Plugin::ProcessNaClManifest(const nacl::string& manifest_json) { 577 void Plugin::ProcessNaClManifest(const nacl::string& manifest_json) {
578 HistogramSizeKB("NaCl.Perf.Size.Manifest", 578 HistogramSizeKB("NaCl.Perf.Size.Manifest",
579 static_cast<int32_t>(manifest_json.length() / 1024)); 579 static_cast<int32_t>(manifest_json.length() / 1024));
580 if (!SetManifestObject(manifest_json)) 580 if (!SetManifestObject(manifest_json))
581 return; 581 return;
582 582
583 nacl::string program_url; 583 PP_Var pp_program_url;
584 PP_PNaClOptions pnacl_options = {PP_FALSE, PP_FALSE, 2}; 584 PP_PNaClOptions pnacl_options = {PP_FALSE, PP_FALSE, 2};
585 bool uses_nonsfi_mode; 585 PP_Bool uses_nonsfi_mode;
586 ErrorInfo error_info; 586 if (nacl_interface_->GetManifestProgramURL(pp_instance(),
587 if (manifest_->GetProgramURL( 587 manifest_id_, &pp_program_url, &pnacl_options, &uses_nonsfi_mode)) {
588 &program_url, &pnacl_options, &uses_nonsfi_mode, &error_info)) { 588 std::string program_url = pp::Var(pp::PASS_REF, pp_program_url).AsString();
589 // TODO(teravest): Make ProcessNaClManifest take responsibility for more of 589 // TODO(teravest): Make ProcessNaClManifest take responsibility for more of
590 // this function. 590 // this function.
591 nacl_interface_->ProcessNaClManifest(pp_instance(), program_url.c_str()); 591 nacl_interface_->ProcessNaClManifest(pp_instance(), program_url.c_str());
592 uses_nonsfi_mode_ = uses_nonsfi_mode; 592 uses_nonsfi_mode_ = PP_ToBool(uses_nonsfi_mode);
593 if (pnacl_options.translate) { 593 if (pnacl_options.translate) {
594 pp::CompletionCallback translate_callback = 594 pp::CompletionCallback translate_callback =
595 callback_factory_.NewCallback(&Plugin::BitcodeDidTranslate); 595 callback_factory_.NewCallback(&Plugin::BitcodeDidTranslate);
596 // Will always call the callback on success or failure.
597 pnacl_coordinator_.reset( 596 pnacl_coordinator_.reset(
598 PnaclCoordinator::BitcodeToNative(this, 597 PnaclCoordinator::BitcodeToNative(this,
599 program_url, 598 program_url,
600 pnacl_options, 599 pnacl_options,
601 translate_callback)); 600 translate_callback));
602 return; 601 return;
603 } else { 602 } else {
604 nexe_open_time_ = NaClGetTimeOfDayMicroseconds(); 603 nexe_open_time_ = NaClGetTimeOfDayMicroseconds();
605 // Try the fast path first. This will only block if the file is installed. 604 // Try the fast path first. This will only block if the file is installed.
606 if (OpenURLFast(program_url, &nexe_downloader_)) { 605 if (OpenURLFast(program_url, &nexe_downloader_)) {
607 NexeFileDidOpen(PP_OK); 606 NexeFileDidOpen(PP_OK);
608 } else { 607 } else {
609 pp::CompletionCallback open_callback = 608 pp::CompletionCallback open_callback =
610 callback_factory_.NewCallback(&Plugin::NexeFileDidOpen); 609 callback_factory_.NewCallback(&Plugin::NexeFileDidOpen);
611 // Will always call the callback on success or failure. 610 // Will always call the callback on success or failure.
612 CHECK( 611 CHECK(
613 nexe_downloader_.Open(program_url, 612 nexe_downloader_.Open(program_url,
614 DOWNLOAD_TO_FILE, 613 DOWNLOAD_TO_FILE,
615 open_callback, 614 open_callback,
616 true, 615 true,
617 &UpdateDownloadProgress)); 616 &UpdateDownloadProgress));
618 } 617 }
619 return; 618 return;
620 } 619 }
621 } 620 }
622 // Failed to select the program and/or the translator.
623 ReportLoadError(error_info);
624 } 621 }
625 622
626 void Plugin::RequestNaClManifest(const nacl::string& url) { 623 void Plugin::RequestNaClManifest(const nacl::string& url) {
627 PLUGIN_PRINTF(("Plugin::RequestNaClManifest (url='%s')\n", url.c_str())); 624 PLUGIN_PRINTF(("Plugin::RequestNaClManifest (url='%s')\n", url.c_str()));
628 PP_Bool is_data_uri; 625 PP_Bool is_data_uri;
629 ErrorInfo error_info; 626 ErrorInfo error_info;
630 if (!nacl_interface_->RequestNaClManifest(pp_instance(), url.c_str(), 627 if (!nacl_interface_->RequestNaClManifest(pp_instance(), url.c_str(),
631 &is_data_uri)) 628 &is_data_uri))
632 return; 629 return;
633 pp::Var nmf_resolved_url = 630 pp::Var nmf_resolved_url =
(...skipping 22 matching lines...) Expand all
656 pp_instance(), 653 pp_instance(),
657 &manifest_data_var_, 654 &manifest_data_var_,
658 open_callback.pp_completion_callback()); 655 open_callback.pp_completion_callback());
659 } 656 }
660 } 657 }
661 658
662 659
663 bool Plugin::SetManifestObject(const nacl::string& manifest_json) { 660 bool Plugin::SetManifestObject(const nacl::string& manifest_json) {
664 PLUGIN_PRINTF(("Plugin::SetManifestObject(): manifest_json='%s'.\n", 661 PLUGIN_PRINTF(("Plugin::SetManifestObject(): manifest_json='%s'.\n",
665 manifest_json.c_str())); 662 manifest_json.c_str()));
666 ErrorInfo error_info;
667
668 // Determine whether lookups should use portable (i.e., pnacl versions) 663 // Determine whether lookups should use portable (i.e., pnacl versions)
669 // rather than platform-specific files. 664 // rather than platform-specific files.
670 bool is_pnacl = nacl_interface_->IsPNaCl(pp_instance()); 665 bool is_pnacl = nacl_interface_->IsPNaCl(pp_instance());
671 bool nonsfi_mode_enabled =
672 PP_ToBool(nacl_interface_->IsNonSFIModeEnabled());
673 pp::Var manifest_base_url = 666 pp::Var manifest_base_url =
674 pp::Var(pp::PASS_REF, nacl_interface_->GetManifestBaseURL(pp_instance())); 667 pp::Var(pp::PASS_REF, nacl_interface_->GetManifestBaseURL(pp_instance()));
675 std::string manifest_base_url_str = manifest_base_url.AsString(); 668 std::string manifest_base_url_str = manifest_base_url.AsString();
676 bool pnacl_debug = GetNaClInterface()->NaClDebugEnabledForURL(
677 manifest_base_url_str.c_str());
678 const char* sandbox_isa = nacl_interface_->GetSandboxArch(); 669 const char* sandbox_isa = nacl_interface_->GetSandboxArch();
679 nacl::scoped_ptr<JsonManifest> json_manifest( 670
680 new JsonManifest(pp::URLUtil_Dev::Get(), 671 int32_t manifest_id = nacl_interface_->CreateJsonManifest(
681 manifest_base_url_str, 672 pp_instance(),
682 (is_pnacl ? kPortableArch : sandbox_isa), 673 manifest_base_url_str.c_str(),
683 nonsfi_mode_enabled, 674 is_pnacl ? kPortableArch : sandbox_isa,
684 pnacl_debug)); 675 manifest_json.c_str());
685 if (!json_manifest->Init(manifest_json, &error_info)) { 676 if (manifest_id == -1)
686 ReportLoadError(error_info);
687 return false; 677 return false;
688 } 678 manifest_id_ = manifest_id;
689 manifest_.reset(json_manifest.release());
690 return true; 679 return true;
691 } 680 }
692 681
693 void Plugin::UrlDidOpenForStreamAsFile( 682 void Plugin::UrlDidOpenForStreamAsFile(
694 int32_t pp_error, 683 int32_t pp_error,
695 FileDownloader* url_downloader, 684 FileDownloader* url_downloader,
696 pp::CompletionCallback callback) { 685 pp::CompletionCallback callback) {
697 PLUGIN_PRINTF(("Plugin::UrlDidOpen (pp_error=%" NACL_PRId32 686 PLUGIN_PRINTF(("Plugin::UrlDidOpen (pp_error=%" NACL_PRId32
698 ", url_downloader=%p)\n", pp_error, 687 ", url_downloader=%p)\n", pp_error,
699 static_cast<void*>(url_downloader))); 688 static_cast<void*>(url_downloader)));
(...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after
898 887
899 void Plugin::SetExitStatusOnMainThread(int32_t pp_error, 888 void Plugin::SetExitStatusOnMainThread(int32_t pp_error,
900 int exit_status) { 889 int exit_status) {
901 DCHECK(pp::Module::Get()->core()->IsMainThread()); 890 DCHECK(pp::Module::Get()->core()->IsMainThread());
902 DCHECK(nacl_interface_); 891 DCHECK(nacl_interface_);
903 nacl_interface_->SetExitStatus(pp_instance(), exit_status); 892 nacl_interface_->SetExitStatus(pp_instance(), exit_status);
904 } 893 }
905 894
906 895
907 } // namespace plugin 896 } // namespace plugin
OLDNEW
« no previous file with comments | « ppapi/native_client/src/trusted/plugin/plugin.h ('k') | ppapi/native_client/src/trusted/plugin/plugin.gypi » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698