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 448 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
459 return nexe_started_ok_; | 459 return nexe_started_ok_; |
460 } | 460 } |
461 | 461 |
462 void ServiceRuntime::SignalNexeStarted(bool ok) { | 462 void ServiceRuntime::SignalNexeStarted(bool ok) { |
463 nacl::MutexLocker take(&mu_); | 463 nacl::MutexLocker take(&mu_); |
464 start_nexe_done_ = true; | 464 start_nexe_done_ = true; |
465 nexe_started_ok_ = ok; | 465 nexe_started_ok_ = ok; |
466 NaClXCondVarSignal(&cond_); | 466 NaClXCondVarSignal(&cond_); |
467 } | 467 } |
468 | 468 |
469 void ServiceRuntime::LoadNexeAndStart(PP_NaClFileInfo file_info) { | 469 void ServiceRuntime::StartNexe() { |
470 NaClLog(4, "ServiceRuntime::LoadNexeAndStart (handle_valid=%d " | 470 bool ok = StartNexeInternal(); |
471 "token_lo=%" NACL_PRIu64 " token_hi=%" NACL_PRIu64 ")\n", | |
472 file_info.handle != PP_kInvalidFileHandle, | |
473 file_info.token_lo, | |
474 file_info.token_hi); | |
475 | |
476 bool ok = LoadNexeAndStartInternal(file_info); | |
477 if (ok) { | 471 if (ok) { |
478 NaClLog(4, "ServiceRuntime::LoadNexeAndStart (success)\n"); | 472 NaClLog(4, "ServiceRuntime::StartNexe (success)\n"); |
479 } else { | 473 } else { |
480 ReapLogs(); | 474 ReapLogs(); |
481 } | 475 } |
482 // This only matters if a background thread is waiting, but we signal in all | 476 // This only matters if a background thread is waiting, but we signal in all |
483 // cases to simplify the code. | 477 // cases to simplify the code. |
484 SignalNexeStarted(ok); | 478 SignalNexeStarted(ok); |
485 } | 479 } |
486 | 480 |
487 bool ServiceRuntime::LoadNexeAndStartInternal( | 481 bool ServiceRuntime::StartNexeInternal() { |
488 const PP_NaClFileInfo& file_info) { | 482 if (!SetupCommandChannel()) |
489 if(!SetupCommandChannel()) { | |
490 return false; | 483 return false; |
491 } | 484 if (!InitReverseService()) |
492 if (!InitReverseService()) { | |
493 return false; | 485 return false; |
494 } | 486 return StartModule(); |
495 if (!LoadModule(file_info)) { | |
496 ErrorInfo error_info; | |
497 error_info.SetReport(PP_NACL_ERROR_SEL_LDR_COMMUNICATION_CMD_CHANNEL, | |
498 "ServiceRuntime: load module failed"); | |
499 ReportLoadError(error_info); | |
500 return false; | |
501 } | |
502 if (!StartModule()) { | |
503 return false; | |
504 } | |
505 return true; | |
506 } | |
507 | |
508 bool ServiceRuntime::LoadModule(const PP_NaClFileInfo& file_info) { | |
509 if (uses_nonsfi_mode_) { | |
510 // In non-SFI mode, loading is done a part of LaunchSelLdr. | |
511 return true; | |
512 } | |
513 | |
514 NaClFileInfo nacl_file_info; | |
515 nacl_file_info.desc = ConvertFileDescriptor(file_info.handle, true); | |
516 nacl_file_info.file_token.lo = file_info.token_lo; | |
517 nacl_file_info.file_token.hi = file_info.token_hi; | |
518 NaClDesc* desc = NaClDescIoFromFileInfo(nacl_file_info, O_RDONLY); | |
519 if (desc == NULL) { | |
520 return false; | |
521 } | |
522 // We don't use a scoped_ptr here since we would immediately release the | |
523 // DescWrapper to LoadModule(). | |
524 nacl::DescWrapper* wrapper = | |
525 plugin_->wrapper_factory()->MakeGenericCleanup(desc); | |
526 // TODO(teravest, hidehiko): Replace this by Chrome IPC. | |
527 return subprocess_->LoadModule(&command_channel_, wrapper); | |
528 } | 487 } |
529 | 488 |
530 void ServiceRuntime::ReapLogs() { | 489 void ServiceRuntime::ReapLogs() { |
531 // On a load failure the service runtime does not crash itself to | 490 // On a load failure the service runtime does not crash itself to |
532 // avoid a race where the no-more-senders error on the reverse | 491 // avoid a race where the no-more-senders error on the reverse |
533 // channel service thread might cause the crash-detection logic to | 492 // channel service thread might cause the crash-detection logic to |
534 // kick in before the start_module RPC reply has been received. So | 493 // kick in before the start_module RPC reply has been received. So |
535 // we induce a service runtime crash here. We do not release | 494 // we induce a service runtime crash here. We do not release |
536 // subprocess_ since it's needed to collect crash log output after | 495 // subprocess_ since it's needed to collect crash log output after |
537 // the error is reported. | 496 // the error is reported. |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
631 | 590 |
632 nacl::string ServiceRuntime::GetCrashLogOutput() { | 591 nacl::string ServiceRuntime::GetCrashLogOutput() { |
633 if (NULL != subprocess_.get()) { | 592 if (NULL != subprocess_.get()) { |
634 return subprocess_->GetCrashLogOutput(); | 593 return subprocess_->GetCrashLogOutput(); |
635 } else { | 594 } else { |
636 return std::string(); | 595 return std::string(); |
637 } | 596 } |
638 } | 597 } |
639 | 598 |
640 } // namespace plugin | 599 } // namespace plugin |
OLD | NEW |