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

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

Issue 299143004: Pepper: TempFile cleanup. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Saner fd behavior Created 6 years, 7 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
OLDNEW
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 177 matching lines...) Expand 10 before | Expand all | Expand 10 after
188 // before any scoped_* fields hanging off of PnaclCoordinator 188 // before any scoped_* fields hanging off of PnaclCoordinator
189 // since the thread may be accessing those fields. 189 // since the thread may be accessing those fields.
190 // It will also be accessing obj_files_. 190 // It will also be accessing obj_files_.
191 translate_thread_.reset(NULL); 191 translate_thread_.reset(NULL);
192 // TODO(jvoung): use base/memory/scoped_vector.h to hold obj_files_. 192 // TODO(jvoung): use base/memory/scoped_vector.h to hold obj_files_.
193 for (int i = 0; i < num_object_files_opened_; i++) { 193 for (int i = 0; i < num_object_files_opened_; i++) {
194 delete obj_files_[i]; 194 delete obj_files_[i];
195 } 195 }
196 } 196 }
197 197
198 nacl::DescWrapper* PnaclCoordinator::ReleaseTranslatedFD() { 198 PP_FileHandle PnaclCoordinator::TakeTranslatedFileHandle() {
199 DCHECK(temp_nexe_file_ != NULL); 199 DCHECK(temp_nexe_file_ != NULL);
200 return temp_nexe_file_->release_read_wrapper(); 200 return temp_nexe_file_->TakeFileHandle();
201 } 201 }
202 202
203 void PnaclCoordinator::ReportNonPpapiError(PP_NaClError err_code, 203 void PnaclCoordinator::ReportNonPpapiError(PP_NaClError err_code,
204 const nacl::string& message) { 204 const nacl::string& message) {
205 ErrorInfo error_info; 205 ErrorInfo error_info;
206 error_info.SetReport(err_code, message); 206 error_info.SetReport(err_code, message);
207 plugin_->ReportLoadError(error_info); 207 plugin_->ReportLoadError(error_info);
208 ExitWithError(); 208 ExitWithError();
209 } 209 }
210 210
(...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after
419 plugin_->nacl_interface()->GetNexeFd( 419 plugin_->nacl_interface()->GetNexeFd(
420 plugin_->pp_instance(), 420 plugin_->pp_instance(),
421 streaming_downloader_->full_url().c_str(), 421 streaming_downloader_->full_url().c_str(),
422 // TODO(dschuff): Get this value from the pnacl json file after it 422 // TODO(dschuff): Get this value from the pnacl json file after it
423 // rolls in from NaCl. 423 // rolls in from NaCl.
424 1, 424 1,
425 pnacl_options_.opt_level, 425 pnacl_options_.opt_level,
426 headers.c_str(), 426 headers.c_str(),
427 architecture_attributes_.c_str(), // Extra compile flags. 427 architecture_attributes_.c_str(), // Extra compile flags.
428 &is_cache_hit_, 428 &is_cache_hit_,
429 temp_nexe_file_->existing_handle(), 429 temp_nexe_file_->internal_handle(),
430 cb.pp_completion_callback()); 430 cb.pp_completion_callback());
431 if (nexe_fd_err < PP_OK_COMPLETIONPENDING) { 431 if (nexe_fd_err < PP_OK_COMPLETIONPENDING) {
432 ReportPpapiError(PP_NACL_ERROR_PNACL_CREATE_TEMP, nexe_fd_err, 432 ReportPpapiError(PP_NACL_ERROR_PNACL_CREATE_TEMP, nexe_fd_err,
433 nacl::string("Call to GetNexeFd failed")); 433 nacl::string("Call to GetNexeFd failed"));
434 } 434 }
435 } 435 }
436 436
437 void PnaclCoordinator::NexeFdDidOpen(int32_t pp_error) { 437 void PnaclCoordinator::NexeFdDidOpen(int32_t pp_error) {
438 PLUGIN_PRINTF(("PnaclCoordinator::NexeFdDidOpen (pp_error=%" 438 PLUGIN_PRINTF(("PnaclCoordinator::NexeFdDidOpen (pp_error=%"
439 NACL_PRId32 ", hit=%d, handle=%d)\n", pp_error, 439 NACL_PRId32 ", hit=%d)\n", pp_error,
440 is_cache_hit_ == PP_TRUE, 440 is_cache_hit_ == PP_TRUE));
441 *temp_nexe_file_->existing_handle()));
442 if (pp_error < PP_OK) { 441 if (pp_error < PP_OK) {
443 ReportPpapiError(PP_NACL_ERROR_PNACL_CREATE_TEMP, pp_error, 442 ReportPpapiError(PP_NACL_ERROR_PNACL_CREATE_TEMP, pp_error,
444 nacl::string("GetNexeFd failed")); 443 nacl::string("GetNexeFd failed"));
445 return; 444 return;
446 } 445 }
447 446
448 if (*temp_nexe_file_->existing_handle() == PP_kInvalidFileHandle) { 447 if (*temp_nexe_file_->internal_handle() == PP_kInvalidFileHandle) {
449 ReportNonPpapiError( 448 ReportNonPpapiError(
450 PP_NACL_ERROR_PNACL_CREATE_TEMP, 449 PP_NACL_ERROR_PNACL_CREATE_TEMP,
451 nacl::string( 450 nacl::string(
452 "PnaclCoordinator: Got bad temp file handle from GetNexeFd")); 451 "PnaclCoordinator: Got bad temp file handle from GetNexeFd"));
453 return; 452 return;
454 } 453 }
455 HistogramEnumerateTranslationCache(plugin_->uma_interface(), is_cache_hit_); 454 HistogramEnumerateTranslationCache(plugin_->uma_interface(), is_cache_hit_);
456 455
457 if (is_cache_hit_ == PP_TRUE) { 456 if (is_cache_hit_ == PP_TRUE) {
458 // Cache hit -- no need to stream the rest of the file. 457 // Cache hit -- no need to stream the rest of the file.
459 streaming_downloader_.reset(NULL); 458 streaming_downloader_.reset(NULL);
460 // Open it for reading as the cached nexe file. 459 // Open it for reading as the cached nexe file.
461 pp::CompletionCallback cb = 460 NexeReadDidOpen(temp_nexe_file_->Open(false));
462 callback_factory_.NewCallback(&PnaclCoordinator::NexeReadDidOpen);
463 temp_nexe_file_->Open(cb, false);
464 } else { 461 } else {
465 // Open an object file first so the translator can start writing to it 462 // Open an object file first so the translator can start writing to it
466 // during streaming translation. 463 // during streaming translation.
467 for (int i = 0; i < split_module_count_; i++) { 464 for (int i = 0; i < split_module_count_; i++) {
468 obj_files_.push_back(new TempFile(plugin_)); 465 obj_files_.push_back(new TempFile(plugin_));
469 466 int32_t pp_error = obj_files_[i]->Open(true);
470 pp::CompletionCallback obj_cb = 467 if (pp_error != PP_OK) {
471 callback_factory_.NewCallback(&PnaclCoordinator::ObjectFileDidOpen); 468 ReportPpapiError(PP_NACL_ERROR_PNACL_CREATE_TEMP,
472 obj_files_[i]->Open(obj_cb, true); 469 pp_error,
470 "Failed to open scratch object file.");
471 } else {
472 num_object_files_opened_++;
473 }
473 } 474 }
474 invalid_desc_wrapper_.reset(plugin_->wrapper_factory()->MakeInvalid()); 475 invalid_desc_wrapper_.reset(plugin_->wrapper_factory()->MakeInvalid());
475 476
476 // Meanwhile, a miss means we know we need to stream the bitcode, so stream 477 // Meanwhile, a miss means we know we need to stream the bitcode, so stream
477 // the rest of it now. (Calling FinishStreaming means that the downloader 478 // the rest of it now. (Calling FinishStreaming means that the downloader
478 // will begin handing data to the coordinator, which is safe any time after 479 // will begin handing data to the coordinator, which is safe any time after
479 // the translate_thread_ object has been initialized). 480 // the translate_thread_ object has been initialized).
480 pp::CompletionCallback finish_cb = callback_factory_.NewCallback( 481 pp::CompletionCallback finish_cb = callback_factory_.NewCallback(
481 &PnaclCoordinator::BitcodeStreamDidFinish); 482 &PnaclCoordinator::BitcodeStreamDidFinish);
482 streaming_downloader_->FinishStreaming(finish_cb); 483 streaming_downloader_->FinishStreaming(finish_cb);
484
485 if (num_object_files_opened_ == split_module_count_) {
486 // Open the nexe file for connecting ld and sel_ldr.
487 // Start translation when done with this last step of setup!
488 RunTranslate(temp_nexe_file_->Open(true));
489 }
483 } 490 }
484 } 491 }
485 492
486 void PnaclCoordinator::BitcodeStreamDidFinish(int32_t pp_error) { 493 void PnaclCoordinator::BitcodeStreamDidFinish(int32_t pp_error) {
487 PLUGIN_PRINTF(("PnaclCoordinator::BitcodeStreamDidFinish (pp_error=%" 494 PLUGIN_PRINTF(("PnaclCoordinator::BitcodeStreamDidFinish (pp_error=%"
488 NACL_PRId32 ")\n", pp_error)); 495 NACL_PRId32 ")\n", pp_error));
489 if (pp_error != PP_OK) { 496 if (pp_error != PP_OK) {
490 // Defer reporting the error and cleanup until after the translation 497 // Defer reporting the error and cleanup until after the translation
491 // thread returns, because it may be accessing the coordinator's 498 // thread returns, because it may be accessing the coordinator's
492 // objects or writing to the files. 499 // objects or writing to the files.
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
579 event_name, 586 event_name,
580 microsecs); 587 microsecs);
581 } 588 }
582 589
583 void PnaclCoordinator::GetCurrentProgress(int64_t* bytes_loaded, 590 void PnaclCoordinator::GetCurrentProgress(int64_t* bytes_loaded,
584 int64_t* bytes_total) { 591 int64_t* bytes_total) {
585 *bytes_loaded = pexe_bytes_compiled_; 592 *bytes_loaded = pexe_bytes_compiled_;
586 *bytes_total = expected_pexe_size_; 593 *bytes_total = expected_pexe_size_;
587 } 594 }
588 595
589 void PnaclCoordinator::ObjectFileDidOpen(int32_t pp_error) {
590 PLUGIN_PRINTF(("PnaclCoordinator::ObjectFileDidOpen (pp_error=%"
591 NACL_PRId32 ")\n", pp_error));
592 if (pp_error != PP_OK) {
593 ReportPpapiError(PP_NACL_ERROR_PNACL_CREATE_TEMP,
594 pp_error,
595 "Failed to open scratch object file.");
596 return;
597 }
598 num_object_files_opened_++;
599 if (num_object_files_opened_ == split_module_count_) {
600 // Open the nexe file for connecting ld and sel_ldr.
601 // Start translation when done with this last step of setup!
602 pp::CompletionCallback cb =
603 callback_factory_.NewCallback(&PnaclCoordinator::RunTranslate);
604 temp_nexe_file_->Open(cb, true);
605 }
606 }
607
608 void PnaclCoordinator::RunTranslate(int32_t pp_error) { 596 void PnaclCoordinator::RunTranslate(int32_t pp_error) {
609 PLUGIN_PRINTF(("PnaclCoordinator::RunTranslate (pp_error=%" 597 PLUGIN_PRINTF(("PnaclCoordinator::RunTranslate (pp_error=%"
610 NACL_PRId32 ")\n", pp_error)); 598 NACL_PRId32 ")\n", pp_error));
611 // Invoke llc followed by ld off the main thread. This allows use of 599 // Invoke llc followed by ld off the main thread. This allows use of
612 // blocking RPCs that would otherwise block the JavaScript main thread. 600 // blocking RPCs that would otherwise block the JavaScript main thread.
613 pp::CompletionCallback report_translate_finished = 601 pp::CompletionCallback report_translate_finished =
614 callback_factory_.NewCallback(&PnaclCoordinator::TranslateFinished); 602 callback_factory_.NewCallback(&PnaclCoordinator::TranslateFinished);
615 603
616 CHECK(translate_thread_ != NULL); 604 CHECK(translate_thread_ != NULL);
617 translate_thread_->RunTranslate(report_translate_finished, 605 translate_thread_->RunTranslate(report_translate_finished,
618 &obj_files_, 606 &obj_files_,
619 temp_nexe_file_.get(), 607 temp_nexe_file_.get(),
620 invalid_desc_wrapper_.get(), 608 invalid_desc_wrapper_.get(),
621 &error_info_, 609 &error_info_,
622 resources_.get(), 610 resources_.get(),
623 &pnacl_options_, 611 &pnacl_options_,
624 architecture_attributes_, 612 architecture_attributes_,
625 this, 613 this,
626 plugin_); 614 plugin_);
627 } 615 }
628 616
629 } // namespace plugin 617 } // namespace plugin
OLDNEW
« no previous file with comments | « ppapi/native_client/src/trusted/plugin/pnacl_coordinator.h ('k') | ppapi/native_client/src/trusted/plugin/temporary_file.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698