| 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 8a5a11aac7d4a9f628fafc67605a6a4c6f80af1e..1e2301376a41dca1eb5f06d23c8b797d37ea37ed 100644
|
| --- a/ppapi/native_client/src/trusted/plugin/service_runtime.cc
|
| +++ b/ppapi/native_client/src/trusted/plugin/service_runtime.cc
|
| @@ -490,18 +490,29 @@ ServiceRuntime::ServiceRuntime(Plugin* plugin,
|
| NaClXCondVarCtor(&cond_);
|
| }
|
|
|
| -bool ServiceRuntime::InitCommunication(nacl::DescWrapper* nacl_desc,
|
| - ErrorInfo* error_info) {
|
| - NaClLog(4, "ServiceRuntime::InitCommunication"
|
| +bool ServiceRuntime::LoadModule(nacl::DescWrapper* nacl_desc,
|
| + ErrorInfo* error_info) {
|
| + NaClLog(4, "ServiceRuntime::LoadModule"
|
| " (this=%p, subprocess=%p)\n",
|
| static_cast<void*>(this),
|
| static_cast<void*>(subprocess_.get()));
|
| + CHECK(nacl_desc);
|
| // Create the command channel to the sel_ldr and load the nexe from nacl_desc.
|
| - if (!subprocess_->SetupCommandAndLoad(&command_channel_, nacl_desc)) {
|
| + if (!subprocess_->SetupCommand(&command_channel_)) {
|
| error_info->SetReport(ERROR_SEL_LDR_COMMUNICATION_CMD_CHANNEL,
|
| "ServiceRuntime: command channel creation failed");
|
| return false;
|
| }
|
| +
|
| + if (!subprocess_->LoadModule(&command_channel_, nacl_desc)) {
|
| + error_info->SetReport(ERROR_SEL_LDR_COMMUNICATION_CMD_CHANNEL,
|
| + "ServiceRuntime: load module failed");
|
| + return false;
|
| + }
|
| + return true;
|
| +}
|
| +
|
| +bool ServiceRuntime::InitReverseService(ErrorInfo* error_info) {
|
| // Hook up the reverse service channel. We are the IMC client, but
|
| // provide SRPC service.
|
| NaClDesc* out_conn_cap;
|
| @@ -527,19 +538,22 @@ bool ServiceRuntime::InitCommunication(nacl::DescWrapper* nacl_desc,
|
| return false;
|
| }
|
| out_conn_cap = NULL; // ownership passed
|
| - NaClLog(4, "ServiceRuntime::InitCommunication: starting reverse service\n");
|
| + NaClLog(4, "ServiceRuntime::InitReverseService: starting reverse service\n");
|
| reverse_service_ = new nacl::ReverseService(conn_cap, rev_interface_->Ref());
|
| if (!reverse_service_->Start()) {
|
| error_info->SetReport(ERROR_SEL_LDR_COMMUNICATION_REV_SERVICE,
|
| "ServiceRuntime: starting reverse services failed");
|
| return false;
|
| }
|
| + return true;
|
| +}
|
|
|
| +bool ServiceRuntime::StartModule(ErrorInfo* error_info) {
|
| // start the module. otherwise we cannot connect for multimedia
|
| // subsystem since that is handled by user-level code (not secure!)
|
| // in libsrpc.
|
| int load_status = -1;
|
| - rpc_result =
|
| + NaClSrpcResultCodes rpc_result =
|
| NaClSrpcInvokeBySignature(&command_channel_,
|
| "start_module::i",
|
| &load_status);
|
| @@ -549,7 +563,7 @@ bool ServiceRuntime::InitCommunication(nacl::DescWrapper* nacl_desc,
|
| "ServiceRuntime: could not start nacl module");
|
| return false;
|
| }
|
| - NaClLog(4, "ServiceRuntime::InitCommunication (load_status=%d)\n",
|
| + NaClLog(4, "ServiceRuntime::StartModule (load_status=%d)\n",
|
| load_status);
|
| if (main_service_runtime_) {
|
| plugin_->ReportSelLdrLoadStatus(load_status);
|
| @@ -617,7 +631,10 @@ bool ServiceRuntime::LoadNexeAndStart(nacl::DescWrapper* nacl_desc,
|
| const pp::CompletionCallback& crash_cb) {
|
| NaClLog(4, "ServiceRuntime::LoadNexeAndStart (nacl_desc=%p)\n",
|
| reinterpret_cast<void*>(nacl_desc));
|
| - if (!InitCommunication(nacl_desc, error_info)) {
|
| + bool ok = LoadModule(nacl_desc, error_info) &&
|
| + InitReverseService(error_info) &&
|
| + StartModule(error_info);
|
| + if (!ok) {
|
| // On a load failure the service runtime does not crash itself to
|
| // avoid a race where the no-more-senders error on the reverse
|
| // channel esrvice thread might cause the crash-detection logic to
|
|
|