Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(323)

Side by Side Diff: ppapi/native_client/src/trusted/plugin/service_runtime.cc

Issue 10823019: Ensure that errors that occur during load will get crash log info to JS console (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: code review based changes Created 8 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « ppapi/native_client/src/trusted/plugin/service_runtime.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 "native_client/src/trusted/plugin/service_runtime.h" 9 #include "native_client/src/trusted/plugin/service_runtime.h"
10 10
(...skipping 570 matching lines...) Expand 10 before | Expand all | Expand 10 after
581 PLUGIN_PRINTF(("ServiceRuntime: got 0x%"NACL_PRIxPTR"\n", 581 PLUGIN_PRINTF(("ServiceRuntime: got 0x%"NACL_PRIxPTR"\n",
582 (uintptr_t) out_conn_cap)); 582 (uintptr_t) out_conn_cap));
583 nacl::DescWrapper* conn_cap = plugin_->wrapper_factory()->MakeGenericCleanup( 583 nacl::DescWrapper* conn_cap = plugin_->wrapper_factory()->MakeGenericCleanup(
584 out_conn_cap); 584 out_conn_cap);
585 if (conn_cap == NULL) { 585 if (conn_cap == NULL) {
586 error_info->SetReport(ERROR_SEL_LDR_COMMUNICATION_WRAPPER, 586 error_info->SetReport(ERROR_SEL_LDR_COMMUNICATION_WRAPPER,
587 "ServiceRuntime: wrapper allocation failure"); 587 "ServiceRuntime: wrapper allocation failure");
588 return false; 588 return false;
589 } 589 }
590 out_conn_cap = NULL; // ownership passed 590 out_conn_cap = NULL; // ownership passed
591 PLUGIN_PRINTF(("ServiceRuntime::InitCommunication"
592 " starting reverse service\n"));
591 reverse_service_ = new nacl::ReverseService(conn_cap, rev_interface_->Ref()); 593 reverse_service_ = new nacl::ReverseService(conn_cap, rev_interface_->Ref());
592 if (!reverse_service_->Start()) { 594 if (!reverse_service_->Start()) {
593 error_info->SetReport(ERROR_SEL_LDR_COMMUNICATION_REV_SERVICE, 595 error_info->SetReport(ERROR_SEL_LDR_COMMUNICATION_REV_SERVICE,
594 "ServiceRuntime: starting reverse services failed"); 596 "ServiceRuntime: starting reverse services failed");
595 return false; 597 return false;
596 } 598 }
597 599
598 // start the module. otherwise we cannot connect for multimedia 600 // start the module. otherwise we cannot connect for multimedia
599 // subsystem since that is handled by user-level code (not secure!) 601 // subsystem since that is handled by user-level code (not secure!)
600 // in libsrpc. 602 // in libsrpc.
(...skipping 16 matching lines...) Expand all
617 if (LOAD_OK != load_status) { 619 if (LOAD_OK != load_status) {
618 error_info->SetReport( 620 error_info->SetReport(
619 ERROR_SEL_LDR_START_STATUS, 621 ERROR_SEL_LDR_START_STATUS,
620 NaClErrorString(static_cast<NaClErrorCode>(load_status))); 622 NaClErrorString(static_cast<NaClErrorCode>(load_status)));
621 return false; 623 return false;
622 } 624 }
623 return true; 625 return true;
624 } 626 }
625 627
626 bool ServiceRuntime::Start(nacl::DescWrapper* nacl_desc, 628 bool ServiceRuntime::Start(nacl::DescWrapper* nacl_desc,
627 ErrorInfo* error_info, const nacl::string& url) { 629 ErrorInfo* error_info, const nacl::string& url,
630 pp::CompletionCallback crash_cb) {
628 PLUGIN_PRINTF(("ServiceRuntime::Start (nacl_desc=%p)\n", 631 PLUGIN_PRINTF(("ServiceRuntime::Start (nacl_desc=%p)\n",
629 reinterpret_cast<void*>(nacl_desc))); 632 reinterpret_cast<void*>(nacl_desc)));
630 633
631 #ifdef NACL_STANDALONE 634 #ifdef NACL_STANDALONE
632 nacl::scoped_ptr<nacl::SelLdrLauncherStandalone> 635 nacl::scoped_ptr<nacl::SelLdrLauncherStandalone>
633 tmp_subprocess(new nacl::SelLdrLauncherStandalone()); 636 tmp_subprocess(new nacl::SelLdrLauncherStandalone());
634 #else 637 #else
635 nacl::scoped_ptr<SelLdrLauncherChrome> 638 nacl::scoped_ptr<SelLdrLauncherChrome>
636 tmp_subprocess(new SelLdrLauncherChrome()); 639 tmp_subprocess(new SelLdrLauncherChrome());
637 #endif 640 #endif
(...skipping 10 matching lines...) Expand all
648 #endif 651 #endif
649 if (!started) { 652 if (!started) {
650 PLUGIN_PRINTF(("ServiceRuntime::Start (start failed)\n")); 653 PLUGIN_PRINTF(("ServiceRuntime::Start (start failed)\n"));
651 error_info->SetReport(ERROR_SEL_LDR_LAUNCH, 654 error_info->SetReport(ERROR_SEL_LDR_LAUNCH,
652 "ServiceRuntime: failed to start"); 655 "ServiceRuntime: failed to start");
653 return false; 656 return false;
654 } 657 }
655 658
656 subprocess_.reset(tmp_subprocess.release()); 659 subprocess_.reset(tmp_subprocess.release());
657 if (!InitCommunication(nacl_desc, error_info)) { 660 if (!InitCommunication(nacl_desc, error_info)) {
658 subprocess_.reset(NULL); 661 // On a load failure the service runtime does not crash itself to
662 // avoid a race where the no-more-senders error on the reverse
663 // channel esrvice thread might cause the crash-detection logic to
664 // kick in before the start_module RPC reply has been received. So
665 // we induce a service runtime crash here. We do not release
666 // subprocess_ since it's needed to collect crash log output after
667 // the error is reported.
668 Log(LOG_FATAL, "reap logs");
669 if (NULL == reverse_service_) {
670 // No crash detector thread.
671 PLUGIN_PRINTF(("scheduling to get crash log\n"));
672 pp::Module::Get()->core()->CallOnMainThread(0, crash_cb, PP_OK);
673 PLUGIN_PRINTF(("should fire soon\n"));
674 } else {
675 PLUGIN_PRINTF(("Reverse service thread will pick up crash log\n"));
676 }
659 return false; 677 return false;
660 } 678 }
661 679
662 PLUGIN_PRINTF(("ServiceRuntime::Start (return 1)\n")); 680 PLUGIN_PRINTF(("ServiceRuntime::Start (return 1)\n"));
663 return true; 681 return true;
664 } 682 }
665 683
666 SrpcClient* ServiceRuntime::SetupAppChannel() { 684 SrpcClient* ServiceRuntime::SetupAppChannel() {
667 PLUGIN_PRINTF(("ServiceRuntime::SetupAppChannel (subprocess_=%p)\n", 685 PLUGIN_PRINTF(("ServiceRuntime::SetupAppChannel (subprocess_=%p)\n",
668 reinterpret_cast<void*>(subprocess_.get()))); 686 reinterpret_cast<void*>(subprocess_.get())));
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
744 762
745 nacl::string ServiceRuntime::GetCrashLogOutput() { 763 nacl::string ServiceRuntime::GetCrashLogOutput() {
746 if (NULL != subprocess_.get()) { 764 if (NULL != subprocess_.get()) {
747 return subprocess_->GetCrashLogOutput(); 765 return subprocess_->GetCrashLogOutput();
748 } else { 766 } else {
749 return ""; 767 return "";
750 } 768 }
751 } 769 }
752 770
753 } // namespace plugin 771 } // namespace plugin
OLDNEW
« no previous file with comments | « ppapi/native_client/src/trusted/plugin/service_runtime.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698