| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifdef _MSC_VER | 5 #ifdef _MSC_VER |
| 6 // Do not warn about use of std::copy with raw pointers. | 6 // Do not warn about use of std::copy with raw pointers. |
| 7 #pragma warning(disable : 4996) | 7 #pragma warning(disable : 4996) |
| 8 #endif | 8 #endif |
| 9 | 9 |
| 10 #include "ppapi/native_client/src/trusted/plugin/plugin.h" | 10 #include "ppapi/native_client/src/trusted/plugin/plugin.h" |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 42 | 42 |
| 43 namespace plugin { | 43 namespace plugin { |
| 44 | 44 |
| 45 namespace { | 45 namespace { |
| 46 | 46 |
| 47 // Up to 20 seconds | 47 // Up to 20 seconds |
| 48 const int64_t kTimeSmallMin = 1; // in ms | 48 const int64_t kTimeSmallMin = 1; // in ms |
| 49 const int64_t kTimeSmallMax = 20000; // in ms | 49 const int64_t kTimeSmallMax = 20000; // in ms |
| 50 const uint32_t kTimeSmallBuckets = 100; | 50 const uint32_t kTimeSmallBuckets = 100; |
| 51 | 51 |
| 52 const int64_t kSizeKBMin = 1; | |
| 53 const int64_t kSizeKBMax = 512*1024; // very large .nexe | |
| 54 const uint32_t kSizeKBBuckets = 100; | |
| 55 | |
| 56 // Converts a PP_FileHandle to a POSIX file descriptor. | 52 // Converts a PP_FileHandle to a POSIX file descriptor. |
| 57 int32_t ConvertFileDescriptor(PP_FileHandle handle) { | 53 int32_t ConvertFileDescriptor(PP_FileHandle handle) { |
| 58 PLUGIN_PRINTF(("ConvertFileDescriptor, handle=%d\n", handle)); | 54 PLUGIN_PRINTF(("ConvertFileDescriptor, handle=%d\n", handle)); |
| 59 #if NACL_WINDOWS | 55 #if NACL_WINDOWS |
| 60 int32_t file_desc = NACL_NO_FILE_DESC; | 56 int32_t file_desc = NACL_NO_FILE_DESC; |
| 61 // On Windows, valid handles are 32 bit unsigned integers so this is safe. | 57 // On Windows, valid handles are 32 bit unsigned integers so this is safe. |
| 62 file_desc = reinterpret_cast<intptr_t>(handle); | 58 file_desc = reinterpret_cast<intptr_t>(handle); |
| 63 // Convert the Windows HANDLE from Pepper to a POSIX file descriptor. | 59 // Convert the Windows HANDLE from Pepper to a POSIX file descriptor. |
| 64 int32_t posix_desc = _open_osfhandle(file_desc, _O_RDWR | _O_BINARY); | 60 int32_t posix_desc = _open_osfhandle(file_desc, _O_RDWR | _O_BINARY); |
| 65 if (posix_desc == -1) { | 61 if (posix_desc == -1) { |
| (...skipping 26 matching lines...) Expand all Loading... |
| 92 | 88 |
| 93 void Plugin::HistogramTimeSmall(const std::string& name, | 89 void Plugin::HistogramTimeSmall(const std::string& name, |
| 94 int64_t ms) { | 90 int64_t ms) { |
| 95 if (ms < 0) return; | 91 if (ms < 0) return; |
| 96 uma_interface_.HistogramCustomTimes(name, | 92 uma_interface_.HistogramCustomTimes(name, |
| 97 ms, | 93 ms, |
| 98 kTimeSmallMin, kTimeSmallMax, | 94 kTimeSmallMin, kTimeSmallMax, |
| 99 kTimeSmallBuckets); | 95 kTimeSmallBuckets); |
| 100 } | 96 } |
| 101 | 97 |
| 102 void Plugin::HistogramSizeKB(const std::string& name, | |
| 103 int32_t sample) { | |
| 104 if (sample < 0) return; | |
| 105 uma_interface_.HistogramCustomCounts(name, | |
| 106 sample, | |
| 107 kSizeKBMin, kSizeKBMax, | |
| 108 kSizeKBBuckets); | |
| 109 } | |
| 110 | |
| 111 void Plugin::HistogramEnumerateSelLdrLoadStatus(NaClErrorCode error_code) { | 98 void Plugin::HistogramEnumerateSelLdrLoadStatus(NaClErrorCode error_code) { |
| 112 if (error_code < 0 || error_code > NACL_ERROR_CODE_MAX) | 99 if (error_code < 0 || error_code > NACL_ERROR_CODE_MAX) |
| 113 error_code = LOAD_STATUS_UNKNOWN; | 100 error_code = LOAD_STATUS_UNKNOWN; |
| 114 | 101 |
| 115 uma_interface_.HistogramEnumeration("NaCl.LoadStatus.SelLdr", | 102 uma_interface_.HistogramEnumeration("NaCl.LoadStatus.SelLdr", |
| 116 error_code, | 103 error_code, |
| 117 NACL_ERROR_CODE_MAX); | 104 NACL_ERROR_CODE_MAX); |
| 118 | 105 |
| 119 // Gather data to see if being installed changes load outcomes. | 106 // Gather data to see if being installed changes load outcomes. |
| 120 const char* name = nacl_interface_->GetIsInstalled(pp_instance()) ? | 107 const char* name = nacl_interface_->GetIsInstalled(pp_instance()) ? |
| (...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 388 | 375 |
| 389 for (std::map<nacl::string, NaClFileInfoAutoCloser*>::iterator it = | 376 for (std::map<nacl::string, NaClFileInfoAutoCloser*>::iterator it = |
| 390 url_file_info_map_.begin(); | 377 url_file_info_map_.begin(); |
| 391 it != url_file_info_map_.end(); | 378 it != url_file_info_map_.end(); |
| 392 ++it) { | 379 ++it) { |
| 393 delete it->second; | 380 delete it->second; |
| 394 } | 381 } |
| 395 url_downloaders_.erase(url_downloaders_.begin(), url_downloaders_.end()); | 382 url_downloaders_.erase(url_downloaders_.begin(), url_downloaders_.end()); |
| 396 | 383 |
| 397 // Clean up accounting for our instance inside the NaCl interface. | 384 // Clean up accounting for our instance inside the NaCl interface. |
| 385 if (manifest_id_ != -1) |
| 386 nacl_interface_->DestroyManifest(pp_instance(), manifest_id_); |
| 398 nacl_interface_->InstanceDestroyed(pp_instance()); | 387 nacl_interface_->InstanceDestroyed(pp_instance()); |
| 399 | 388 |
| 400 // ShutDownSubprocesses shuts down the main subprocess, which shuts | 389 // ShutDownSubprocesses shuts down the main subprocess, which shuts |
| 401 // down the main ServiceRuntime object, which kills the subprocess. | 390 // down the main ServiceRuntime object, which kills the subprocess. |
| 402 // As a side effect of the subprocess being killed, the reverse | 391 // As a side effect of the subprocess being killed, the reverse |
| 403 // services thread(s) will get EOF on the reverse channel(s), and | 392 // services thread(s) will get EOF on the reverse channel(s), and |
| 404 // the thread(s) will exit. In ServiceRuntime::Shutdown, we invoke | 393 // the thread(s) will exit. In ServiceRuntime::Shutdown, we invoke |
| 405 // ReverseService::WaitForServiceThreadsToExit(), so that there will | 394 // ReverseService::WaitForServiceThreadsToExit(), so that there will |
| 406 // not be an extent thread(s) hanging around. This means that the | 395 // not be an extent thread(s) hanging around. This means that the |
| 407 // ~Plugin will block until this happens. This is a requirement, | 396 // ~Plugin will block until this happens. This is a requirement, |
| (...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 525 int64_t loaded; | 514 int64_t loaded; |
| 526 int64_t total; | 515 int64_t total; |
| 527 pnacl_coordinator_->GetCurrentProgress(&loaded, &total); | 516 pnacl_coordinator_->GetCurrentProgress(&loaded, &total); |
| 528 ReportLoadSuccess(loaded, total); | 517 ReportLoadSuccess(loaded, total); |
| 529 } | 518 } |
| 530 } | 519 } |
| 531 | 520 |
| 532 void Plugin::NaClManifestFileDidOpen(int32_t pp_error) { | 521 void Plugin::NaClManifestFileDidOpen(int32_t pp_error) { |
| 533 PLUGIN_PRINTF(("Plugin::NaClManifestFileDidOpen (pp_error=%" | 522 PLUGIN_PRINTF(("Plugin::NaClManifestFileDidOpen (pp_error=%" |
| 534 NACL_PRId32 ")\n", pp_error)); | 523 NACL_PRId32 ")\n", pp_error)); |
| 535 if (pp_error == PP_OK) { | 524 if (pp_error != PP_OK || manifest_id_ == -1) |
| 536 // Take local ownership of manifest_data_var_ | |
| 537 pp::Var manifest_data = pp::Var(pp::PASS_REF, manifest_data_var_); | |
| 538 manifest_data_var_ = PP_MakeUndefined(); | |
| 539 | |
| 540 std::string json_buffer = manifest_data.AsString(); | |
| 541 ProcessNaClManifest(json_buffer); | |
| 542 } | |
| 543 } | |
| 544 | |
| 545 void Plugin::ProcessNaClManifest(const nacl::string& manifest_json) { | |
| 546 HistogramSizeKB("NaCl.Perf.Size.Manifest", | |
| 547 static_cast<int32_t>(manifest_json.length() / 1024)); | |
| 548 if (!SetManifestObject(manifest_json)) | |
| 549 return; | 525 return; |
| 550 | 526 |
| 551 PP_Var pp_program_url; | 527 PP_Var pp_program_url; |
| 552 PP_PNaClOptions pnacl_options = {PP_FALSE, PP_FALSE, 2}; | 528 PP_PNaClOptions pnacl_options = {PP_FALSE, PP_FALSE, 2}; |
| 553 PP_Bool uses_nonsfi_mode; | 529 PP_Bool uses_nonsfi_mode; |
| 554 if (nacl_interface_->GetManifestProgramURL(pp_instance(), | 530 if (nacl_interface_->GetManifestProgramURL(pp_instance(), |
| 555 manifest_id_, &pp_program_url, &pnacl_options, &uses_nonsfi_mode)) { | 531 manifest_id_, &pp_program_url, &pnacl_options, &uses_nonsfi_mode)) { |
| 556 program_url_ = pp::Var(pp::PASS_REF, pp_program_url).AsString(); | 532 program_url_ = pp::Var(pp::PASS_REF, pp_program_url).AsString(); |
| 557 // TODO(teravest): Make ProcessNaClManifest take responsibility for more of | 533 // TODO(teravest): Make ProcessNaClManifest take responsibility for more of |
| 558 // this function. | 534 // this function. |
| (...skipping 20 matching lines...) Expand all Loading... |
| 579 } | 555 } |
| 580 } | 556 } |
| 581 } | 557 } |
| 582 | 558 |
| 583 void Plugin::RequestNaClManifest(const nacl::string& url) { | 559 void Plugin::RequestNaClManifest(const nacl::string& url) { |
| 584 PLUGIN_PRINTF(("Plugin::RequestNaClManifest (url='%s')\n", url.c_str())); | 560 PLUGIN_PRINTF(("Plugin::RequestNaClManifest (url='%s')\n", url.c_str())); |
| 585 pp::CompletionCallback open_callback = | 561 pp::CompletionCallback open_callback = |
| 586 callback_factory_.NewCallback(&Plugin::NaClManifestFileDidOpen); | 562 callback_factory_.NewCallback(&Plugin::NaClManifestFileDidOpen); |
| 587 nacl_interface_->RequestNaClManifest(pp_instance(), | 563 nacl_interface_->RequestNaClManifest(pp_instance(), |
| 588 url.c_str(), | 564 url.c_str(), |
| 589 &manifest_data_var_, | 565 &manifest_id_, |
| 590 open_callback.pp_completion_callback()); | 566 open_callback.pp_completion_callback()); |
| 591 } | 567 } |
| 592 | 568 |
| 593 | |
| 594 bool Plugin::SetManifestObject(const nacl::string& manifest_json) { | |
| 595 PLUGIN_PRINTF(("Plugin::SetManifestObject(): manifest_json='%s'.\n", | |
| 596 manifest_json.c_str())); | |
| 597 // Determine whether lookups should use portable (i.e., pnacl versions) | |
| 598 // rather than platform-specific files. | |
| 599 pp::Var manifest_base_url = | |
| 600 pp::Var(pp::PASS_REF, nacl_interface_->GetManifestBaseURL(pp_instance())); | |
| 601 std::string manifest_base_url_str = manifest_base_url.AsString(); | |
| 602 | |
| 603 int32_t manifest_id = nacl_interface_->CreateJsonManifest( | |
| 604 pp_instance(), | |
| 605 manifest_base_url_str.c_str(), | |
| 606 manifest_json.c_str()); | |
| 607 if (manifest_id == -1) | |
| 608 return false; | |
| 609 manifest_id_ = manifest_id; | |
| 610 return true; | |
| 611 } | |
| 612 | |
| 613 void Plugin::UrlDidOpenForStreamAsFile( | 569 void Plugin::UrlDidOpenForStreamAsFile( |
| 614 int32_t pp_error, | 570 int32_t pp_error, |
| 615 FileDownloader* url_downloader, | 571 FileDownloader* url_downloader, |
| 616 pp::CompletionCallback callback) { | 572 pp::CompletionCallback callback) { |
| 617 PLUGIN_PRINTF(("Plugin::UrlDidOpen (pp_error=%" NACL_PRId32 | 573 PLUGIN_PRINTF(("Plugin::UrlDidOpen (pp_error=%" NACL_PRId32 |
| 618 ", url_downloader=%p)\n", pp_error, | 574 ", url_downloader=%p)\n", pp_error, |
| 619 static_cast<void*>(url_downloader))); | 575 static_cast<void*>(url_downloader))); |
| 620 url_downloaders_.erase(url_downloader); | 576 url_downloaders_.erase(url_downloader); |
| 621 nacl::scoped_ptr<FileDownloader> scoped_url_downloader(url_downloader); | 577 nacl::scoped_ptr<FileDownloader> scoped_url_downloader(url_downloader); |
| 622 NaClFileInfo tmp_info(scoped_url_downloader->GetFileInfo()); | 578 NaClFileInfo tmp_info(scoped_url_downloader->GetFileInfo()); |
| (...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 812 | 768 |
| 813 void Plugin::SetExitStatusOnMainThread(int32_t pp_error, | 769 void Plugin::SetExitStatusOnMainThread(int32_t pp_error, |
| 814 int exit_status) { | 770 int exit_status) { |
| 815 DCHECK(pp::Module::Get()->core()->IsMainThread()); | 771 DCHECK(pp::Module::Get()->core()->IsMainThread()); |
| 816 DCHECK(nacl_interface_); | 772 DCHECK(nacl_interface_); |
| 817 nacl_interface_->SetExitStatus(pp_instance(), exit_status); | 773 nacl_interface_->SetExitStatus(pp_instance(), exit_status); |
| 818 } | 774 } |
| 819 | 775 |
| 820 | 776 |
| 821 } // namespace plugin | 777 } // namespace plugin |
| OLD | NEW |