| 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 #ifdef _MSC_VER | 5 #ifdef _MSC_VER |
| 6 // Do not warn about use of std::copy with raw pointers. | 6 // Do not warn about use of std::copy with raw pointers. |
| 7 #pragma warning(disable : 4996) | 7 #pragma warning(disable : 4996) |
| 8 #endif | 8 #endif |
| 9 | 9 |
| 10 #include "ppapi/native_client/src/trusted/plugin/plugin.h" | 10 #include "ppapi/native_client/src/trusted/plugin/plugin.h" |
| (...skipping 284 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 295 ServiceRuntime* service_runtime = | 295 ServiceRuntime* service_runtime = |
| 296 new ServiceRuntime(this, manifest, false, | 296 new ServiceRuntime(this, manifest, false, |
| 297 pp::BlockUntilComplete(), pp::BlockUntilComplete()); | 297 pp::BlockUntilComplete(), pp::BlockUntilComplete()); |
| 298 subprocess->set_service_runtime(service_runtime); | 298 subprocess->set_service_runtime(service_runtime); |
| 299 PLUGIN_PRINTF(("Plugin::LoadNaClModuleFromBackgroundThread " | 299 PLUGIN_PRINTF(("Plugin::LoadNaClModuleFromBackgroundThread " |
| 300 "(service_runtime=%p)\n", | 300 "(service_runtime=%p)\n", |
| 301 static_cast<void*>(service_runtime))); | 301 static_cast<void*>(service_runtime))); |
| 302 | 302 |
| 303 // Now start the SelLdr instance. This must be created on the main thread. | 303 // Now start the SelLdr instance. This must be created on the main thread. |
| 304 bool service_runtime_started; | 304 bool service_runtime_started; |
| 305 pp::CompletionCallback sel_ldr_callback = |
| 306 callback_factory_.NewCallback(&Plugin::SignalStartSelLdrDone, |
| 307 &service_runtime_started, |
| 308 service_runtime); |
| 305 pp::CompletionCallback callback = | 309 pp::CompletionCallback callback = |
| 306 callback_factory_.NewCallback(&Plugin::StartSelLdrOnMainThread, | 310 callback_factory_.NewCallback(&Plugin::StartSelLdrOnMainThread, |
| 307 service_runtime, params, | 311 service_runtime, params, |
| 308 &service_runtime_started); | 312 sel_ldr_callback); |
| 309 pp::Module::Get()->core()->CallOnMainThread(0, callback, 0); | 313 pp::Module::Get()->core()->CallOnMainThread(0, callback, 0); |
| 310 service_runtime->WaitForSelLdrStart(); | 314 service_runtime->WaitForSelLdrStart(); |
| 311 PLUGIN_PRINTF(("Plugin::LoadNaClModuleFromBackgroundThread " | 315 PLUGIN_PRINTF(("Plugin::LoadNaClModuleFromBackgroundThread " |
| 312 "(service_runtime_started=%d)\n", | 316 "(service_runtime_started=%d)\n", |
| 313 service_runtime_started)); | 317 service_runtime_started)); |
| 314 if (!service_runtime_started) { | 318 if (!service_runtime_started) { |
| 315 return false; | 319 return false; |
| 316 } | 320 } |
| 317 | 321 |
| 318 // Now actually load the nexe, which can happen on a background thread. | 322 // Now actually load the nexe, which can happen on a background thread. |
| 319 bool nexe_loaded = service_runtime->LoadNexeAndStart( | 323 bool nexe_loaded = service_runtime->LoadNexeAndStart( |
| 320 wrapper, pp::BlockUntilComplete()); | 324 wrapper, pp::BlockUntilComplete()); |
| 321 PLUGIN_PRINTF(("Plugin::LoadNaClModuleFromBackgroundThread " | 325 PLUGIN_PRINTF(("Plugin::LoadNaClModuleFromBackgroundThread " |
| 322 "(nexe_loaded=%d)\n", | 326 "(nexe_loaded=%d)\n", |
| 323 nexe_loaded)); | 327 nexe_loaded)); |
| 324 return nexe_loaded; | 328 return nexe_loaded; |
| 325 } | 329 } |
| 326 | 330 |
| 327 void Plugin::StartSelLdrOnMainThread(int32_t pp_error, | 331 void Plugin::StartSelLdrOnMainThread(int32_t pp_error, |
| 328 ServiceRuntime* service_runtime, | 332 ServiceRuntime* service_runtime, |
| 329 const SelLdrStartParams& params, | 333 const SelLdrStartParams& params, |
| 330 bool* success) { | 334 pp::CompletionCallback callback) { |
| 331 if (pp_error != PP_OK) { | 335 if (pp_error != PP_OK) { |
| 332 PLUGIN_PRINTF(("Plugin::StartSelLdrOnMainThread: non-PP_OK arg " | 336 PLUGIN_PRINTF(("Plugin::StartSelLdrOnMainThread: non-PP_OK arg " |
| 333 "-- SHOULD NOT HAPPEN\n")); | 337 "-- SHOULD NOT HAPPEN\n")); |
| 334 *success = false; | 338 pp::Module::Get()->core()->CallOnMainThread(0, callback, pp_error); |
| 335 return; | 339 return; |
| 336 } | 340 } |
| 337 *success = service_runtime->StartSelLdr(params); | 341 service_runtime->StartSelLdr(params, callback); |
| 338 // Signal outside of StartSelLdr here, so that the write to *success | 342 } |
| 339 // is done before signaling. | 343 |
| 344 void Plugin::SignalStartSelLdrDone(int32_t pp_error, |
| 345 bool* started, |
| 346 ServiceRuntime* service_runtime) { |
| 347 *started = (pp_error == PP_OK); |
| 340 service_runtime->SignalStartSelLdrDone(); | 348 service_runtime->SignalStartSelLdrDone(); |
| 341 } | 349 } |
| 342 | 350 |
| 343 void Plugin::LoadNaClModule(nacl::DescWrapper* wrapper, | 351 void Plugin::LoadNaClModule(nacl::DescWrapper* wrapper, |
| 344 bool enable_dyncode_syscalls, | 352 bool enable_dyncode_syscalls, |
| 345 bool enable_exception_handling, | 353 bool enable_exception_handling, |
| 346 bool enable_crash_throttling, | 354 bool enable_crash_throttling, |
| 347 const pp::CompletionCallback& init_done_cb, | 355 const pp::CompletionCallback& init_done_cb, |
| 348 const pp::CompletionCallback& crash_cb) { | 356 const pp::CompletionCallback& crash_cb) { |
| 357 nacl::scoped_ptr<nacl::DescWrapper> scoped_wrapper(wrapper); |
| 349 CHECK(pp::Module::Get()->core()->IsMainThread()); | 358 CHECK(pp::Module::Get()->core()->IsMainThread()); |
| 350 // Before forking a new sel_ldr process, ensure that we do not leak | 359 // Before forking a new sel_ldr process, ensure that we do not leak |
| 351 // the ServiceRuntime object for an existing subprocess, and that any | 360 // the ServiceRuntime object for an existing subprocess, and that any |
| 352 // associated listener threads do not go unjoined because if they | 361 // associated listener threads do not go unjoined because if they |
| 353 // outlive the Plugin object, they will not be memory safe. | 362 // outlive the Plugin object, they will not be memory safe. |
| 354 ShutDownSubprocesses(); | 363 ShutDownSubprocesses(); |
| 355 SelLdrStartParams params(manifest_base_url(), | 364 SelLdrStartParams params(manifest_base_url(), |
| 356 true /* uses_irt */, | 365 true /* uses_irt */, |
| 357 true /* uses_ppapi */, | 366 true /* uses_ppapi */, |
| 358 enable_dev_interfaces_, | 367 enable_dev_interfaces_, |
| 359 enable_dyncode_syscalls, | 368 enable_dyncode_syscalls, |
| 360 enable_exception_handling, | 369 enable_exception_handling, |
| 361 enable_crash_throttling); | 370 enable_crash_throttling); |
| 362 ErrorInfo error_info; | 371 ErrorInfo error_info; |
| 363 ServiceRuntime* service_runtime = | 372 ServiceRuntime* service_runtime = |
| 364 new ServiceRuntime(this, manifest_.get(), true, init_done_cb, crash_cb); | 373 new ServiceRuntime(this, manifest_.get(), true, init_done_cb, crash_cb); |
| 365 main_subprocess_.set_service_runtime(service_runtime); | 374 main_subprocess_.set_service_runtime(service_runtime); |
| 366 PLUGIN_PRINTF(("Plugin::LoadNaClModule (service_runtime=%p)\n", | 375 PLUGIN_PRINTF(("Plugin::LoadNaClModule (service_runtime=%p)\n", |
| 367 static_cast<void*>(service_runtime))); | 376 static_cast<void*>(service_runtime))); |
| 368 if (NULL == service_runtime) { | 377 if (NULL == service_runtime) { |
| 369 error_info.SetReport( | 378 error_info.SetReport( |
| 370 ERROR_SEL_LDR_INIT, | 379 ERROR_SEL_LDR_INIT, |
| 371 "sel_ldr init failure " + main_subprocess_.description()); | 380 "sel_ldr init failure " + main_subprocess_.description()); |
| 372 ReportLoadError(error_info); | 381 ReportLoadError(error_info); |
| 373 return; | 382 return; |
| 374 } | 383 } |
| 375 | 384 |
| 376 // Now start the SelLdr instance. This must be created on the main thread. | 385 pp::CompletionCallback callback = callback_factory_.NewCallback( |
| 377 bool service_runtime_started; | 386 &Plugin::LoadNexeAndStart, scoped_wrapper.release(), service_runtime, |
| 378 StartSelLdrOnMainThread(PP_OK, service_runtime, params, | 387 crash_cb); |
| 379 &service_runtime_started); | 388 StartSelLdrOnMainThread( |
| 380 PLUGIN_PRINTF(("Plugin::LoadNaClModule (service_runtime_started=%d)\n", | 389 static_cast<int32_t>(PP_OK), service_runtime, params, callback); |
| 381 service_runtime_started)); | 390 } |
| 382 if (!service_runtime_started) { | 391 |
| 392 void Plugin::LoadNexeAndStart(int32_t pp_error, |
| 393 nacl::DescWrapper* wrapper, |
| 394 ServiceRuntime* service_runtime, |
| 395 const pp::CompletionCallback& crash_cb) { |
| 396 nacl::scoped_ptr<nacl::DescWrapper> scoped_wrapper(wrapper); |
| 397 if (pp_error != PP_OK) |
| 383 return; | 398 return; |
| 384 } | |
| 385 | 399 |
| 386 // Now actually load the nexe, which can happen on a background thread. | 400 // Now actually load the nexe, which can happen on a background thread. |
| 387 bool nexe_loaded = service_runtime->LoadNexeAndStart(wrapper, crash_cb); | 401 bool nexe_loaded = service_runtime->LoadNexeAndStart(wrapper, crash_cb); |
| 388 PLUGIN_PRINTF(("Plugin::LoadNaClModule (nexe_loaded=%d)\n", | 402 PLUGIN_PRINTF(("Plugin::LoadNaClModule (nexe_loaded=%d)\n", |
| 389 nexe_loaded)); | 403 nexe_loaded)); |
| 390 if (nexe_loaded) { | 404 if (nexe_loaded) { |
| 391 PLUGIN_PRINTF(("Plugin::LoadNaClModule (%s)\n", | 405 PLUGIN_PRINTF(("Plugin::LoadNaClModule (%s)\n", |
| 392 main_subprocess_.detailed_description().c_str())); | 406 main_subprocess_.detailed_description().c_str())); |
| 393 } | 407 } |
| 394 } | 408 } |
| (...skipping 384 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 779 nexe_downloader_.url_to_open(), | 793 nexe_downloader_.url_to_open(), |
| 780 LENGTH_IS_COMPUTABLE, | 794 LENGTH_IS_COMPUTABLE, |
| 781 nexe_bytes_read, | 795 nexe_bytes_read, |
| 782 nexe_bytes_read); | 796 nexe_bytes_read); |
| 783 | 797 |
| 784 load_start_ = NaClGetTimeOfDayMicroseconds(); | 798 load_start_ = NaClGetTimeOfDayMicroseconds(); |
| 785 nacl::scoped_ptr<nacl::DescWrapper> | 799 nacl::scoped_ptr<nacl::DescWrapper> |
| 786 wrapper(wrapper_factory()->MakeFileDesc(file_desc_ok_to_close, O_RDONLY)); | 800 wrapper(wrapper_factory()->MakeFileDesc(file_desc_ok_to_close, O_RDONLY)); |
| 787 NaClLog(4, "NexeFileDidOpen: invoking LoadNaClModule\n"); | 801 NaClLog(4, "NexeFileDidOpen: invoking LoadNaClModule\n"); |
| 788 LoadNaClModule( | 802 LoadNaClModule( |
| 789 wrapper.get(), | 803 wrapper.release(), |
| 790 true, /* enable_dyncode_syscalls */ | 804 true, /* enable_dyncode_syscalls */ |
| 791 true, /* enable_exception_handling */ | 805 true, /* enable_exception_handling */ |
| 792 false, /* enable_crash_throttling */ | 806 false, /* enable_crash_throttling */ |
| 793 callback_factory_.NewCallback(&Plugin::NexeFileDidOpenContinuation), | 807 callback_factory_.NewCallback(&Plugin::NexeFileDidOpenContinuation), |
| 794 callback_factory_.NewCallback(&Plugin::NexeDidCrash)); | 808 callback_factory_.NewCallback(&Plugin::NexeDidCrash)); |
| 795 } | 809 } |
| 796 | 810 |
| 797 void Plugin::NexeFileDidOpenContinuation(int32_t pp_error) { | 811 void Plugin::NexeFileDidOpenContinuation(int32_t pp_error) { |
| 798 ErrorInfo error_info; | 812 ErrorInfo error_info; |
| 799 bool was_successful; | 813 bool was_successful; |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 896 if (pp_error != PP_OK) { | 910 if (pp_error != PP_OK) { |
| 897 // Error should have been reported by pnacl. Just return. | 911 // Error should have been reported by pnacl. Just return. |
| 898 PLUGIN_PRINTF(("Plugin::BitcodeDidTranslate error in Pnacl\n")); | 912 PLUGIN_PRINTF(("Plugin::BitcodeDidTranslate error in Pnacl\n")); |
| 899 return; | 913 return; |
| 900 } | 914 } |
| 901 | 915 |
| 902 // Inform JavaScript that we successfully translated the bitcode to a nexe. | 916 // Inform JavaScript that we successfully translated the bitcode to a nexe. |
| 903 nacl::scoped_ptr<nacl::DescWrapper> | 917 nacl::scoped_ptr<nacl::DescWrapper> |
| 904 wrapper(pnacl_coordinator_.get()->ReleaseTranslatedFD()); | 918 wrapper(pnacl_coordinator_.get()->ReleaseTranslatedFD()); |
| 905 LoadNaClModule( | 919 LoadNaClModule( |
| 906 wrapper.get(), | 920 wrapper.release(), |
| 907 false, /* enable_dyncode_syscalls */ | 921 false, /* enable_dyncode_syscalls */ |
| 908 false, /* enable_exception_handling */ | 922 false, /* enable_exception_handling */ |
| 909 true, /* enable_crash_throttling */ | 923 true, /* enable_crash_throttling */ |
| 910 callback_factory_.NewCallback(&Plugin::BitcodeDidTranslateContinuation), | 924 callback_factory_.NewCallback(&Plugin::BitcodeDidTranslateContinuation), |
| 911 callback_factory_.NewCallback(&Plugin::NexeDidCrash)); | 925 callback_factory_.NewCallback(&Plugin::NexeDidCrash)); |
| 912 } | 926 } |
| 913 | 927 |
| 914 void Plugin::BitcodeDidTranslateContinuation(int32_t pp_error) { | 928 void Plugin::BitcodeDidTranslateContinuation(int32_t pp_error) { |
| 915 ErrorInfo error_info; | 929 ErrorInfo error_info; |
| 916 bool was_successful = LoadNaClModuleContinuationIntern(&error_info); | 930 bool was_successful = LoadNaClModuleContinuationIntern(&error_info); |
| (...skipping 598 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1515 DCHECK(pp::Module::Get()->core()->IsMainThread()); | 1529 DCHECK(pp::Module::Get()->core()->IsMainThread()); |
| 1516 DCHECK(nacl_interface_); | 1530 DCHECK(nacl_interface_); |
| 1517 exit_status_ = exit_status; | 1531 exit_status_ = exit_status; |
| 1518 nacl_interface_->SetReadOnlyProperty(pp_instance(), | 1532 nacl_interface_->SetReadOnlyProperty(pp_instance(), |
| 1519 pp::Var("exitStatus").pp_var(), | 1533 pp::Var("exitStatus").pp_var(), |
| 1520 pp::Var(exit_status_).pp_var()); | 1534 pp::Var(exit_status_).pp_var()); |
| 1521 } | 1535 } |
| 1522 | 1536 |
| 1523 | 1537 |
| 1524 } // namespace plugin | 1538 } // namespace plugin |
| OLD | NEW |