Chromium Code Reviews| Index: ppapi/native_client/src/trusted/plugin/pnacl_translate_thread.cc |
| diff --git a/ppapi/native_client/src/trusted/plugin/pnacl_translate_thread.cc b/ppapi/native_client/src/trusted/plugin/pnacl_translate_thread.cc |
| index 43e9fa557ccdfd3ee14a71340f6a981ca0d70698..416f15ec30c3dcff209418836aa75d195806e1c8 100644 |
| --- a/ppapi/native_client/src/trusted/plugin/pnacl_translate_thread.cc |
| +++ b/ppapi/native_client/src/trusted/plugin/pnacl_translate_thread.cc |
| @@ -54,6 +54,7 @@ void GetLlcCommandLine(Plugin* plugin, |
| PnaclTranslateThread::PnaclTranslateThread() : llc_subprocess_active_(false), |
| ld_subprocess_active_(false), |
| + subprocesses_aborted_(false), |
| done_(false), |
| compile_time_(0), |
| obj_files_(NULL), |
| @@ -160,29 +161,36 @@ void PnaclTranslateThread::DoTranslate() { |
| llc_out_files.push_back(invalid_desc_wrapper_); |
| pp::Core* core = pp::Module::Get()->core(); |
| + int64_t llc_start_time = NaClGetTimeOfDayMicroseconds(); |
| + PP_FileHandle llc_file_handle = resources_->TakeLlcFileHandle(); |
| + NaClSubprocess* llc_subprocess = plugin_->LoadHelperNaClModule( |
| + resources_->GetLlcUrl(), llc_file_handle, &error_info); |
| + if (llc_subprocess == NULL) { |
| + if (llc_file_handle != PP_kInvalidFileHandle) |
| + CloseFileHandle(llc_file_handle); |
| + TranslateFailed(PP_NACL_ERROR_PNACL_LLC_SETUP, |
| + "Compile process could not be created: " + |
| + error_info.message()); |
| + return; |
| + } |
| + core->CallOnMainThread(0, |
| + coordinator_->GetUMATimeCallback( |
| + "NaCl.Perf.PNaClLoadTime.LoadCompiler", |
|
bbudge
2014/05/30 17:53:19
nit: indent arguments
|
| + NaClGetTimeOfDayMicroseconds() - llc_start_time), |
| + PP_OK); |
| + |
| { |
| nacl::MutexLocker ml(&subprocess_mu_); |
| - int64_t llc_start_time = NaClGetTimeOfDayMicroseconds(); |
| - PP_FileHandle llc_file_handle = resources_->TakeLlcFileHandle(); |
| - |
| - // On success, ownership of llc_file_handle is transferred. |
| - llc_subprocess_.reset(plugin_->LoadHelperNaClModule( |
| - resources_->GetLlcUrl(), llc_file_handle, &error_info)); |
| - if (llc_subprocess_.get() == NULL) { |
| - if (llc_file_handle != PP_kInvalidFileHandle) |
| - CloseFileHandle(llc_file_handle); |
| - TranslateFailed(PP_NACL_ERROR_PNACL_LLC_SETUP, |
| - "Compile process could not be created: " + |
| - error_info.message()); |
| + // If we received a call to AbortSubprocesses() before we had a chance to |
| + // set llc_subprocess_, shut down and clean up the subprocess started here. |
| + if (subprocesses_aborted_) { |
| + llc_subprocess->service_runtime()->Shutdown(); |
| + delete llc_subprocess; |
| return; |
| } |
| - |
| + llc_subprocess_.reset(llc_subprocess); |
| + llc_subprocess = NULL; |
| llc_subprocess_active_ = true; |
| - core->CallOnMainThread(0, |
| - coordinator_->GetUMATimeCallback( |
| - "NaCl.Perf.PNaClLoadTime.LoadCompiler", |
| - NaClGetTimeOfDayMicroseconds() - llc_start_time), |
| - PP_OK); |
| } |
| int64_t compile_start_time = NaClGetTimeOfDayMicroseconds(); |
| @@ -426,6 +434,7 @@ void PnaclTranslateThread::AbortSubprocesses() { |
| ld_subprocess_->service_runtime()->Shutdown(); |
| ld_subprocess_active_ = false; |
| } |
| + subprocesses_aborted_ = true; |
| NaClXMutexUnlock(&subprocess_mu_); |
| nacl::MutexLocker ml(&cond_mu_); |
| done_ = true; |