Index: components/nacl/renderer/plugin/pnacl_translate_thread.h |
diff --git a/components/nacl/renderer/plugin/pnacl_translate_thread.h b/components/nacl/renderer/plugin/pnacl_translate_thread.h |
index 3c6b622a0ce25376cd1e4c267e5aa288d9ca5338..183766947c1d52bee90722eb9559cd6d914aae3b 100644 |
--- a/components/nacl/renderer/plugin/pnacl_translate_thread.h |
+++ b/components/nacl/renderer/plugin/pnacl_translate_thread.h |
@@ -9,7 +9,6 @@ |
#include <vector> |
#include "components/nacl/renderer/plugin/plugin_error.h" |
-#include "components/nacl/renderer/plugin/service_runtime.h" |
#include "native_client/src/include/nacl_macros.h" |
#include "native_client/src/include/nacl_scoped_ptr.h" |
#include "native_client/src/shared/platform/nacl_sync_checked.h" |
@@ -26,9 +25,7 @@ class DescWrapper; |
namespace plugin { |
class NaClSubprocess; |
-class Plugin; |
class PnaclCoordinator; |
-class PnaclResources; |
class TempFile; |
class PnaclTranslateThread { |
@@ -36,19 +33,32 @@ class PnaclTranslateThread { |
PnaclTranslateThread(); |
~PnaclTranslateThread(); |
- // Start the translation process. It will continue to run and consume data |
- // as it is passed in with PutBytes. |
- void RunTranslate(const pp::CompletionCallback& finish_callback, |
- const std::vector<TempFile*>* obj_files, |
- int num_threads, |
- TempFile* nexe_file, |
- nacl::DescWrapper* invalid_desc_wrapper, |
- ErrorInfo* error_info, |
- PnaclResources* resources, |
- PP_PNaClOptions* pnacl_options, |
- const std::string& architecture_attributes, |
- PnaclCoordinator* coordinator, |
- Plugin* plugin); |
+ // Set up the state for RunCompile and RunLink. When an error is |
+ // encountered, or RunLink is complete the finish_callback is run |
+ // to notify the main thread. |
+ void SetupState(const pp::CompletionCallback& finish_callback, |
+ NaClSubprocess* compiler_subprocess, |
+ NaClSubprocess* ld_subprocess, |
+ const std::vector<TempFile*>* obj_files, |
+ int num_threads, |
+ TempFile* nexe_file, |
+ nacl::DescWrapper* invalid_desc_wrapper, |
+ ErrorInfo* error_info, |
+ PP_PNaClOptions* pnacl_options, |
+ const std::string& architecture_attributes, |
+ PnaclCoordinator* coordinator); |
+ |
+ // Create a compile thread and run/command the compiler_subprocess. |
+ // It will continue to run and consume data as it is passed in with PutBytes. |
+ // On success, runs compile_finished_callback. |
+ // On error, runs finish_callback. |
+ // The compiler_subprocess must already be loaded. |
+ void RunCompile(const pp::CompletionCallback& compile_finished_callback); |
+ |
+ // Create a link thread and run/command the ld_subprocess. |
+ // On completion (success or error), runs finish_callback. |
+ // The ld_subprocess must already be loaded. |
+ void RunLink(); |
// Kill the llc and/or ld subprocesses. This happens by closing the command |
// channel on the plugin side, which causes the trusted code in the nexe to |
@@ -67,38 +77,50 @@ class PnaclTranslateThread { |
int64_t GetCompileTime() const { return compile_time_; } |
- // Returns true if RunTranslate() has been called, false otherwise. |
- bool started() const { return plugin_ != NULL; } |
+ // Returns true if the translation process is initiated via SetupState. |
+ bool started() const { return coordinator_ != NULL; } |
private: |
- // Helper thread entry point for translation. Takes a pointer to |
- // PnaclTranslateThread and calls DoTranslate(). |
- static void WINAPI DoTranslateThread(void* arg); |
- // Runs the streaming translation. Called from the helper thread. |
- void DoTranslate() ; |
+ // Helper thread entry point for compilation. Takes a pointer to |
+ // PnaclTranslateThread and calls DoCompile(). |
+ static void WINAPI DoCompileThread(void* arg); |
+ // Runs the streaming compilation. Called from the helper thread. |
+ void DoCompile(); |
+ |
+ // Similar to DoCompile*, but for linking. |
+ static void WINAPI DoLinkThread(void* arg); |
+ void DoLink(); |
+ |
// Signal that Pnacl translation failed, from the translation thread only. |
void TranslateFailed(PP_NaClError err_code, |
const std::string& error_string); |
- // Run the LD subprocess, returning true on success. |
- // On failure, it returns false and runs the callback. |
- bool RunLdSubprocess(); |
+ // Callback to run when compile is completed and linking can start. |
+ pp::CompletionCallback compile_finished_callback_; |
// Callback to run when tasks are completed or an error has occurred. |
pp::CompletionCallback report_translate_finished_; |
nacl::scoped_ptr<NaClThread> translate_thread_; |
- // Used to guard compiler_subprocess and ld_subprocess |
+ // Used to guard compiler_subprocess, ld_subprocess, |
+ // compiler_subprocess_active_, and ld_subprocess_active_ |
+ // (touched by the main thread and the translate thread). |
struct NaClMutex subprocess_mu_; |
- nacl::scoped_ptr<NaClSubprocess> compiler_subprocess_; |
- nacl::scoped_ptr<NaClSubprocess> ld_subprocess_; |
- // Used to ensure the subprocesses don't get shutdown more than once. |
+ // The compiler_subprocess and ld_subprocess memory is owned by the |
+ // coordinator so we do not delete them. However, the main thread delegates |
+ // shutdown to this thread, since this thread may still be accessing the |
+ // subprocesses. The *_subprocess_active flags indicate which subprocesses |
+ // are active to ensure the subprocesses don't get shutdown more than once. |
+ // The subprocess_mu_ must be held when shutting down the subprocesses |
+ // or checking if it's already shut down (via the active flags). |
+ // There are some accesses to the subprocesses without locks held |
+ // (invoking SRPC methods client). |
+ NaClSubprocess* compiler_subprocess_; |
+ NaClSubprocess* ld_subprocess_; |
bool compiler_subprocess_active_; |
bool ld_subprocess_active_; |
- bool subprocesses_aborted_; |
- |
// Condition variable to synchronize communication with the SRPC thread. |
// SRPC thread waits on this condvar if data_buffers_ is empty (meaning |
// there is no bitcode to send to the translator), and the main thread |
@@ -121,11 +143,9 @@ class PnaclTranslateThread { |
TempFile* nexe_file_; |
nacl::DescWrapper* invalid_desc_wrapper_; |
ErrorInfo* coordinator_error_info_; |
- PnaclResources* resources_; |
PP_PNaClOptions* pnacl_options_; |
std::string architecture_attributes_; |
PnaclCoordinator* coordinator_; |
- Plugin* plugin_; |
private: |
NACL_DISALLOW_COPY_AND_ASSIGN(PnaclTranslateThread); |
}; |