| 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 #include "ppapi/native_client/src/trusted/plugin/pnacl_coordinator.h" | 5 #include "ppapi/native_client/src/trusted/plugin/pnacl_coordinator.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "native_client/src/include/checked_cast.h" | 10 #include "native_client/src/include/checked_cast.h" |
| (...skipping 408 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 419 } | 419 } |
| 420 ReportPpapiError(ERROR_PNACL_CACHE_FETCH_OTHER, | 420 ReportPpapiError(ERROR_PNACL_CACHE_FETCH_OTHER, |
| 421 pp_error, | 421 pp_error, |
| 422 "Failed to open translated nexe."); | 422 "Failed to open translated nexe."); |
| 423 return; | 423 return; |
| 424 } | 424 } |
| 425 | 425 |
| 426 translate_notify_callback_.Run(pp_error); | 426 translate_notify_callback_.Run(pp_error); |
| 427 } | 427 } |
| 428 | 428 |
| 429 void PnaclCoordinator::DidCheckPnaclInstalled(int32_t pp_error) { | 429 void PnaclCoordinator::OpenBitcodeStream() { |
| 430 if (pp_error != PP_OK) { | 430 // Now open the pexe stream. |
| 431 streaming_downloader_.reset(new FileDownloader()); |
| 432 streaming_downloader_->Initialize(plugin_); |
| 433 // Mark the request as requesting a PNaCl bitcode file, |
| 434 // so that component updater can detect this user action. |
| 435 streaming_downloader_->set_request_headers( |
| 436 "Accept: application/x-pnacl, */*"); |
| 437 |
| 438 // Even though we haven't started downloading, create the translation |
| 439 // thread object immediately. This ensures that any pieces of the file |
| 440 // that get downloaded before the compilation thread is accepting |
| 441 // SRPCs won't get dropped. |
| 442 translate_thread_.reset(new PnaclTranslateThread()); |
| 443 if (translate_thread_ == NULL) { |
| 431 ReportNonPpapiError( | 444 ReportNonPpapiError( |
| 432 ERROR_PNACL_RESOURCE_FETCH, | 445 ERROR_PNACL_THREAD_CREATE, |
| 433 nacl::string("The Portable Native Client (pnacl) component is not " | 446 "PnaclCoordinator: could not allocate translation thread."); |
| 434 "installed. Please consult chrome://components for more " | |
| 435 "information.")); | |
| 436 return; | 447 return; |
| 437 } | 448 } |
| 438 | 449 |
| 439 // Loading resources (e.g. llc and ld nexes) is done with PnaclResources. | 450 pp::CompletionCallback cb = |
| 440 resources_.reset(new PnaclResources(plugin_, | 451 callback_factory_.NewCallback(&PnaclCoordinator::BitcodeStreamDidOpen); |
| 441 this, | 452 if (!streaming_downloader_->OpenStream(pexe_url_, cb, this)) { |
| 442 this->manifest_.get())); | 453 ReportNonPpapiError( |
| 454 ERROR_PNACL_PEXE_FETCH_OTHER, |
| 455 nacl::string("PnaclCoordinator: failed to open stream ") + pexe_url_); |
| 456 return; |
| 457 } |
| 458 } |
| 459 |
| 460 void PnaclCoordinator::BitcodeStreamDidOpen(int32_t pp_error) { |
| 461 if (pp_error != PP_OK) { |
| 462 BitcodeStreamDidFinish(pp_error); |
| 463 // We have not spun up the translation process yet, so we need to call |
| 464 // TranslateFinished here. |
| 465 TranslateFinished(pp_error); |
| 466 return; |
| 467 } |
| 468 |
| 469 // The component updater's resource throttles + OnDemand update/install |
| 470 // should block the URL request until the compiler is present. Now we |
| 471 // can load the resources (e.g. llc and ld nexes). |
| 472 resources_.reset(new PnaclResources(plugin_, this, this->manifest_.get())); |
| 443 CHECK(resources_ != NULL); | 473 CHECK(resources_ != NULL); |
| 444 | 474 |
| 445 // The first step of loading resources: read the resource info file. | 475 // The first step of loading resources: read the resource info file. |
| 446 pp::CompletionCallback resource_info_read_cb = | 476 pp::CompletionCallback resource_info_read_cb = |
| 447 callback_factory_.NewCallback( | 477 callback_factory_.NewCallback(&PnaclCoordinator::ResourceInfoWasRead); |
| 448 &PnaclCoordinator::ResourceInfoWasRead); | |
| 449 resources_->ReadResourceInfo(PnaclUrls::GetResourceInfoUrl(), | 478 resources_->ReadResourceInfo(PnaclUrls::GetResourceInfoUrl(), |
| 450 resource_info_read_cb); | 479 resource_info_read_cb); |
| 451 } | 480 } |
| 452 | 481 |
| 453 void PnaclCoordinator::ResourceInfoWasRead(int32_t pp_error) { | 482 void PnaclCoordinator::ResourceInfoWasRead(int32_t pp_error) { |
| 454 PLUGIN_PRINTF(("PluginCoordinator::ResourceInfoWasRead (pp_error=%" | 483 PLUGIN_PRINTF(("PluginCoordinator::ResourceInfoWasRead (pp_error=%" |
| 455 NACL_PRId32 ")\n", pp_error)); | 484 NACL_PRId32 ")\n", pp_error)); |
| 456 // Second step of loading resources: call StartLoad. | 485 // Second step of loading resources: call StartLoad to load pnacl-llc |
| 486 // and pnacl-ld, based on the filenames found in the resource info file. |
| 457 pp::CompletionCallback resources_cb = | 487 pp::CompletionCallback resources_cb = |
| 458 callback_factory_.NewCallback(&PnaclCoordinator::ResourcesDidLoad); | 488 callback_factory_.NewCallback(&PnaclCoordinator::ResourcesDidLoad); |
| 459 resources_->StartLoad(resources_cb); | 489 resources_->StartLoad(resources_cb); |
| 460 } | 490 } |
| 461 | 491 |
| 462 void PnaclCoordinator::ResourcesDidLoad(int32_t pp_error) { | 492 void PnaclCoordinator::ResourcesDidLoad(int32_t pp_error) { |
| 463 PLUGIN_PRINTF(("PnaclCoordinator::ResourcesDidLoad (pp_error=%" | 493 PLUGIN_PRINTF(("PnaclCoordinator::ResourcesDidLoad (pp_error=%" |
| 464 NACL_PRId32 ")\n", pp_error)); | 494 NACL_PRId32 ")\n", pp_error)); |
| 465 if (pp_error != PP_OK) { | 495 if (pp_error != PP_OK) { |
| 466 // Finer-grained error code should have already been reported by | 496 // Finer-grained error code should have already been reported by |
| (...skipping 25 matching lines...) Expand all Loading... |
| 492 PP_FromBool(parser.CacheControlNoStore()), | 522 PP_FromBool(parser.CacheControlNoStore()), |
| 493 &is_cache_hit_, | 523 &is_cache_hit_, |
| 494 temp_nexe_file_->existing_handle(), | 524 temp_nexe_file_->existing_handle(), |
| 495 cb.pp_completion_callback()); | 525 cb.pp_completion_callback()); |
| 496 if (nexe_fd_err < PP_OK_COMPLETIONPENDING) { | 526 if (nexe_fd_err < PP_OK_COMPLETIONPENDING) { |
| 497 ReportPpapiError(ERROR_PNACL_CREATE_TEMP, nexe_fd_err, | 527 ReportPpapiError(ERROR_PNACL_CREATE_TEMP, nexe_fd_err, |
| 498 nacl::string("Call to GetNexeFd failed")); | 528 nacl::string("Call to GetNexeFd failed")); |
| 499 } | 529 } |
| 500 } | 530 } |
| 501 | 531 |
| 502 void PnaclCoordinator::OpenBitcodeStream() { | |
| 503 // Now open the pexe stream. | |
| 504 streaming_downloader_.reset(new FileDownloader()); | |
| 505 streaming_downloader_->Initialize(plugin_); | |
| 506 // Mark the request as requesting a PNaCl bitcode file, | |
| 507 // so that component updater can detect this user action. | |
| 508 streaming_downloader_->set_request_headers( | |
| 509 "Accept: application/x-pnacl, */*"); | |
| 510 | |
| 511 // Even though we haven't started downloading, create the translation | |
| 512 // thread object immediately. This ensures that any pieces of the file | |
| 513 // that get downloaded before the compilation thread is accepting | |
| 514 // SRPCs won't get dropped. | |
| 515 translate_thread_.reset(new PnaclTranslateThread()); | |
| 516 if (translate_thread_ == NULL) { | |
| 517 ReportNonPpapiError( | |
| 518 ERROR_PNACL_THREAD_CREATE, | |
| 519 "PnaclCoordinator: could not allocate translation thread."); | |
| 520 return; | |
| 521 } | |
| 522 | |
| 523 pp::CompletionCallback cb = | |
| 524 callback_factory_.NewCallback(&PnaclCoordinator::BitcodeStreamDidOpen); | |
| 525 if (!streaming_downloader_->OpenStream(pexe_url_, cb, this)) { | |
| 526 ReportNonPpapiError( | |
| 527 ERROR_PNACL_PEXE_FETCH_OTHER, | |
| 528 nacl::string("PnaclCoordinator: failed to open stream ") + pexe_url_); | |
| 529 return; | |
| 530 } | |
| 531 } | |
| 532 | |
| 533 void PnaclCoordinator::BitcodeStreamDidOpen(int32_t pp_error) { | |
| 534 if (pp_error != PP_OK) { | |
| 535 BitcodeStreamDidFinish(pp_error); | |
| 536 // We have not spun up the translation process yet, so we need to call | |
| 537 // TranslateFinished here. | |
| 538 TranslateFinished(pp_error); | |
| 539 return; | |
| 540 } | |
| 541 | |
| 542 // Now that we've started the url request for the response headers and | |
| 543 // for tickling the component updater's On-Demand API, check that the | |
| 544 // compiler is present, or block until it is present or an error is hit. | |
| 545 pp::CompletionCallback pnacl_installed_cb = | |
| 546 callback_factory_.NewCallback(&PnaclCoordinator::DidCheckPnaclInstalled); | |
| 547 plugin_->nacl_interface()->EnsurePnaclInstalled( | |
| 548 plugin_->pp_instance(), | |
| 549 pnacl_installed_cb.pp_completion_callback()); | |
| 550 } | |
| 551 | |
| 552 void PnaclCoordinator::NexeFdDidOpen(int32_t pp_error) { | 532 void PnaclCoordinator::NexeFdDidOpen(int32_t pp_error) { |
| 553 PLUGIN_PRINTF(("PnaclCoordinator::NexeFdDidOpen (pp_error=%" | 533 PLUGIN_PRINTF(("PnaclCoordinator::NexeFdDidOpen (pp_error=%" |
| 554 NACL_PRId32 ", hit=%d, handle=%d)\n", pp_error, | 534 NACL_PRId32 ", hit=%d, handle=%d)\n", pp_error, |
| 555 is_cache_hit_ == PP_TRUE, | 535 is_cache_hit_ == PP_TRUE, |
| 556 *temp_nexe_file_->existing_handle())); | 536 *temp_nexe_file_->existing_handle())); |
| 557 if (pp_error < PP_OK) { | 537 if (pp_error < PP_OK) { |
| 558 ReportPpapiError(ERROR_PNACL_CREATE_TEMP, pp_error, | 538 ReportPpapiError(ERROR_PNACL_CREATE_TEMP, pp_error, |
| 559 nacl::string("GetNexeFd failed")); | 539 nacl::string("GetNexeFd failed")); |
| 560 return; | 540 return; |
| 561 } | 541 } |
| (...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 711 obj_file_.get(), | 691 obj_file_.get(), |
| 712 temp_nexe_file_.get(), | 692 temp_nexe_file_.get(), |
| 713 &error_info_, | 693 &error_info_, |
| 714 resources_.get(), | 694 resources_.get(), |
| 715 &pnacl_options_, | 695 &pnacl_options_, |
| 716 this, | 696 this, |
| 717 plugin_); | 697 plugin_); |
| 718 } | 698 } |
| 719 | 699 |
| 720 } // namespace plugin | 700 } // namespace plugin |
| OLD | NEW |