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_translate_thread.h" | 5 #include "ppapi/native_client/src/trusted/plugin/pnacl_translate_thread.h" |
6 | 6 |
7 #include <iterator> | 7 #include <iterator> |
8 | 8 |
9 #include "native_client/src/trusted/desc/nacl_desc_wrapper.h" | 9 #include "native_client/src/trusted/desc/nacl_desc_wrapper.h" |
10 #include "ppapi/cpp/var.h" | 10 #include "ppapi/cpp/var.h" |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
47 for (Args::const_iterator arg(args.begin()); arg != args.end(); ++arg) { | 47 for (Args::const_iterator arg(args.begin()); arg != args.end(); ++arg) { |
48 std::copy(arg->begin(), arg->end(), std::back_inserter(*split_args)); | 48 std::copy(arg->begin(), arg->end(), std::back_inserter(*split_args)); |
49 split_args->push_back('\x00'); | 49 split_args->push_back('\x00'); |
50 } | 50 } |
51 } | 51 } |
52 | 52 |
53 } // namespace | 53 } // namespace |
54 | 54 |
55 PnaclTranslateThread::PnaclTranslateThread() : llc_subprocess_active_(false), | 55 PnaclTranslateThread::PnaclTranslateThread() : llc_subprocess_active_(false), |
56 ld_subprocess_active_(false), | 56 ld_subprocess_active_(false), |
57 subprocesses_aborted_(false), | |
57 done_(false), | 58 done_(false), |
58 compile_time_(0), | 59 compile_time_(0), |
59 obj_files_(NULL), | 60 obj_files_(NULL), |
60 nexe_file_(NULL), | 61 nexe_file_(NULL), |
61 coordinator_error_info_(NULL), | 62 coordinator_error_info_(NULL), |
62 resources_(NULL), | 63 resources_(NULL), |
63 coordinator_(NULL), | 64 coordinator_(NULL), |
64 plugin_(NULL) { | 65 plugin_(NULL) { |
65 NaClXMutexCtor(&subprocess_mu_); | 66 NaClXMutexCtor(&subprocess_mu_); |
66 NaClXMutexCtor(&cond_mu_); | 67 NaClXMutexCtor(&cond_mu_); |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
153 ErrorInfo error_info; | 154 ErrorInfo error_info; |
154 SrpcParams params; | 155 SrpcParams params; |
155 std::vector<nacl::DescWrapper*> llc_out_files; | 156 std::vector<nacl::DescWrapper*> llc_out_files; |
156 size_t i; | 157 size_t i; |
157 for (i = 0; i < obj_files_->size(); i++) | 158 for (i = 0; i < obj_files_->size(); i++) |
158 llc_out_files.push_back((*obj_files_)[i]->write_wrapper()); | 159 llc_out_files.push_back((*obj_files_)[i]->write_wrapper()); |
159 for (; i < PnaclCoordinator::kMaxTranslatorObjectFiles; i++) | 160 for (; i < PnaclCoordinator::kMaxTranslatorObjectFiles; i++) |
160 llc_out_files.push_back(invalid_desc_wrapper_); | 161 llc_out_files.push_back(invalid_desc_wrapper_); |
161 | 162 |
162 pp::Core* core = pp::Module::Get()->core(); | 163 pp::Core* core = pp::Module::Get()->core(); |
164 int64_t llc_start_time = NaClGetTimeOfDayMicroseconds(); | |
165 PP_FileHandle llc_file_handle = resources_->TakeLlcFileHandle(); | |
166 NaClSubprocess* llc_subprocess = plugin_->LoadHelperNaClModule( | |
167 resources_->GetLlcUrl(), llc_file_handle, &error_info); | |
168 if (llc_subprocess == NULL) { | |
169 if (llc_file_handle != PP_kInvalidFileHandle) | |
170 CloseFileHandle(llc_file_handle); | |
171 TranslateFailed(PP_NACL_ERROR_PNACL_LLC_SETUP, | |
172 "Compile process could not be created: " + | |
173 error_info.message()); | |
174 return; | |
175 } | |
176 core->CallOnMainThread(0, | |
177 coordinator_->GetUMATimeCallback( | |
178 "NaCl.Perf.PNaClLoadTime.LoadCompiler", | |
bbudge
2014/05/30 17:53:19
nit: indent arguments
| |
179 NaClGetTimeOfDayMicroseconds() - llc_start_time), | |
180 PP_OK); | |
181 | |
163 { | 182 { |
164 nacl::MutexLocker ml(&subprocess_mu_); | 183 nacl::MutexLocker ml(&subprocess_mu_); |
165 int64_t llc_start_time = NaClGetTimeOfDayMicroseconds(); | 184 // If we received a call to AbortSubprocesses() before we had a chance to |
166 PP_FileHandle llc_file_handle = resources_->TakeLlcFileHandle(); | 185 // set llc_subprocess_, shut down and clean up the subprocess started here. |
167 | 186 if (subprocesses_aborted_) { |
168 // On success, ownership of llc_file_handle is transferred. | 187 llc_subprocess->service_runtime()->Shutdown(); |
169 llc_subprocess_.reset(plugin_->LoadHelperNaClModule( | 188 delete llc_subprocess; |
170 resources_->GetLlcUrl(), llc_file_handle, &error_info)); | |
171 if (llc_subprocess_.get() == NULL) { | |
172 if (llc_file_handle != PP_kInvalidFileHandle) | |
173 CloseFileHandle(llc_file_handle); | |
174 TranslateFailed(PP_NACL_ERROR_PNACL_LLC_SETUP, | |
175 "Compile process could not be created: " + | |
176 error_info.message()); | |
177 return; | 189 return; |
178 } | 190 } |
179 | 191 llc_subprocess_.reset(llc_subprocess); |
192 llc_subprocess = NULL; | |
180 llc_subprocess_active_ = true; | 193 llc_subprocess_active_ = true; |
181 core->CallOnMainThread(0, | |
182 coordinator_->GetUMATimeCallback( | |
183 "NaCl.Perf.PNaClLoadTime.LoadCompiler", | |
184 NaClGetTimeOfDayMicroseconds() - llc_start_time), | |
185 PP_OK); | |
186 } | 194 } |
187 | 195 |
188 int64_t compile_start_time = NaClGetTimeOfDayMicroseconds(); | 196 int64_t compile_start_time = NaClGetTimeOfDayMicroseconds(); |
189 bool init_success; | 197 bool init_success; |
190 | 198 |
191 std::vector<char> split_args; | 199 std::vector<char> split_args; |
192 GetLlcCommandLine(plugin_, | 200 GetLlcCommandLine(plugin_, |
193 &split_args, | 201 &split_args, |
194 obj_files_->size(), | 202 obj_files_->size(), |
195 pnacl_options_->opt_level, | 203 pnacl_options_->opt_level, |
(...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
419 PLUGIN_PRINTF(("PnaclTranslateThread::AbortSubprocesses\n")); | 427 PLUGIN_PRINTF(("PnaclTranslateThread::AbortSubprocesses\n")); |
420 NaClXMutexLock(&subprocess_mu_); | 428 NaClXMutexLock(&subprocess_mu_); |
421 if (llc_subprocess_ != NULL && llc_subprocess_active_) { | 429 if (llc_subprocess_ != NULL && llc_subprocess_active_) { |
422 llc_subprocess_->service_runtime()->Shutdown(); | 430 llc_subprocess_->service_runtime()->Shutdown(); |
423 llc_subprocess_active_ = false; | 431 llc_subprocess_active_ = false; |
424 } | 432 } |
425 if (ld_subprocess_ != NULL && ld_subprocess_active_) { | 433 if (ld_subprocess_ != NULL && ld_subprocess_active_) { |
426 ld_subprocess_->service_runtime()->Shutdown(); | 434 ld_subprocess_->service_runtime()->Shutdown(); |
427 ld_subprocess_active_ = false; | 435 ld_subprocess_active_ = false; |
428 } | 436 } |
437 subprocesses_aborted_ = true; | |
429 NaClXMutexUnlock(&subprocess_mu_); | 438 NaClXMutexUnlock(&subprocess_mu_); |
430 nacl::MutexLocker ml(&cond_mu_); | 439 nacl::MutexLocker ml(&cond_mu_); |
431 done_ = true; | 440 done_ = true; |
432 // Free all buffered bitcode chunks | 441 // Free all buffered bitcode chunks |
433 data_buffers_.clear(); | 442 data_buffers_.clear(); |
434 NaClXCondVarSignal(&buffer_cond_); | 443 NaClXCondVarSignal(&buffer_cond_); |
435 } | 444 } |
436 | 445 |
437 PnaclTranslateThread::~PnaclTranslateThread() { | 446 PnaclTranslateThread::~PnaclTranslateThread() { |
438 PLUGIN_PRINTF(("~PnaclTranslateThread (translate_thread=%p)\n", this)); | 447 PLUGIN_PRINTF(("~PnaclTranslateThread (translate_thread=%p)\n", this)); |
439 AbortSubprocesses(); | 448 AbortSubprocesses(); |
440 if (translate_thread_ != NULL) | 449 if (translate_thread_ != NULL) |
441 NaClThreadJoin(translate_thread_.get()); | 450 NaClThreadJoin(translate_thread_.get()); |
442 PLUGIN_PRINTF(("~PnaclTranslateThread joined\n")); | 451 PLUGIN_PRINTF(("~PnaclTranslateThread joined\n")); |
443 NaClCondVarDtor(&buffer_cond_); | 452 NaClCondVarDtor(&buffer_cond_); |
444 NaClMutexDtor(&cond_mu_); | 453 NaClMutexDtor(&cond_mu_); |
445 NaClMutexDtor(&subprocess_mu_); | 454 NaClMutexDtor(&subprocess_mu_); |
446 } | 455 } |
447 | 456 |
448 } // namespace plugin | 457 } // namespace plugin |
OLD | NEW |