| 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..75416a53848d492290c30aa175be5ecbd5df9a1f 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,37 @@ 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();
|
| + // On success, ownership of llc_file_handle is transferred.
|
| + 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",
|
| + 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 +435,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;
|
|
|