OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2012 The Chromium Authors. All rights reserved. | 2 * Copyright (c) 2012 The Chromium Authors. All rights reserved. |
3 * Use of this source code is governed by a BSD-style license that can be | 3 * Use of this source code is governed by a BSD-style license that can be |
4 * found in the LICENSE file. | 4 * found in the LICENSE file. |
5 */ | 5 */ |
6 | 6 |
7 #define NACL_LOG_MODULE_NAME "Plugin_ServiceRuntime" | 7 #define NACL_LOG_MODULE_NAME "Plugin_ServiceRuntime" |
8 | 8 |
9 #include "ppapi/native_client/src/trusted/plugin/service_runtime.h" | 9 #include "ppapi/native_client/src/trusted/plugin/service_runtime.h" |
10 | 10 |
(...skipping 441 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
452 return nexe_started_ok_; | 452 return nexe_started_ok_; |
453 } | 453 } |
454 | 454 |
455 void ServiceRuntime::SignalNexeStarted(bool ok) { | 455 void ServiceRuntime::SignalNexeStarted(bool ok) { |
456 nacl::MutexLocker take(&mu_); | 456 nacl::MutexLocker take(&mu_); |
457 start_nexe_done_ = true; | 457 start_nexe_done_ = true; |
458 nexe_started_ok_ = ok; | 458 nexe_started_ok_ = ok; |
459 NaClXCondVarSignal(&cond_); | 459 NaClXCondVarSignal(&cond_); |
460 } | 460 } |
461 | 461 |
462 void ServiceRuntime::LoadNexeAndStart(PP_NaClFileInfo file_info) { | 462 void ServiceRuntime::StartNexe() { |
463 NaClLog(4, "ServiceRuntime::LoadNexeAndStart (handle_valid=%d " | 463 bool ok = StartNexeInternal(); |
464 "token_lo=%" NACL_PRIu64 " token_hi=%" NACL_PRIu64 ")\n", | |
465 file_info.handle != PP_kInvalidFileHandle, | |
466 file_info.token_lo, | |
467 file_info.token_hi); | |
468 | |
469 bool ok = LoadNexeAndStartInternal(file_info); | |
470 if (ok) { | 464 if (ok) { |
471 NaClLog(4, "ServiceRuntime::LoadNexeAndStart (success)\n"); | 465 NaClLog(4, "ServiceRuntime::StartNexe (success)\n"); |
472 } else { | 466 } else { |
473 ReapLogs(); | 467 ReapLogs(); |
474 } | 468 } |
475 // This only matters if a background thread is waiting, but we signal in all | 469 // This only matters if a background thread is waiting, but we signal in all |
476 // cases to simplify the code. | 470 // cases to simplify the code. |
477 SignalNexeStarted(ok); | 471 SignalNexeStarted(ok); |
478 } | 472 } |
479 | 473 |
480 bool ServiceRuntime::LoadNexeAndStartInternal( | 474 bool ServiceRuntime::StartNexeInternal() { |
481 const PP_NaClFileInfo& file_info) { | 475 if (!SetupCommandChannel()) |
482 if(!SetupCommandChannel()) { | |
483 return false; | 476 return false; |
484 } | 477 if (!InitReverseService()) |
485 if (!InitReverseService()) { | |
486 return false; | 478 return false; |
487 } | 479 return StartModule(); |
488 if (!LoadModule(file_info)) { | |
489 ErrorInfo error_info; | |
490 error_info.SetReport(PP_NACL_ERROR_SEL_LDR_COMMUNICATION_CMD_CHANNEL, | |
491 "ServiceRuntime: load module failed"); | |
492 ReportLoadError(error_info); | |
493 return false; | |
494 } | |
495 if (!StartModule()) { | |
496 return false; | |
497 } | |
498 return true; | |
499 } | |
500 | |
501 bool ServiceRuntime::LoadModule(const PP_NaClFileInfo& file_info) { | |
502 if (uses_nonsfi_mode_) { | |
503 // In non-SFI mode, loading is done a part of LaunchSelLdr. | |
504 return true; | |
505 } | |
506 | |
507 NaClFileInfo nacl_file_info; | |
508 nacl_file_info.desc = ConvertFileDescriptor(file_info.handle, true); | |
509 nacl_file_info.file_token.lo = file_info.token_lo; | |
510 nacl_file_info.file_token.hi = file_info.token_hi; | |
511 NaClDesc* desc = NaClDescIoFromFileInfo(nacl_file_info, O_RDONLY); | |
512 if (desc == NULL) { | |
513 return false; | |
514 } | |
515 // We don't use a scoped_ptr here since we would immediately release the | |
516 // DescWrapper to LoadModule(). | |
517 nacl::DescWrapper* wrapper = | |
518 plugin_->wrapper_factory()->MakeGenericCleanup(desc); | |
519 // TODO(teravest, hidehiko): Replace this by Chrome IPC. | |
520 return subprocess_->LoadModule(&command_channel_, wrapper); | |
521 } | 480 } |
522 | 481 |
523 void ServiceRuntime::ReapLogs() { | 482 void ServiceRuntime::ReapLogs() { |
524 // On a load failure the service runtime does not crash itself to | 483 // On a load failure the service runtime does not crash itself to |
525 // avoid a race where the no-more-senders error on the reverse | 484 // avoid a race where the no-more-senders error on the reverse |
526 // channel service thread might cause the crash-detection logic to | 485 // channel service thread might cause the crash-detection logic to |
527 // kick in before the start_module RPC reply has been received. So | 486 // kick in before the start_module RPC reply has been received. So |
528 // we induce a service runtime crash here. We do not release | 487 // we induce a service runtime crash here. We do not release |
529 // subprocess_ since it's needed to collect crash log output after | 488 // subprocess_ since it's needed to collect crash log output after |
530 // the error is reported. | 489 // the error is reported. |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
624 | 583 |
625 nacl::string ServiceRuntime::GetCrashLogOutput() { | 584 nacl::string ServiceRuntime::GetCrashLogOutput() { |
626 if (NULL != subprocess_.get()) { | 585 if (NULL != subprocess_.get()) { |
627 return subprocess_->GetCrashLogOutput(); | 586 return subprocess_->GetCrashLogOutput(); |
628 } else { | 587 } else { |
629 return std::string(); | 588 return std::string(); |
630 } | 589 } |
631 } | 590 } |
632 | 591 |
633 } // namespace plugin | 592 } // namespace plugin |
OLD | NEW |