| Index: components/nacl/renderer/plugin/plugin.cc
|
| diff --git a/components/nacl/renderer/plugin/plugin.cc b/components/nacl/renderer/plugin/plugin.cc
|
| index 89c5db7556d4270866085c26e8750051e411717c..a790696f5a1baf5b843d86cf4afbff8ba0c8e79d 100644
|
| --- a/components/nacl/renderer/plugin/plugin.cc
|
| +++ b/components/nacl/renderer/plugin/plugin.cc
|
| @@ -38,78 +38,12 @@ void Plugin::ShutDownSubprocesses() {
|
| static_cast<void*>(this)));
|
| }
|
|
|
| -bool Plugin::LoadHelperNaClModuleInternal(NaClSubprocess* subprocess,
|
| - const SelLdrStartParams& params) {
|
| - CHECK(!pp::Module::Get()->core()->IsMainThread());
|
| - ServiceRuntime* service_runtime =
|
| - new ServiceRuntime(this,
|
| - pp_instance(),
|
| - false, // No main_service_runtime.
|
| - false); // No non-SFI mode (i.e. in SFI-mode).
|
| -
|
| - // Now start the SelLdr instance. This must be created on the main thread.
|
| - bool service_runtime_started = false;
|
| - pp::CompletionCallback sel_ldr_callback =
|
| - callback_factory_.NewCallback(&Plugin::SignalStartSelLdrDone,
|
| - &service_runtime_started,
|
| - service_runtime);
|
| - pp::CompletionCallback callback =
|
| - callback_factory_.NewCallback(&Plugin::StartSelLdrOnMainThread,
|
| - service_runtime, params,
|
| - sel_ldr_callback);
|
| - pp::Module::Get()->core()->CallOnMainThread(0, callback, 0);
|
| - if (!service_runtime->WaitForSelLdrStart()) {
|
| - PLUGIN_PRINTF(("Plugin::LoadHelperNaClModule "
|
| - "WaitForSelLdrStart timed out!\n"));
|
| - service_runtime->Shutdown();
|
| - // Don't delete service_runtime here; it could still be used by the pending
|
| - // SignalStartSelLdrDone callback.
|
| - return false;
|
| - }
|
| - PLUGIN_PRINTF(("Plugin::LoadHelperNaClModule (service_runtime_started=%d)\n",
|
| - service_runtime_started));
|
| - if (!service_runtime_started) {
|
| - service_runtime->Shutdown();
|
| - delete service_runtime;
|
| - return false;
|
| - }
|
| -
|
| - // Now actually start the nexe.
|
| - //
|
| - // We can't use pp::BlockUntilComplete() inside an in-process plugin, so we
|
| - // have to roll our own blocking logic, similar to WaitForSelLdrStart()
|
| - // above, except without timeout logic.
|
| - pp::Module::Get()->core()->CallOnMainThread(
|
| - 0,
|
| - callback_factory_.NewCallback(&Plugin::StartNexe, service_runtime));
|
| - if (!service_runtime->WaitForNexeStart()) {
|
| - service_runtime->Shutdown();
|
| - delete service_runtime;
|
| - return false;
|
| - }
|
| - subprocess->set_service_runtime(service_runtime);
|
| - return true;
|
| -}
|
| -
|
| -void Plugin::StartSelLdrOnMainThread(int32_t pp_error,
|
| - ServiceRuntime* service_runtime,
|
| - const SelLdrStartParams& params,
|
| - pp::CompletionCallback callback) {
|
| - CHECK(pp_error == PP_OK);
|
| +void Plugin::StartSelLdr(ServiceRuntime* service_runtime,
|
| + const SelLdrStartParams& params,
|
| + pp::CompletionCallback callback) {
|
| service_runtime->StartSelLdr(params, callback);
|
| }
|
|
|
| -void Plugin::SignalStartSelLdrDone(int32_t pp_error,
|
| - bool* started,
|
| - ServiceRuntime* service_runtime) {
|
| - if (service_runtime->SelLdrWaitTimedOut()) {
|
| - delete service_runtime;
|
| - } else {
|
| - *started = (pp_error == PP_OK);
|
| - service_runtime->SignalStartSelLdrDone();
|
| - }
|
| -}
|
| -
|
| void Plugin::LoadNaClModule(PP_NaClFileInfo file_info,
|
| bool uses_nonsfi_mode,
|
| PP_NaClAppProcessType process_type) {
|
| @@ -142,8 +76,7 @@ void Plugin::LoadNaClModule(PP_NaClFileInfo file_info,
|
| // callback here for |callback|.
|
| pp::CompletionCallback callback = callback_factory_.NewCallback(
|
| &Plugin::StartNexe, service_runtime);
|
| - StartSelLdrOnMainThread(
|
| - static_cast<int32_t>(PP_OK), service_runtime, params, callback);
|
| + StartSelLdr(service_runtime, params, callback);
|
| }
|
|
|
| void Plugin::StartNexe(int32_t pp_error, ServiceRuntime* service_runtime) {
|
| @@ -153,53 +86,43 @@ void Plugin::StartNexe(int32_t pp_error, ServiceRuntime* service_runtime) {
|
| service_runtime->StartNexe();
|
| }
|
|
|
| -NaClSubprocess* Plugin::LoadHelperNaClModule(const std::string& helper_url,
|
| - PP_NaClFileInfo file_info,
|
| - ErrorInfo* error_info) {
|
| - nacl::scoped_ptr<NaClSubprocess> nacl_subprocess(
|
| - new NaClSubprocess("helper module", NULL, NULL));
|
| - if (NULL == nacl_subprocess.get()) {
|
| - error_info->SetReport(PP_NACL_ERROR_SEL_LDR_INIT,
|
| - "unable to allocate helper subprocess.");
|
| - return NULL;
|
| - }
|
| -
|
| +void Plugin::LoadHelperNaClModule(const std::string& helper_url,
|
| + PP_NaClFileInfo file_info,
|
| + NaClSubprocess* subprocess_to_init,
|
| + pp::CompletionCallback callback) {
|
| + CHECK(pp::Module::Get()->core()->IsMainThread());
|
| // Do not report UMA stats for translator-related nexes.
|
| // TODO(sehr): define new UMA stats for translator related nexe events.
|
| - // NOTE: The PNaCl translator nexes are not built to use the IRT. This is
|
| - // done to save on address space and swap space.
|
| SelLdrStartParams params(helper_url,
|
| file_info,
|
| PP_PNACL_TRANSLATOR_PROCESS_TYPE);
|
| + ServiceRuntime* service_runtime =
|
| + new ServiceRuntime(this, pp_instance(),
|
| + false, // Not main_service_runtime.
|
| + false); // No non-SFI mode (i.e. in SFI-mode).
|
| + subprocess_to_init->set_service_runtime(service_runtime);
|
| + pp::CompletionCallback sel_ldr_callback = callback_factory_.NewCallback(
|
| + &Plugin::StartHelperNexe, subprocess_to_init, callback);
|
| + StartSelLdr(service_runtime, params, sel_ldr_callback);
|
| +}
|
|
|
| - // Helper NaCl modules always use the PNaCl manifest, as there is no
|
| - // corresponding NMF.
|
| - if (!LoadHelperNaClModuleInternal(nacl_subprocess.get(), params))
|
| - return NULL;
|
| -
|
| - // We can block here in StartSrpcServices, since helper NaCl
|
| - // modules are spawned from a private thread.
|
| - //
|
| - // TODO(bsy): if helper module crashes, we should abort.
|
| - // crash_cb is not used here, so we are relying on crashes
|
| - // being detected in StartSrpcServices or later.
|
| - //
|
| - // NB: More refactoring might be needed, however, if helper
|
| - // NaCl modules have their own manifest. Currently the
|
| - // manifest is a per-plugin-instance object, not a per
|
| - // NaClSubprocess object.
|
| - if (!nacl_subprocess->StartSrpcServices()) {
|
| - error_info->SetReport(PP_NACL_ERROR_SRPC_CONNECTION_FAIL,
|
| - "SRPC connection failure for " +
|
| - nacl_subprocess->description());
|
| - return NULL;
|
| +void Plugin::StartHelperNexe(int32_t pp_error,
|
| + NaClSubprocess* subprocess_to_init,
|
| + pp::CompletionCallback callback) {
|
| + CHECK(pp::Module::Get()->core()->IsMainThread());
|
| + if (pp_error != PP_OK) {
|
| + callback.RunAndClear(pp_error);
|
| + return;
|
| }
|
| -
|
| - PLUGIN_PRINTF(("Plugin::LoadHelperNaClModule (%s, %s)\n",
|
| - helper_url.c_str(),
|
| - nacl_subprocess.get()->detailed_description().c_str()));
|
| -
|
| - return nacl_subprocess.release();
|
| + // TODO(jvoung): This operation blocks. That's bad because this is the
|
| + // main thread. However, we could make it so that StartHelperNexe isn't
|
| + // called until the blocking is minimized. There is a hook in
|
| + // sel_main_chrome which indicates when the nexe load is done. If we hook
|
| + // up that hook to StartSelLdr's callback, then we'll only
|
| + // call StartNexe once the nexe load is done instead of blocking here
|
| + // until the nexe load is done.
|
| + subprocess_to_init->service_runtime()->StartNexe();
|
| + callback.RunAndClear(PP_OK);
|
| }
|
|
|
| // All failures of this function will show up as "Missing Plugin-in", so
|
|
|