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/native_client/src/trusted/plugin/plugin.h" | 10 #include "ppapi/native_client/src/trusted/plugin/plugin.h" |
11 #include "ppapi/native_client/src/trusted/plugin/plugin_error.h" | 11 #include "ppapi/native_client/src/trusted/plugin/plugin_error.h" |
12 #include "ppapi/native_client/src/trusted/plugin/pnacl_resources.h" | 12 #include "ppapi/native_client/src/trusted/plugin/pnacl_resources.h" |
13 #include "ppapi/native_client/src/trusted/plugin/srpc_params.h" | 13 #include "ppapi/native_client/src/trusted/plugin/srpc_params.h" |
14 #include "ppapi/native_client/src/trusted/plugin/temporary_file.h" | 14 #include "ppapi/native_client/src/trusted/plugin/temporary_file.h" |
15 #include "ppapi/native_client/src/trusted/plugin/utility.h" | 15 #include "ppapi/native_client/src/trusted/plugin/utility.h" |
16 | 16 |
17 namespace plugin { | 17 namespace plugin { |
18 | 18 |
19 PnaclTranslateThread::PnaclTranslateThread() : llc_subprocess_active_(false), | 19 PnaclTranslateThread::PnaclTranslateThread() : llc_subprocess_active_(false), |
20 ld_subprocess_active_(false), | 20 ld_subprocess_active_(false), |
21 done_(false), | 21 done_(false), |
22 time_stats_(), | 22 compile_time_(0), |
23 manifest_(NULL), | 23 manifest_(NULL), |
24 obj_files_(NULL), | 24 obj_files_(NULL), |
25 nexe_file_(NULL), | 25 nexe_file_(NULL), |
26 coordinator_error_info_(NULL), | 26 coordinator_error_info_(NULL), |
27 resources_(NULL), | 27 resources_(NULL), |
28 coordinator_(NULL), | 28 coordinator_(NULL), |
29 plugin_(NULL) { | 29 plugin_(NULL) { |
30 NaClXMutexCtor(&subprocess_mu_); | 30 NaClXMutexCtor(&subprocess_mu_); |
31 NaClXMutexCtor(&cond_mu_); | 31 NaClXMutexCtor(&cond_mu_); |
32 NaClXCondVarCtor(&buffer_cond_); | 32 NaClXCondVarCtor(&buffer_cond_); |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
142 SrpcParams params; | 142 SrpcParams params; |
143 std::vector<nacl::DescWrapper*> llc_out_files; | 143 std::vector<nacl::DescWrapper*> llc_out_files; |
144 size_t i; | 144 size_t i; |
145 for (i = 0; i < obj_files_->size(); i++) { | 145 for (i = 0; i < obj_files_->size(); i++) { |
146 llc_out_files.push_back((*obj_files_)[i]->write_wrapper()); | 146 llc_out_files.push_back((*obj_files_)[i]->write_wrapper()); |
147 } | 147 } |
148 for (; i < PnaclCoordinator::kMaxTranslatorObjectFiles; i++) { | 148 for (; i < PnaclCoordinator::kMaxTranslatorObjectFiles; i++) { |
149 llc_out_files.push_back(invalid_desc_wrapper_); | 149 llc_out_files.push_back(invalid_desc_wrapper_); |
150 } | 150 } |
151 | 151 |
| 152 pp::Core* core = pp::Module::Get()->core(); |
152 { | 153 { |
153 nacl::MutexLocker ml(&subprocess_mu_); | 154 nacl::MutexLocker ml(&subprocess_mu_); |
154 int64_t llc_start_time = NaClGetTimeOfDayMicroseconds(); | 155 int64_t llc_start_time = NaClGetTimeOfDayMicroseconds(); |
155 llc_subprocess_.reset( | 156 llc_subprocess_.reset( |
156 StartSubprocess(resources_->GetLlcUrl(), manifest_, &error_info)); | 157 StartSubprocess(resources_->GetLlcUrl(), manifest_, &error_info)); |
157 if (llc_subprocess_ == NULL) { | 158 if (llc_subprocess_ == NULL) { |
158 TranslateFailed(PP_NACL_ERROR_PNACL_LLC_SETUP, | 159 TranslateFailed(PP_NACL_ERROR_PNACL_LLC_SETUP, |
159 "Compile process could not be created: " + | 160 "Compile process could not be created: " + |
160 error_info.message()); | 161 error_info.message()); |
161 return; | 162 return; |
162 } | 163 } |
163 llc_subprocess_active_ = true; | 164 llc_subprocess_active_ = true; |
164 time_stats_.pnacl_llc_load_time = | 165 core->CallOnMainThread(0, |
165 (NaClGetTimeOfDayMicroseconds() - llc_start_time); | 166 coordinator_->GetUMATimeCallback( |
| 167 "NaCl.Perf.PNaClLoadTime.LoadCompiler", |
| 168 NaClGetTimeOfDayMicroseconds() - llc_start_time), |
| 169 PP_OK); |
166 // Run LLC. | 170 // Run LLC. |
167 PluginReverseInterface* llc_reverse = | 171 PluginReverseInterface* llc_reverse = |
168 llc_subprocess_->service_runtime()->rev_interface(); | 172 llc_subprocess_->service_runtime()->rev_interface(); |
169 for (size_t i = 0; i < obj_files_->size(); i++) { | 173 for (size_t i = 0; i < obj_files_->size(); i++) { |
170 llc_reverse->AddTempQuotaManagedFile((*obj_files_)[i]->identifier()); | 174 llc_reverse->AddTempQuotaManagedFile((*obj_files_)[i]->identifier()); |
171 } | 175 } |
172 } | 176 } |
173 | 177 |
174 int64_t compile_start_time = NaClGetTimeOfDayMicroseconds(); | 178 int64_t compile_start_time = NaClGetTimeOfDayMicroseconds(); |
175 bool init_success; | 179 bool init_success; |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
214 // The error message is only present if the error was returned from llc | 218 // The error message is only present if the error was returned from llc |
215 TranslateFailed(PP_NACL_ERROR_PNACL_LLC_INTERNAL, | 219 TranslateFailed(PP_NACL_ERROR_PNACL_LLC_INTERNAL, |
216 nacl::string("Stream init failed: ") + | 220 nacl::string("Stream init failed: ") + |
217 nacl::string(params.outs()[0]->arrays.str)); | 221 nacl::string(params.outs()[0]->arrays.str)); |
218 } else { | 222 } else { |
219 TranslateFailed(PP_NACL_ERROR_PNACL_LLC_INTERNAL, | 223 TranslateFailed(PP_NACL_ERROR_PNACL_LLC_INTERNAL, |
220 "Stream init internal error"); | 224 "Stream init internal error"); |
221 } | 225 } |
222 return; | 226 return; |
223 } | 227 } |
224 | |
225 PLUGIN_PRINTF(("PnaclCoordinator: StreamInit successful\n")); | 228 PLUGIN_PRINTF(("PnaclCoordinator: StreamInit successful\n")); |
226 pp::Core* core = pp::Module::Get()->core(); | |
227 | 229 |
228 // llc process is started. | 230 // llc process is started. |
229 while(!done_ || data_buffers_.size() > 0) { | 231 while(!done_ || data_buffers_.size() > 0) { |
230 NaClXMutexLock(&cond_mu_); | 232 NaClXMutexLock(&cond_mu_); |
231 while(!done_ && data_buffers_.size() == 0) { | 233 while(!done_ && data_buffers_.size() == 0) { |
232 NaClXCondVarWait(&buffer_cond_, &cond_mu_); | 234 NaClXCondVarWait(&buffer_cond_, &cond_mu_); |
233 } | 235 } |
234 PLUGIN_PRINTF(("PnaclTranslateThread awake (done=%d, size=%" NACL_PRIuS | 236 PLUGIN_PRINTF(("PnaclTranslateThread awake (done=%d, size=%" NACL_PRIuS |
235 ")\n", | 237 ")\n", |
236 done_, data_buffers_.size())); | 238 done_, data_buffers_.size())); |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
276 NACL_SRPC_RESULT_APP_ERROR) { | 278 NACL_SRPC_RESULT_APP_ERROR) { |
277 // The error string is only present if the error was sent back from llc. | 279 // The error string is only present if the error was sent back from llc. |
278 TranslateFailed(PP_NACL_ERROR_PNACL_LLC_INTERNAL, | 280 TranslateFailed(PP_NACL_ERROR_PNACL_LLC_INTERNAL, |
279 params.outs()[3]->arrays.str); | 281 params.outs()[3]->arrays.str); |
280 } else { | 282 } else { |
281 TranslateFailed(PP_NACL_ERROR_PNACL_LLC_INTERNAL, | 283 TranslateFailed(PP_NACL_ERROR_PNACL_LLC_INTERNAL, |
282 "Compile StreamEnd internal error"); | 284 "Compile StreamEnd internal error"); |
283 } | 285 } |
284 return; | 286 return; |
285 } | 287 } |
286 time_stats_.pnacl_compile_time = | 288 compile_time_ = NaClGetTimeOfDayMicroseconds() - compile_start_time; |
287 (NaClGetTimeOfDayMicroseconds() - compile_start_time); | 289 core->CallOnMainThread(0, |
| 290 coordinator_->GetUMATimeCallback( |
| 291 "NaCl.Perf.PNaClLoadTime.CompileTime", |
| 292 compile_time_), |
| 293 PP_OK); |
288 | 294 |
289 // Shut down the llc subprocess. | 295 // Shut down the llc subprocess. |
290 NaClXMutexLock(&subprocess_mu_); | 296 NaClXMutexLock(&subprocess_mu_); |
291 llc_subprocess_active_ = false; | 297 llc_subprocess_active_ = false; |
292 llc_subprocess_.reset(NULL); | 298 llc_subprocess_.reset(NULL); |
293 NaClXMutexUnlock(&subprocess_mu_); | 299 NaClXMutexUnlock(&subprocess_mu_); |
294 | 300 |
295 if(!RunLdSubprocess()) { | 301 if(!RunLdSubprocess()) { |
296 return; | 302 return; |
297 } | 303 } |
(...skipping 13 matching lines...) Expand all Loading... |
311 "Link process could not reset object file"); | 317 "Link process could not reset object file"); |
312 return false; | 318 return false; |
313 } | 319 } |
314 ld_in_files.push_back((*obj_files_)[i]->read_wrapper()); | 320 ld_in_files.push_back((*obj_files_)[i]->read_wrapper()); |
315 } | 321 } |
316 for (; i < PnaclCoordinator::kMaxTranslatorObjectFiles; i++) { | 322 for (; i < PnaclCoordinator::kMaxTranslatorObjectFiles; i++) { |
317 ld_in_files.push_back(invalid_desc_wrapper_); | 323 ld_in_files.push_back(invalid_desc_wrapper_); |
318 } | 324 } |
319 | 325 |
320 nacl::DescWrapper* ld_out_file = nexe_file_->write_wrapper(); | 326 nacl::DescWrapper* ld_out_file = nexe_file_->write_wrapper(); |
321 | 327 pp::Core* core = pp::Module::Get()->core(); |
322 { | 328 { |
323 // Create LD process | 329 // Create LD process |
324 nacl::MutexLocker ml(&subprocess_mu_); | 330 nacl::MutexLocker ml(&subprocess_mu_); |
325 int64_t ld_start_time = NaClGetTimeOfDayMicroseconds(); | 331 int64_t ld_start_time = NaClGetTimeOfDayMicroseconds(); |
326 ld_subprocess_.reset( | 332 ld_subprocess_.reset( |
327 StartSubprocess(resources_->GetLdUrl(), manifest_, &error_info)); | 333 StartSubprocess(resources_->GetLdUrl(), manifest_, &error_info)); |
328 if (ld_subprocess_ == NULL) { | 334 if (ld_subprocess_ == NULL) { |
329 TranslateFailed(PP_NACL_ERROR_PNACL_LD_SETUP, | 335 TranslateFailed(PP_NACL_ERROR_PNACL_LD_SETUP, |
330 "Link process could not be created: " + | 336 "Link process could not be created: " + |
331 error_info.message()); | 337 error_info.message()); |
332 return false; | 338 return false; |
333 } | 339 } |
334 ld_subprocess_active_ = true; | 340 ld_subprocess_active_ = true; |
335 time_stats_.pnacl_ld_load_time = | 341 core->CallOnMainThread(0, |
336 (NaClGetTimeOfDayMicroseconds() - ld_start_time); | 342 coordinator_->GetUMATimeCallback( |
| 343 "NaCl.Perf.PNaClLoadTime.LoadLinker", |
| 344 NaClGetTimeOfDayMicroseconds() - ld_start_time), |
| 345 PP_OK); |
337 PluginReverseInterface* ld_reverse = | 346 PluginReverseInterface* ld_reverse = |
338 ld_subprocess_->service_runtime()->rev_interface(); | 347 ld_subprocess_->service_runtime()->rev_interface(); |
339 ld_reverse->AddTempQuotaManagedFile(nexe_file_->identifier()); | 348 ld_reverse->AddTempQuotaManagedFile(nexe_file_->identifier()); |
340 } | 349 } |
341 | 350 |
342 int64_t link_start_time = NaClGetTimeOfDayMicroseconds(); | 351 int64_t link_start_time = NaClGetTimeOfDayMicroseconds(); |
343 // Run LD. | 352 // Run LD. |
344 bool success = ld_subprocess_->InvokeSrpcMethod( | 353 bool success = ld_subprocess_->InvokeSrpcMethod( |
345 "RunWithSplit", | 354 "RunWithSplit", |
346 "ihhhhhhhhhhhhhhhhh", | 355 "ihhhhhhhhhhhhhhhhh", |
(...skipping 14 matching lines...) Expand all Loading... |
361 ld_in_files[12]->desc(), | 370 ld_in_files[12]->desc(), |
362 ld_in_files[13]->desc(), | 371 ld_in_files[13]->desc(), |
363 ld_in_files[14]->desc(), | 372 ld_in_files[14]->desc(), |
364 ld_in_files[15]->desc(), | 373 ld_in_files[15]->desc(), |
365 ld_out_file->desc()); | 374 ld_out_file->desc()); |
366 if (!success) { | 375 if (!success) { |
367 TranslateFailed(PP_NACL_ERROR_PNACL_LD_INTERNAL, | 376 TranslateFailed(PP_NACL_ERROR_PNACL_LD_INTERNAL, |
368 "link failed."); | 377 "link failed."); |
369 return false; | 378 return false; |
370 } | 379 } |
371 time_stats_.pnacl_link_time = | 380 core->CallOnMainThread(0, |
372 NaClGetTimeOfDayMicroseconds() - link_start_time; | 381 coordinator_->GetUMATimeCallback( |
| 382 "NaCl.Perf.PNaClLoadTime.LinkTime", |
| 383 NaClGetTimeOfDayMicroseconds() - link_start_time), |
| 384 PP_OK); |
373 PLUGIN_PRINTF(("PnaclCoordinator: link (translator=%p) succeeded\n", | 385 PLUGIN_PRINTF(("PnaclCoordinator: link (translator=%p) succeeded\n", |
374 this)); | 386 this)); |
375 // Shut down the ld subprocess. | 387 // Shut down the ld subprocess. |
376 NaClXMutexLock(&subprocess_mu_); | 388 NaClXMutexLock(&subprocess_mu_); |
377 ld_subprocess_active_ = false; | 389 ld_subprocess_active_ = false; |
378 ld_subprocess_.reset(NULL); | 390 ld_subprocess_.reset(NULL); |
379 NaClXMutexUnlock(&subprocess_mu_); | 391 NaClXMutexUnlock(&subprocess_mu_); |
380 return true; | 392 return true; |
381 } | 393 } |
382 | 394 |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
420 AbortSubprocesses(); | 432 AbortSubprocesses(); |
421 if (translate_thread_ != NULL) | 433 if (translate_thread_ != NULL) |
422 NaClThreadJoin(translate_thread_.get()); | 434 NaClThreadJoin(translate_thread_.get()); |
423 PLUGIN_PRINTF(("~PnaclTranslateThread joined\n")); | 435 PLUGIN_PRINTF(("~PnaclTranslateThread joined\n")); |
424 NaClCondVarDtor(&buffer_cond_); | 436 NaClCondVarDtor(&buffer_cond_); |
425 NaClMutexDtor(&cond_mu_); | 437 NaClMutexDtor(&cond_mu_); |
426 NaClMutexDtor(&subprocess_mu_); | 438 NaClMutexDtor(&subprocess_mu_); |
427 } | 439 } |
428 | 440 |
429 } // namespace plugin | 441 } // namespace plugin |
OLD | NEW |