Chromium Code Reviews| Index: ppapi/native_client/src/trusted/plugin/pnacl_coordinator.cc |
| diff --git a/ppapi/native_client/src/trusted/plugin/pnacl_coordinator.cc b/ppapi/native_client/src/trusted/plugin/pnacl_coordinator.cc |
| index c8d332c33a834bb67d628a0ea25eac18e4231b3f..ca4199bd882582dfdc033728d7e7875688ac4c15 100644 |
| --- a/ppapi/native_client/src/trusted/plugin/pnacl_coordinator.cc |
| +++ b/ppapi/native_client/src/trusted/plugin/pnacl_coordinator.cc |
| @@ -9,260 +9,23 @@ |
| #include "native_client/src/include/portability_io.h" |
| #include "native_client/src/shared/platform/nacl_check.h" |
| -#include "native_client/src/shared/platform/nacl_sync_raii.h" |
| -#include "native_client/src/trusted/desc/nacl_desc_wrapper.h" |
| +#include "native_client/src/trusted/plugin/local_temp_file.h" |
| #include "native_client/src/trusted/plugin/manifest.h" |
| -#include "native_client/src/trusted/plugin/nacl_subprocess.h" |
| -#include "native_client/src/trusted/plugin/nexe_arch.h" |
| #include "native_client/src/trusted/plugin/plugin.h" |
| #include "native_client/src/trusted/plugin/plugin_error.h" |
| +#include "native_client/src/trusted/plugin/pnacl_translate_thread.h" |
| #include "native_client/src/trusted/plugin/service_runtime.h" |
| -#include "native_client/src/trusted/plugin/srpc_params.h" |
| -#include "native_client/src/trusted/plugin/utility.h" |
| #include "native_client/src/trusted/service_runtime/include/sys/stat.h" |
| #include "ppapi/c/pp_errors.h" |
| #include "ppapi/c/ppb_file_io.h" |
| #include "ppapi/cpp/file_io.h" |
| -namespace plugin { |
| - |
| -class Plugin; |
| - |
| namespace { |
| - |
| -const char kLlcUrl[] = "llc"; |
| -const char kLdUrl[] = "ld"; |
| -const char kPnaclTempDir[] = "/.pnacl"; |
| - |
| -nacl::string ExtensionUrl() { |
| - // TODO(sehr,jvoung): Find a better way to express the URL for the pnacl |
| - // extension than a constant string here. |
| - const nacl::string kPnaclExtensionOrigin = |
| - "chrome-extension://gcodniebolpnpaiggndmcmmfpldlknih/"; |
| - return kPnaclExtensionOrigin + GetSandboxISA() + "/"; |
| -} |
| - |
| -nacl::string Random32CharHexString(struct NaClDescRng* rng) { |
| - struct NaClDesc* desc = reinterpret_cast<struct NaClDesc*>(rng); |
| - const struct NaClDescVtbl* vtbl = |
| - reinterpret_cast<const struct NaClDescVtbl*>(desc->base.vtbl); |
| - |
| - nacl::string hex_string; |
| - const int32_t kTempFileNameWords = 4; |
| - for (int32_t i = 0; i < kTempFileNameWords; ++i) { |
| - int32_t num; |
| - CHECK(sizeof num == vtbl->Read(desc, |
| - reinterpret_cast<char*>(&num), |
| - sizeof num)); |
| - char frag[16]; |
| - SNPRINTF(frag, sizeof frag, "%08x", num); |
| - hex_string += nacl::string(frag); |
| - } |
| - return hex_string; |
| -} |
| - |
| -// Some constants for PnaclFileDescPair::GetFD readability. |
| -const bool kReadOnly = false; |
| -const bool kWriteable = true; |
| -} // namespace |
| - |
| -////////////////////////////////////////////////////////////////////// |
| -// Local temporary file access. |
| -////////////////////////////////////////////////////////////////////// |
| - |
| -uint32_t LocalTempFile::next_identifier = 0; |
| - |
| -LocalTempFile::LocalTempFile(Plugin* plugin, |
| - pp::FileSystem* file_system) |
| - : plugin_(plugin), |
| - file_system_(file_system) { |
| - PLUGIN_PRINTF(("LocalTempFile::LocalTempFile (plugin=%p, " |
| - "file_system=%p)\n", |
| - static_cast<void*>(plugin), static_cast<void*>(file_system))); |
| - Initialize(); |
| -} |
| - |
| -LocalTempFile::LocalTempFile(Plugin* plugin, |
| - pp::FileSystem* file_system, |
| - const nacl::string &filename) |
| - : plugin_(plugin), |
| - file_system_(file_system), |
| - filename_(nacl::string(kPnaclTempDir) + "/" + filename) { |
| - PLUGIN_PRINTF(("LocalTempFile::LocalTempFile (plugin=%p, " |
| - "file_system=%p, filename=%s)\n", |
| - static_cast<void*>(plugin), static_cast<void*>(file_system), |
| - filename.c_str())); |
| - file_ref_.reset(new pp::FileRef(*file_system_, filename_.c_str())); |
| - Initialize(); |
| -} |
| - |
| -void LocalTempFile::Initialize() { |
| - callback_factory_.Initialize(this); |
| - rng_desc_ = (struct NaClDescRng *) malloc(sizeof *rng_desc_); |
| - CHECK(rng_desc_ != NULL); |
| - CHECK(NaClDescRngCtor(rng_desc_)); |
| - file_io_trusted_ = static_cast<const PPB_FileIOTrusted*>( |
| - pp::Module::Get()->GetBrowserInterface(PPB_FILEIOTRUSTED_INTERFACE)); |
| - ++next_identifier; |
| - SNPRINTF(reinterpret_cast<char *>(identifier_), sizeof identifier_, |
| - "%"NACL_PRIu32, next_identifier); |
| -} |
| - |
| -LocalTempFile::~LocalTempFile() { |
| - PLUGIN_PRINTF(("LocalTempFile::~LocalTempFile\n")); |
| - NaClDescUnref(reinterpret_cast<NaClDesc*>(rng_desc_)); |
| -} |
| - |
| -void LocalTempFile::OpenWrite(const pp::CompletionCallback& cb) { |
| - done_callback_ = cb; |
| - // If we don't already have a filename, generate one. |
| - if (filename_ == "") { |
| - // Get a random temp file name. |
| - filename_ = |
| - nacl::string(kPnaclTempDir) + "/" + Random32CharHexString(rng_desc_); |
| - // Remember the ref used to open for writing and reading. |
| - file_ref_.reset(new pp::FileRef(*file_system_, filename_.c_str())); |
| - } |
| - PLUGIN_PRINTF(("LocalTempFile::OpenWrite: %s\n", filename_.c_str())); |
| - // Open the writeable file. |
| - write_io_.reset(new pp::FileIO(plugin_)); |
| - pp::CompletionCallback open_write_cb = |
| - callback_factory_.NewCallback(&LocalTempFile::WriteFileDidOpen); |
| - write_io_->Open(*file_ref_, |
| - PP_FILEOPENFLAG_WRITE | |
| - PP_FILEOPENFLAG_CREATE | |
| - PP_FILEOPENFLAG_EXCLUSIVE, |
| - open_write_cb); |
| -} |
| - |
| -int32_t LocalTempFile::GetFD(int32_t pp_error, |
| - const pp::Resource& resource, |
| - bool is_writable) { |
| - PLUGIN_PRINTF(("LocalTempFile::GetFD (pp_error=%"NACL_PRId32 |
| - ", is_writable=%d)\n", pp_error, is_writable)); |
| - if (pp_error != PP_OK) { |
| - PLUGIN_PRINTF(("LocalTempFile::GetFD pp_error != PP_OK\n")); |
| - return -1; |
| - } |
| - int32_t file_desc = |
| - file_io_trusted_->GetOSFileDescriptor(resource.pp_resource()); |
| -#if NACL_WINDOWS |
| - // Convert the Windows HANDLE from Pepper to a POSIX file descriptor. |
| - int32_t open_flags = ((is_writable ? _O_RDWR : _O_RDONLY) | _O_BINARY); |
| - int32_t posix_desc = _open_osfhandle(file_desc, open_flags); |
| - if (posix_desc == -1) { |
| - // Close the Windows HANDLE if it can't be converted. |
| - CloseHandle(reinterpret_cast<HANDLE>(file_desc)); |
| - PLUGIN_PRINTF(("LocalTempFile::GetFD _open_osfhandle failed.\n")); |
| - return NACL_NO_FILE_DESC; |
| - } |
| - file_desc = posix_desc; |
| -#endif |
| - int32_t file_desc_ok_to_close = DUP(file_desc); |
| - if (file_desc_ok_to_close == NACL_NO_FILE_DESC) { |
| - PLUGIN_PRINTF(("LocalTempFile::GetFD dup failed.\n")); |
| - return -1; |
| - } |
| - return file_desc_ok_to_close; |
| -} |
| - |
| -void LocalTempFile::WriteFileDidOpen(int32_t pp_error) { |
| - PLUGIN_PRINTF(("LocalTempFile::WriteFileDidOpen (pp_error=%" |
| - NACL_PRId32")\n", pp_error)); |
| - if (pp_error == PP_ERROR_FILEEXISTS) { |
| - // Filenames clashed, retry. |
| - filename_ = ""; |
| - OpenWrite(done_callback_); |
| - } |
| - // Run the client's completion callback. |
| - pp::Core* core = pp::Module::Get()->core(); |
| - if (pp_error != PP_OK) { |
| - core->CallOnMainThread(0, done_callback_, pp_error); |
| - return; |
| - } |
| - // Remember the object temporary file descriptor. |
| - int32_t fd = GetFD(pp_error, *write_io_, kWriteable); |
| - if (fd < 0) { |
| - core->CallOnMainThread(0, done_callback_, pp_error); |
| - return; |
| - } |
| - // The descriptor for a writeable file needs to have quota management. |
| - write_wrapper_.reset( |
| - plugin_->wrapper_factory()->MakeFileDescQuota(fd, O_RDWR, identifier_)); |
| - core->CallOnMainThread(0, done_callback_, PP_OK); |
| -} |
| - |
| -void LocalTempFile::OpenRead(const pp::CompletionCallback& cb) { |
| - PLUGIN_PRINTF(("LocalTempFile::OpenRead: %s\n", filename_.c_str())); |
| - done_callback_ = cb; |
| - // Open the read only file. |
| - read_io_.reset(new pp::FileIO(plugin_)); |
| - pp::CompletionCallback open_read_cb = |
| - callback_factory_.NewCallback(&LocalTempFile::ReadFileDidOpen); |
| - read_io_->Open(*file_ref_, PP_FILEOPENFLAG_READ, open_read_cb); |
| -} |
| - |
| -void LocalTempFile::ReadFileDidOpen(int32_t pp_error) { |
| - PLUGIN_PRINTF(("LocalTempFile::ReadFileDidOpen (pp_error=%" |
| - NACL_PRId32")\n", pp_error)); |
| - // Run the client's completion callback. |
| - pp::Core* core = pp::Module::Get()->core(); |
| - if (pp_error != PP_OK) { |
| - core->CallOnMainThread(0, done_callback_, pp_error); |
| - return; |
| - } |
| - // Remember the object temporary file descriptor. |
| - int32_t fd = GetFD(pp_error, *read_io_, kReadOnly); |
| - if (fd < 0) { |
| - core->CallOnMainThread(0, done_callback_, PP_ERROR_FAILED); |
| - return; |
| - } |
| - read_wrapper_.reset(plugin_->wrapper_factory()->MakeFileDesc(fd, O_RDONLY)); |
| - core->CallOnMainThread(0, done_callback_, PP_OK); |
| -} |
| - |
| -void LocalTempFile::Close(const pp::CompletionCallback& cb) { |
| - PLUGIN_PRINTF(("LocalTempFile::Close: %s\n", filename_.c_str())); |
| - // Close the open DescWrappers and FileIOs. |
| - if (write_io_.get() != NULL) { |
| - write_io_->Close(); |
| - } |
| - write_wrapper_.reset(NULL); |
| - write_io_.reset(NULL); |
| - if (read_io_.get() != NULL) { |
| - read_io_->Close(); |
| - } |
| - read_wrapper_.reset(NULL); |
| - read_io_.reset(NULL); |
| - // Run the client's completion callback. |
| - pp::Core* core = pp::Module::Get()->core(); |
| - core->CallOnMainThread(0, cb, PP_OK); |
| -} |
| - |
| -void LocalTempFile::Delete(const pp::CompletionCallback& cb) { |
| - PLUGIN_PRINTF(("LocalTempFile::Delete: %s\n", filename_.c_str())); |
| - file_ref_->Delete(cb); |
| -} |
| - |
| -void LocalTempFile::Rename(const nacl::string& new_name, |
| - const pp::CompletionCallback& cb) { |
| - // Rename the temporary file. |
| - filename_ = nacl::string(kPnaclTempDir) + "/" + new_name; |
| - PLUGIN_PRINTF(("LocalTempFile::Rename %s to %s\n", |
| - file_ref_->GetName().AsString().c_str(), |
| - filename_.c_str())); |
| - // Remember the old ref until the rename is complete. |
| - old_ref_.reset(file_ref_.release()); |
| - file_ref_.reset(new pp::FileRef(*file_system_, filename_.c_str())); |
| - old_ref_->Rename(*file_ref_, cb); |
| -} |
| - |
| -void LocalTempFile::FinishRename() { |
| - // Now we can release the old ref. |
| - old_ref_.reset(NULL); |
| +const static char kPnaclTempDir[] = "/.pnacl"; |
|
sehr (please use chromium)
2012/05/16 17:19:56
This is already in an anonymous namespace. Static
Derek Schuff
2012/05/16 17:48:09
Done.
|
| } |
| +namespace plugin { |
| ////////////////////////////////////////////////////////////////////// |
| // Pnacl-specific manifest support. |
| @@ -271,7 +34,7 @@ class ExtensionManifest : public Manifest { |
| public: |
| explicit ExtensionManifest(const pp::URLUtil_Dev* url_util) |
| : url_util_(url_util), |
| - manifest_base_url_(ExtensionUrl()) { } |
| + manifest_base_url_(PnaclUrls::GetExtensionUrl()) { } |
| virtual ~ExtensionManifest() { } |
| virtual bool GetProgramURL(nacl::string* full_url, |
| @@ -416,8 +179,8 @@ PnaclCoordinator* PnaclCoordinator::BitcodeToNative( |
| reinterpret_cast<const void*>(coordinator->manifest_.get()))); |
| // Load llc and ld. |
| std::vector<nacl::string> resource_urls; |
| - resource_urls.push_back(kLlcUrl); |
| - resource_urls.push_back(kLdUrl); |
| + resource_urls.push_back(PnaclUrls::GetLlcUrl()); |
| + resource_urls.push_back(PnaclUrls::GetLdUrl()); |
| pp::CompletionCallback resources_cb = |
| coordinator->callback_factory_.NewCallback( |
| &PnaclCoordinator::ResourcesDidLoad); |
| @@ -459,7 +222,6 @@ PnaclCoordinator::PnaclCoordinator( |
| const pp::CompletionCallback& translate_notify_callback) |
| : plugin_(plugin), |
| translate_notify_callback_(translate_notify_callback), |
| - subprocesses_should_die_(false), |
| file_system_(new pp::FileSystem(plugin, PP_FILESYSTEMTYPE_LOCALTEMPORARY)), |
| manifest_(new ExtensionManifest(plugin->url_util())), |
| pexe_url_(pexe_url), |
| @@ -468,7 +230,6 @@ PnaclCoordinator::PnaclCoordinator( |
| PLUGIN_PRINTF(("PnaclCoordinator::PnaclCoordinator (this=%p, plugin=%p)\n", |
| static_cast<void*>(this), static_cast<void*>(plugin))); |
| callback_factory_.Initialize(this); |
| - NaClXMutexCtor(&subprocess_mu_); |
| ld_manifest_.reset(new PnaclLDManifest(plugin_->manifest(), manifest_.get())); |
| } |
| @@ -481,9 +242,8 @@ PnaclCoordinator::~PnaclCoordinator() { |
| // will have been destroyed. This will result in the cancellation of |
| // translation_complete_callback_, so no notification will be delivered. |
| if (translate_thread_.get() != NULL) { |
| - SetSubprocessesShouldDie(true); |
| + translate_thread_->SetSubprocessesShouldDie(true); |
| } |
| - NaClMutexDtor(&subprocess_mu_); |
| } |
| void PnaclCoordinator::ReportNonPpapiError(const nacl::string& message) { |
| @@ -521,6 +281,7 @@ void PnaclCoordinator::ReportPpapiError(int32_t pp_error) { |
| } |
| } |
| +// Signal that Pnacl translation completed normally. |
| void PnaclCoordinator::TranslateFinished(int32_t pp_error) { |
| PLUGIN_PRINTF(("PnaclCoordinator::TranslateFinished (pp_error=%" |
| NACL_PRId32")\n", pp_error)); |
| @@ -627,15 +388,6 @@ void PnaclCoordinator::NexeFileWasDeleted(int32_t pp_error) { |
| ReportPpapiError(translate_finish_error_); |
| } |
| -void PnaclCoordinator::TranslateFailed(const nacl::string& error_string) { |
| - PLUGIN_PRINTF(("PnaclCoordinator::TranslateFailed (error_string='%s')\n", |
| - error_string.c_str())); |
| - pp::Core* core = pp::Module::Get()->core(); |
| - error_info_.SetReport(ERROR_UNKNOWN, |
| - nacl::string("PnaclCoordinator: ") + error_string); |
| - core->CallOnMainThread(0, report_translate_finished_, PP_ERROR_FAILED); |
| -} |
| - |
| void PnaclCoordinator::ResourcesDidLoad(int32_t pp_error) { |
| PLUGIN_PRINTF(("PnaclCoordinator::ResourcesDidLoad (pp_error=%" |
| NACL_PRId32")\n", pp_error)); |
| @@ -659,7 +411,8 @@ void PnaclCoordinator::FileSystemDidOpen(int32_t pp_error) { |
| ReportPpapiError(pp_error, "file system didn't open."); |
| return; |
| } |
| - dir_ref_.reset(new pp::FileRef(*file_system_, kPnaclTempDir)); |
| + dir_ref_.reset(new pp::FileRef(*file_system_, |
| + kPnaclTempDir)); |
| dir_io_.reset(new pp::FileIO(plugin_)); |
| // Attempt to create the directory. |
| pp::CompletionCallback cb = |
| @@ -677,6 +430,7 @@ void PnaclCoordinator::DirectoryWasCreated(int32_t pp_error) { |
| } |
| if (cache_identity_ != "") { |
| nexe_file_.reset(new LocalTempFile(plugin_, file_system_.get(), |
| + nacl::string(kPnaclTempDir), |
| cache_identity_)); |
| pp::CompletionCallback cb = |
| callback_factory_.NewCallback(&PnaclCoordinator::CachedFileDidOpen); |
| @@ -714,7 +468,8 @@ void PnaclCoordinator::BitcodeFileDidOpen(int32_t pp_error) { |
| } |
| pexe_wrapper_.reset(plugin_->wrapper_factory()->MakeFileDesc(fd, O_RDONLY)); |
| - obj_file_.reset(new LocalTempFile(plugin_, file_system_.get())); |
| + obj_file_.reset(new LocalTempFile(plugin_, file_system_.get(), |
| + nacl::string(kPnaclTempDir))); |
| pp::CompletionCallback cb = |
| callback_factory_.NewCallback(&PnaclCoordinator::ObjectWriteDidOpen); |
| obj_file_->OpenWrite(cb); |
| @@ -741,7 +496,8 @@ void PnaclCoordinator::ObjectReadDidOpen(int32_t pp_error) { |
| } |
| // Create the nexe file for connecting ld and sel_ldr. |
| // Start translation when done with this last step of setup! |
| - nexe_file_.reset(new LocalTempFile(plugin_, file_system_.get())); |
| + nexe_file_.reset(new LocalTempFile(plugin_, file_system_.get(), |
| + nacl::string(kPnaclTempDir))); |
| pp::CompletionCallback cb = |
| callback_factory_.NewCallback(&PnaclCoordinator::RunTranslate); |
| nexe_file_->OpenWrite(cb); |
| @@ -752,121 +508,22 @@ void PnaclCoordinator::RunTranslate(int32_t pp_error) { |
| NACL_PRId32")\n", pp_error)); |
| // Invoke llc followed by ld off the main thread. This allows use of |
| // blocking RPCs that would otherwise block the JavaScript main thread. |
| - report_translate_finished_ = |
| + pp::CompletionCallback report_translate_finished = |
| callback_factory_.NewCallback(&PnaclCoordinator::TranslateFinished); |
| - translate_thread_.reset(new NaClThread); |
| + translate_thread_.reset(new PnaclTranslateThread()); |
| if (translate_thread_ == NULL) { |
| - ReportNonPpapiError("could not allocate thread struct."); |
| + ReportNonPpapiError("could not allocate translation thread."); |
| return; |
| } |
| - const int32_t kArbitraryStackSize = 128 * 1024; |
| - if (!NaClThreadCreateJoinable(translate_thread_.get(), |
| - DoTranslateThread, |
| - this, |
| - kArbitraryStackSize)) { |
| - ReportNonPpapiError("could not create thread."); |
| - } |
| -} |
| - |
| -NaClSubprocess* PnaclCoordinator::StartSubprocess( |
| - const nacl::string& url_for_nexe, |
| - const Manifest* manifest) { |
| - PLUGIN_PRINTF(("PnaclCoordinator::StartSubprocess (url_for_nexe=%s)\n", |
| - url_for_nexe.c_str())); |
| - nacl::DescWrapper* wrapper = resources_->WrapperForUrl(url_for_nexe); |
| - nacl::scoped_ptr<NaClSubprocess> subprocess( |
| - plugin_->LoadHelperNaClModule(wrapper, manifest, &error_info_)); |
| - if (subprocess.get() == NULL) { |
| - PLUGIN_PRINTF(( |
| - "PnaclCoordinator::StartSubprocess: subprocess creation failed\n")); |
| - return NULL; |
| - } |
| - return subprocess.release(); |
| -} |
| - |
| -// TODO(sehr): the thread body should be in a class by itself with a delegate |
| -// class for interfacing with the rest of the coordinator. |
| -void WINAPI PnaclCoordinator::DoTranslateThread(void* arg) { |
| - PnaclCoordinator* coordinator = reinterpret_cast<PnaclCoordinator*>(arg); |
| - |
| - nacl::scoped_ptr<NaClSubprocess> llc_subprocess( |
| - coordinator->StartSubprocess(kLlcUrl, coordinator->manifest_.get())); |
| - if (llc_subprocess == NULL) { |
| - coordinator->TranslateFailed("Compile process could not be created."); |
| - return; |
| - } |
| - // Run LLC. |
| - SrpcParams params; |
| - nacl::DescWrapper* llc_out_file = coordinator->obj_file_->write_wrapper(); |
| - PluginReverseInterface* llc_reverse = |
| - llc_subprocess->service_runtime()->rev_interface(); |
| - llc_reverse->AddQuotaManagedFile(coordinator->obj_file_->identifier(), |
| - coordinator->obj_file_->write_file_io()); |
| - if (!llc_subprocess->InvokeSrpcMethod("RunWithDefaultCommandLine", |
| - "hh", |
| - ¶ms, |
| - coordinator->pexe_wrapper_->desc(), |
| - llc_out_file->desc())) { |
| - coordinator->TranslateFailed("compile failed."); |
| - return; |
| - } |
| - // LLC returns values that are used to determine how linking is done. |
| - int is_shared_library = (params.outs()[0]->u.ival != 0); |
| - nacl::string soname = params.outs()[1]->arrays.str; |
| - nacl::string lib_dependencies = params.outs()[2]->arrays.str; |
| - PLUGIN_PRINTF(("PnaclCoordinator: compile (coordinator=%p) succeeded" |
| - " is_shared_library=%d, soname='%s', lib_dependencies='%s')\n", |
| - arg, is_shared_library, soname.c_str(), |
| - lib_dependencies.c_str())); |
| - // Shut down the llc subprocess. |
| - llc_subprocess.reset(NULL); |
| - if (coordinator->SubprocessesShouldDie()) { |
| - coordinator->TranslateFailed("stopped by coordinator."); |
| - return; |
| - } |
| - nacl::scoped_ptr<NaClSubprocess> ld_subprocess( |
| - coordinator->StartSubprocess(kLdUrl, coordinator->ld_manifest_.get())); |
| - if (ld_subprocess == NULL) { |
| - coordinator->TranslateFailed("Link process could not be created."); |
| - return; |
| - } |
| - // Run LD. |
| - nacl::DescWrapper* ld_in_file = coordinator->obj_file_->read_wrapper(); |
| - nacl::DescWrapper* ld_out_file = coordinator->nexe_file_->write_wrapper(); |
| - PluginReverseInterface* ld_reverse = |
| - ld_subprocess->service_runtime()->rev_interface(); |
| - ld_reverse->AddQuotaManagedFile(coordinator->nexe_file_->identifier(), |
| - coordinator->nexe_file_->write_file_io()); |
| - if (!ld_subprocess->InvokeSrpcMethod("RunWithDefaultCommandLine", |
| - "hhiCC", |
| - ¶ms, |
| - ld_in_file->desc(), |
| - ld_out_file->desc(), |
| - is_shared_library, |
| - soname.c_str(), |
| - lib_dependencies.c_str())) { |
| - coordinator->TranslateFailed("link failed."); |
| - return; |
| - } |
| - PLUGIN_PRINTF(("PnaclCoordinator: link (coordinator=%p) succeeded\n", arg)); |
| - // Shut down the ld subprocess. |
| - ld_subprocess.reset(NULL); |
| - if (coordinator->SubprocessesShouldDie()) { |
| - coordinator->TranslateFailed("stopped by coordinator."); |
| - return; |
| - } |
| - pp::Core* core = pp::Module::Get()->core(); |
| - core->CallOnMainThread(0, coordinator->report_translate_finished_, PP_OK); |
| -} |
| - |
| -bool PnaclCoordinator::SubprocessesShouldDie() { |
| - nacl::MutexLocker ml(&subprocess_mu_); |
| - return subprocesses_should_die_; |
| -} |
| - |
| -void PnaclCoordinator::SetSubprocessesShouldDie(bool subprocesses_should_die) { |
| - nacl::MutexLocker ml(&subprocess_mu_); |
| - subprocesses_should_die_ = subprocesses_should_die; |
| + translate_thread_->RunTranslate(report_translate_finished, |
| + manifest_.get(), |
| + ld_manifest_.get(), |
| + obj_file_.get(), |
| + nexe_file_.get(), |
| + pexe_wrapper_.get(), |
| + &error_info_, |
| + resources_.get(), |
| + plugin_); |
| } |
| } // namespace plugin |