| 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 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 100 const PP_PNaClOptions& pnacl_options, | 100 const PP_PNaClOptions& pnacl_options, |
| 101 const pp::CompletionCallback& translate_notify_callback) | 101 const pp::CompletionCallback& translate_notify_callback) |
| 102 : translate_finish_error_(PP_OK), | 102 : translate_finish_error_(PP_OK), |
| 103 plugin_(plugin), | 103 plugin_(plugin), |
| 104 translate_notify_callback_(translate_notify_callback), | 104 translate_notify_callback_(translate_notify_callback), |
| 105 translation_finished_reported_(false), | 105 translation_finished_reported_(false), |
| 106 pexe_url_(pexe_url), | 106 pexe_url_(pexe_url), |
| 107 pnacl_options_(pnacl_options), | 107 pnacl_options_(pnacl_options), |
| 108 architecture_attributes_(GetArchitectureAttributes(plugin)), | 108 architecture_attributes_(GetArchitectureAttributes(plugin)), |
| 109 split_module_count_(1), | 109 split_module_count_(1), |
| 110 num_object_files_opened_(0), | |
| 111 is_cache_hit_(PP_FALSE), | 110 is_cache_hit_(PP_FALSE), |
| 112 error_already_reported_(false), | 111 error_already_reported_(false), |
| 113 pnacl_init_time_(0), | 112 pnacl_init_time_(0), |
| 114 pexe_size_(0), | 113 pexe_size_(0), |
| 115 pexe_bytes_compiled_(0), | 114 pexe_bytes_compiled_(0), |
| 116 expected_pexe_size_(-1) { | 115 expected_pexe_size_(-1) { |
| 117 PLUGIN_PRINTF(("PnaclCoordinator::PnaclCoordinator (this=%p, plugin=%p)\n", | 116 PLUGIN_PRINTF(("PnaclCoordinator::PnaclCoordinator (this=%p, plugin=%p)\n", |
| 118 static_cast<void*>(this), static_cast<void*>(plugin))); | 117 static_cast<void*>(this), static_cast<void*>(plugin))); |
| 119 callback_factory_.Initialize(this); | 118 callback_factory_.Initialize(this); |
| 120 } | 119 } |
| 121 | 120 |
| 122 PnaclCoordinator::~PnaclCoordinator() { | 121 PnaclCoordinator::~PnaclCoordinator() { |
| 123 PLUGIN_PRINTF(("PnaclCoordinator::~PnaclCoordinator (this=%p, " | 122 PLUGIN_PRINTF(("PnaclCoordinator::~PnaclCoordinator (this=%p, " |
| 124 "translate_thread=%p\n", | 123 "translate_thread=%p\n", |
| 125 static_cast<void*>(this), translate_thread_.get())); | 124 static_cast<void*>(this), translate_thread_.get())); |
| 126 // Stopping the translate thread will cause the translate thread to try to | 125 // Stopping the translate thread will cause the translate thread to try to |
| 127 // run translation_complete_callback_ on the main thread. This destructor is | 126 // run translation_complete_callback_ on the main thread. This destructor is |
| 128 // running from the main thread, and by the time it exits, callback_factory_ | 127 // running from the main thread, and by the time it exits, callback_factory_ |
| 129 // will have been destroyed. This will result in the cancellation of | 128 // will have been destroyed. This will result in the cancellation of |
| 130 // translation_complete_callback_, so no notification will be delivered. | 129 // translation_complete_callback_, so no notification will be delivered. |
| 131 if (translate_thread_.get() != NULL) { | 130 if (translate_thread_.get() != NULL) |
| 132 translate_thread_->AbortSubprocesses(); | 131 translate_thread_->AbortSubprocesses(); |
| 133 } | |
| 134 if (!translation_finished_reported_) { | 132 if (!translation_finished_reported_) { |
| 135 plugin_->nacl_interface()->ReportTranslationFinished( | 133 plugin_->nacl_interface()->ReportTranslationFinished( |
| 136 plugin_->pp_instance(), | 134 plugin_->pp_instance(), |
| 137 PP_FALSE, 0, 0, 0, 0); | 135 PP_FALSE, 0, 0, 0, 0); |
| 138 } | 136 } |
| 139 // Force deleting the translate_thread now. It must be deleted | 137 // Force deleting the translate_thread now. It must be deleted |
| 140 // before any scoped_* fields hanging off of PnaclCoordinator | 138 // before any scoped_* fields hanging off of PnaclCoordinator |
| 141 // since the thread may be accessing those fields. | 139 // since the thread may be accessing those fields. |
| 142 // It will also be accessing obj_files_. | 140 // It will also be accessing obj_files_. |
| 143 translate_thread_.reset(NULL); | 141 translate_thread_.reset(NULL); |
| 144 // TODO(jvoung): use base/memory/scoped_vector.h to hold obj_files_. | 142 for (size_t i = 0; i < obj_files_.size(); i++) |
| 145 for (int i = 0; i < num_object_files_opened_; i++) { | |
| 146 delete obj_files_[i]; | 143 delete obj_files_[i]; |
| 147 } | |
| 148 } | 144 } |
| 149 | 145 |
| 150 PP_FileHandle PnaclCoordinator::TakeTranslatedFileHandle() { | 146 PP_FileHandle PnaclCoordinator::TakeTranslatedFileHandle() { |
| 151 DCHECK(temp_nexe_file_ != NULL); | 147 DCHECK(temp_nexe_file_ != NULL); |
| 152 return temp_nexe_file_->TakeFileHandle(); | 148 return temp_nexe_file_->TakeFileHandle(); |
| 153 } | 149 } |
| 154 | 150 |
| 155 void PnaclCoordinator::ReportNonPpapiError(PP_NaClError err_code, | 151 void PnaclCoordinator::ReportNonPpapiError(PP_NaClError err_code, |
| 156 const nacl::string& message) { | 152 const nacl::string& message) { |
| 157 ErrorInfo error_info; | 153 ErrorInfo error_info; |
| (...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 396 | 392 |
| 397 if (is_cache_hit_ == PP_TRUE) { | 393 if (is_cache_hit_ == PP_TRUE) { |
| 398 // Cache hit -- no need to stream the rest of the file. | 394 // Cache hit -- no need to stream the rest of the file. |
| 399 streaming_downloader_.reset(NULL); | 395 streaming_downloader_.reset(NULL); |
| 400 // Open it for reading as the cached nexe file. | 396 // Open it for reading as the cached nexe file. |
| 401 NexeReadDidOpen(temp_nexe_file_->Open(false)); | 397 NexeReadDidOpen(temp_nexe_file_->Open(false)); |
| 402 } else { | 398 } else { |
| 403 // Open an object file first so the translator can start writing to it | 399 // Open an object file first so the translator can start writing to it |
| 404 // during streaming translation. | 400 // during streaming translation. |
| 405 for (int i = 0; i < split_module_count_; i++) { | 401 for (int i = 0; i < split_module_count_; i++) { |
| 406 obj_files_.push_back(new TempFile(plugin_)); | 402 nacl::scoped_ptr<TempFile> temp_file(new TempFile(plugin_)); |
| 407 int32_t pp_error = obj_files_[i]->Open(true); | 403 int32_t pp_error = temp_file->Open(true); |
| 408 if (pp_error != PP_OK) { | 404 if (pp_error != PP_OK) { |
| 409 ReportPpapiError(PP_NACL_ERROR_PNACL_CREATE_TEMP, | 405 ReportPpapiError(PP_NACL_ERROR_PNACL_CREATE_TEMP, |
| 410 pp_error, | 406 pp_error, |
| 411 "Failed to open scratch object file."); | 407 "Failed to open scratch object file."); |
| 408 return; |
| 412 } else { | 409 } else { |
| 413 num_object_files_opened_++; | 410 obj_files_.push_back(temp_file.release()); |
| 414 } | 411 } |
| 415 } | 412 } |
| 416 invalid_desc_wrapper_.reset(plugin_->wrapper_factory()->MakeInvalid()); | 413 invalid_desc_wrapper_.reset(plugin_->wrapper_factory()->MakeInvalid()); |
| 417 | 414 |
| 418 // Meanwhile, a miss means we know we need to stream the bitcode, so stream | 415 // Meanwhile, a miss means we know we need to stream the bitcode, so stream |
| 419 // the rest of it now. (Calling BeginStreaming means that the downloader | 416 // the rest of it now. (Calling BeginStreaming means that the downloader |
| 420 // will begin handing data to the coordinator, which is safe any time after | 417 // will begin handing data to the coordinator, which is safe any time after |
| 421 // the translate_thread_ object has been initialized). | 418 // the translate_thread_ object has been initialized). |
| 422 pp::CompletionCallback finish_cb = callback_factory_.NewCallback( | 419 pp::CompletionCallback finish_cb = callback_factory_.NewCallback( |
| 423 &PnaclCoordinator::BitcodeStreamDidFinish); | 420 &PnaclCoordinator::BitcodeStreamDidFinish); |
| 424 streaming_downloader_->BeginStreaming(finish_cb); | 421 streaming_downloader_->BeginStreaming(finish_cb); |
| 425 | 422 |
| 426 if (num_object_files_opened_ == split_module_count_) { | 423 // Open the nexe file for connecting ld and sel_ldr. |
| 427 // Open the nexe file for connecting ld and sel_ldr. | 424 // Start translation when done with this last step of setup! |
| 428 // Start translation when done with this last step of setup! | 425 RunTranslate(temp_nexe_file_->Open(true)); |
| 429 RunTranslate(temp_nexe_file_->Open(true)); | |
| 430 } | |
| 431 } | 426 } |
| 432 } | 427 } |
| 433 | 428 |
| 434 void PnaclCoordinator::BitcodeStreamDidFinish(int32_t pp_error) { | 429 void PnaclCoordinator::BitcodeStreamDidFinish(int32_t pp_error) { |
| 435 PLUGIN_PRINTF(("PnaclCoordinator::BitcodeStreamDidFinish (pp_error=%" | 430 PLUGIN_PRINTF(("PnaclCoordinator::BitcodeStreamDidFinish (pp_error=%" |
| 436 NACL_PRId32 ")\n", pp_error)); | 431 NACL_PRId32 ")\n", pp_error)); |
| 437 if (pp_error != PP_OK) { | 432 if (pp_error != PP_OK) { |
| 438 // Defer reporting the error and cleanup until after the translation | 433 // Defer reporting the error and cleanup until after the translation |
| 439 // thread returns, because it may be accessing the coordinator's | 434 // thread returns, because it may be accessing the coordinator's |
| 440 // objects or writing to the files. | 435 // objects or writing to the files. |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 536 invalid_desc_wrapper_.get(), | 531 invalid_desc_wrapper_.get(), |
| 537 &error_info_, | 532 &error_info_, |
| 538 resources_.get(), | 533 resources_.get(), |
| 539 &pnacl_options_, | 534 &pnacl_options_, |
| 540 architecture_attributes_, | 535 architecture_attributes_, |
| 541 this, | 536 this, |
| 542 plugin_); | 537 plugin_); |
| 543 } | 538 } |
| 544 | 539 |
| 545 } // namespace plugin | 540 } // namespace plugin |
| OLD | NEW |