| Index: ppapi/native_client/src/trusted/plugin/service_runtime.cc
|
| diff --git a/ppapi/native_client/src/trusted/plugin/service_runtime.cc b/ppapi/native_client/src/trusted/plugin/service_runtime.cc
|
| index 6b549bb785c25640c4db31328f4d78044aa45b8b..a62272cb6fa6d08000411463858d84f0134ac4a4 100644
|
| --- a/ppapi/native_client/src/trusted/plugin/service_runtime.cc
|
| +++ b/ppapi/native_client/src/trusted/plugin/service_runtime.cc
|
| @@ -39,190 +39,9 @@
|
| #include "ppapi/native_client/src/trusted/plugin/sel_ldr_launcher_chrome.h"
|
| #include "ppapi/native_client/src/trusted/plugin/srpc_client.h"
|
| #include "ppapi/native_client/src/trusted/plugin/utility.h"
|
| -#include "ppapi/native_client/src/trusted/weak_ref/call_on_main_thread.h"
|
|
|
| namespace plugin {
|
|
|
| -OpenManifestEntryResource::~OpenManifestEntryResource() {
|
| -}
|
| -
|
| -PluginReverseInterface::PluginReverseInterface(
|
| - nacl::WeakRefAnchor* anchor,
|
| - PP_Instance pp_instance,
|
| - ServiceRuntime* service_runtime)
|
| - : anchor_(anchor),
|
| - pp_instance_(pp_instance),
|
| - service_runtime_(service_runtime),
|
| - shutting_down_(false) {
|
| - NaClXMutexCtor(&mu_);
|
| - NaClXCondVarCtor(&cv_);
|
| -}
|
| -
|
| -PluginReverseInterface::~PluginReverseInterface() {
|
| - NaClCondVarDtor(&cv_);
|
| - NaClMutexDtor(&mu_);
|
| -}
|
| -
|
| -void PluginReverseInterface::ShutDown() {
|
| - NaClLog(4, "PluginReverseInterface::Shutdown: entered\n");
|
| - nacl::MutexLocker take(&mu_);
|
| - shutting_down_ = true;
|
| - NaClXCondVarBroadcast(&cv_);
|
| - NaClLog(4, "PluginReverseInterface::Shutdown: broadcasted, exiting\n");
|
| -}
|
| -
|
| -void PluginReverseInterface::DoPostMessage(std::string message) {
|
| - // This feature is no longer used.
|
| - // TODO(teravest): Remove this once this is gone from nacl::ReverseInterface.
|
| -}
|
| -
|
| -void PluginReverseInterface::StartupInitializationComplete() {
|
| - // This is no longer used.
|
| -}
|
| -
|
| -// TODO(bsy): OpenManifestEntry should use the manifest to ResolveKey
|
| -// and invoke StreamAsFile with a completion callback that invokes
|
| -// GetPOSIXFileDesc.
|
| -bool PluginReverseInterface::OpenManifestEntry(std::string url_key,
|
| - struct NaClFileInfo* info) {
|
| - // This method should only ever be called from the PNaCl translator, as the
|
| - // IRT is not available there.
|
| - // TODO(teravest): Remove support for OpenManifestEntry here once
|
| - // crbug.com/302078 is resolved.
|
| - if (service_runtime_->main_service_runtime()) {
|
| - NaClLog(LOG_ERROR,
|
| - "OpenManifestEntry should only be used by PNaCl translator.\n");
|
| - return false;
|
| - }
|
| -
|
| - bool op_complete = false; // NB: mu_ and cv_ also controls access to this!
|
| - // The to_open object is owned by the weak ref callback. Because this function
|
| - // waits for the callback to finish, the to_open object will be deallocated on
|
| - // the main thread before this function can return. The pointers it contains
|
| - // to stack variables will not leak.
|
| - OpenManifestEntryResource* to_open =
|
| - new OpenManifestEntryResource(url_key, info, &op_complete);
|
| - CHECK(to_open != NULL);
|
| - NaClLog(4, "PluginReverseInterface::OpenManifestEntry: %s\n",
|
| - url_key.c_str());
|
| - // This assumes we are not on the main thread. If false, we deadlock.
|
| - plugin::WeakRefCallOnMainThread(
|
| - anchor_,
|
| - 0,
|
| - this,
|
| - &plugin::PluginReverseInterface::OpenManifestEntry_MainThreadContinuation,
|
| - to_open);
|
| - NaClLog(4,
|
| - "PluginReverseInterface::OpenManifestEntry:"
|
| - " waiting on main thread\n");
|
| -
|
| - {
|
| - nacl::MutexLocker take(&mu_);
|
| - while (!shutting_down_ && !op_complete)
|
| - NaClXCondVarWait(&cv_, &mu_);
|
| - NaClLog(4, "PluginReverseInterface::OpenManifestEntry: done!\n");
|
| - if (shutting_down_) {
|
| - NaClLog(4,
|
| - "PluginReverseInterface::OpenManifestEntry:"
|
| - " plugin is shutting down\n");
|
| - return false;
|
| - }
|
| - }
|
| -
|
| - // info->desc has the returned descriptor if successful, else -1.
|
| -
|
| - // The caller is responsible for not closing info->desc. If it is
|
| - // closed prematurely, then another open could re-use the OS
|
| - // descriptor, confusing the opened_ map. If the caller is going to
|
| - // want to make a NaClDesc object and transfer it etc., then the
|
| - // caller should DUP the descriptor (but remember the original
|
| - // value) for use by the NaClDesc object, which closes when the
|
| - // object is destroyed.
|
| - NaClLog(4,
|
| - "PluginReverseInterface::OpenManifestEntry: info->desc = %d\n",
|
| - info->desc);
|
| - if (info->desc == -1) {
|
| - // TODO(bsy,ncbray): what else should we do with the error? This
|
| - // is a runtime error that may simply be a programming error in
|
| - // the untrusted code, or it may be something else wrong w/ the
|
| - // manifest.
|
| - NaClLog(4, "OpenManifestEntry: failed for key %s", url_key.c_str());
|
| - }
|
| - return true;
|
| -}
|
| -
|
| -// Transfer point from OpenManifestEntry() which runs on the main thread
|
| -// (Some PPAPI actions -- like StreamAsFile -- can only run on the main thread).
|
| -// OpenManifestEntry() is waiting on a condvar for this continuation to
|
| -// complete. We Broadcast and awaken OpenManifestEntry() whenever we are done
|
| -// either here, or in a later MainThreadContinuation step, if there are
|
| -// multiple steps.
|
| -void PluginReverseInterface::OpenManifestEntry_MainThreadContinuation(
|
| - OpenManifestEntryResource* p,
|
| - int32_t err) {
|
| - UNREFERENCED_PARAMETER(err);
|
| - // CallOnMainThread continuations always called with err == PP_OK.
|
| -
|
| - NaClLog(4, "Entered OpenManifestEntry_MainThreadContinuation\n");
|
| -
|
| - // Because p is owned by the callback of this invocation, so it is necessary
|
| - // to create another instance.
|
| - OpenManifestEntryResource* open_cont = new OpenManifestEntryResource(*p);
|
| - pp::CompletionCallback stream_cc = WeakRefNewCallback(
|
| - anchor_,
|
| - this,
|
| - &PluginReverseInterface::StreamAsFile_MainThreadContinuation,
|
| - open_cont);
|
| -
|
| - GetNaClInterface()->OpenManifestEntry(
|
| - pp_instance_,
|
| - PP_FromBool(!service_runtime_->main_service_runtime()),
|
| - p->url.c_str(),
|
| - &open_cont->pp_file_info,
|
| - stream_cc.pp_completion_callback());
|
| - // p is deleted automatically.
|
| -}
|
| -
|
| -void PluginReverseInterface::StreamAsFile_MainThreadContinuation(
|
| - OpenManifestEntryResource* p,
|
| - int32_t result) {
|
| - NaClLog(4, "Entered StreamAsFile_MainThreadContinuation\n");
|
| - {
|
| - nacl::MutexLocker take(&mu_);
|
| - if (result == PP_OK) {
|
| - // We downloaded this file to temporary storage for this plugin; it's
|
| - // reasonable to provide a file descriptor with write access.
|
| - p->file_info->desc = ConvertFileDescriptor(p->pp_file_info.handle, false);
|
| - p->file_info->file_token.lo = p->pp_file_info.token_lo;
|
| - p->file_info->file_token.hi = p->pp_file_info.token_hi;
|
| - NaClLog(4,
|
| - "StreamAsFile_MainThreadContinuation: PP_OK, desc %d\n",
|
| - p->file_info->desc);
|
| - } else {
|
| - NaClLog(
|
| - 4,
|
| - "StreamAsFile_MainThreadContinuation: !PP_OK, setting desc -1\n");
|
| - p->file_info->desc = -1;
|
| - }
|
| - *p->op_complete_ptr = true;
|
| - NaClXCondVarBroadcast(&cv_);
|
| - }
|
| -}
|
| -
|
| -void PluginReverseInterface::ReportCrash() {
|
| - // This is now handled through Chromium IPC.
|
| -}
|
| -
|
| -void PluginReverseInterface::ReportExitStatus(int exit_status) {
|
| - // We do nothing here; reporting exit status is handled through a separate
|
| - // embedder interface.
|
| -}
|
| -
|
| -int64_t PluginReverseInterface::RequestQuotaForWrite(
|
| - std::string file_id, int64_t offset, int64_t bytes_to_write) {
|
| - return bytes_to_write;
|
| -}
|
| -
|
| ServiceRuntime::ServiceRuntime(Plugin* plugin,
|
| PP_Instance pp_instance,
|
| bool main_service_runtime,
|
| @@ -231,9 +50,6 @@ ServiceRuntime::ServiceRuntime(Plugin* plugin,
|
| pp_instance_(pp_instance),
|
| main_service_runtime_(main_service_runtime),
|
| uses_nonsfi_mode_(uses_nonsfi_mode),
|
| - reverse_service_(NULL),
|
| - anchor_(new nacl::WeakRefAnchor()),
|
| - rev_interface_(new PluginReverseInterface(anchor_, pp_instance, this)),
|
| start_sel_ldr_done_(false),
|
| sel_ldr_wait_timed_out_(false),
|
| start_nexe_done_(false),
|
| @@ -267,53 +83,6 @@ bool ServiceRuntime::SetupCommandChannel() {
|
| return true;
|
| }
|
|
|
| -bool ServiceRuntime::InitReverseService() {
|
| - if (uses_nonsfi_mode_) {
|
| - // In non-SFI mode, no reverse service is set up. Just returns success.
|
| - return true;
|
| - }
|
| -
|
| - // Hook up the reverse service channel. We are the IMC client, but
|
| - // provide SRPC service.
|
| - NaClDesc* out_conn_cap;
|
| - NaClSrpcResultCodes rpc_result =
|
| - NaClSrpcInvokeBySignature(&command_channel_,
|
| - "reverse_setup::h",
|
| - &out_conn_cap);
|
| -
|
| - if (NACL_SRPC_RESULT_OK != rpc_result) {
|
| - ErrorInfo error_info;
|
| - error_info.SetReport(PP_NACL_ERROR_SEL_LDR_COMMUNICATION_REV_SETUP,
|
| - "ServiceRuntime: reverse setup rpc failed");
|
| - ReportLoadError(error_info);
|
| - return false;
|
| - }
|
| - // Get connection capability to service runtime where the IMC
|
| - // server/SRPC client is waiting for a rendezvous.
|
| - NaClLog(4, "ServiceRuntime: got 0x%" NACL_PRIxPTR "\n",
|
| - (uintptr_t) out_conn_cap);
|
| - nacl::DescWrapper* conn_cap = plugin_->wrapper_factory()->MakeGenericCleanup(
|
| - out_conn_cap);
|
| - if (conn_cap == NULL) {
|
| - ErrorInfo error_info;
|
| - error_info.SetReport(PP_NACL_ERROR_SEL_LDR_COMMUNICATION_WRAPPER,
|
| - "ServiceRuntime: wrapper allocation failure");
|
| - ReportLoadError(error_info);
|
| - return false;
|
| - }
|
| - out_conn_cap = NULL; // ownership passed
|
| - NaClLog(4, "ServiceRuntime::InitReverseService: starting reverse service\n");
|
| - reverse_service_ = new nacl::ReverseService(conn_cap, rev_interface_->Ref());
|
| - if (!reverse_service_->Start()) {
|
| - ErrorInfo error_info;
|
| - error_info.SetReport(PP_NACL_ERROR_SEL_LDR_COMMUNICATION_REV_SERVICE,
|
| - "ServiceRuntime: starting reverse services failed");
|
| - ReportLoadError(error_info);
|
| - return false;
|
| - }
|
| - return true;
|
| -}
|
| -
|
| bool ServiceRuntime::StartModule() {
|
| // start the module. otherwise we cannot connect for multimedia
|
| // subsystem since that is handled by user-level code (not secure!)
|
| @@ -459,8 +228,6 @@ void ServiceRuntime::StartNexe() {
|
| bool ServiceRuntime::StartNexeInternal() {
|
| if (!SetupCommandChannel())
|
| return false;
|
| - if (!InitReverseService())
|
| - return false;
|
| return StartModule();
|
| }
|
|
|
| @@ -516,8 +283,6 @@ bool ServiceRuntime::RemoteLog(int severity, const std::string& msg) {
|
| }
|
|
|
| void ServiceRuntime::Shutdown() {
|
| - rev_interface_->ShutDown();
|
| - anchor_->Abandon();
|
| // Abandon callbacks, tell service threads to quit if they were
|
| // blocked waiting for main thread operations to finish. Note that
|
| // some callbacks must still await their completion event, e.g.,
|
| @@ -529,17 +294,6 @@ void ServiceRuntime::Shutdown() {
|
| subprocess_.reset(NULL);
|
|
|
| NaClSrpcDtor(&command_channel_);
|
| -
|
| - // subprocess_ has been shut down, but threads waiting on messages
|
| - // from the service runtime may not have noticed yet. The low-level
|
| - // NaClSimpleRevService code takes care to refcount the data objects
|
| - // that it needs, and reverse_service_ is also refcounted. We wait
|
| - // for the service threads to get their EOF indications.
|
| - if (reverse_service_ != NULL) {
|
| - reverse_service_->WaitForServiceThreadsToExit();
|
| - reverse_service_->Unref();
|
| - reverse_service_ = NULL;
|
| - }
|
| }
|
|
|
| ServiceRuntime::~ServiceRuntime() {
|
| @@ -547,12 +301,7 @@ ServiceRuntime::~ServiceRuntime() {
|
| static_cast<void*>(this));
|
| // We do this just in case Shutdown() was not called.
|
| subprocess_.reset(NULL);
|
| - if (reverse_service_ != NULL)
|
| - reverse_service_->Unref();
|
| -
|
| - rev_interface_->Unref();
|
|
|
| - anchor_->Unref();
|
| NaClCondVarDtor(&cond_);
|
| NaClMutexDtor(&mu_);
|
| }
|
|
|