Index: ppapi/native_client/src/trusted/plugin/pnacl_translate_thread.h |
diff --git a/ppapi/native_client/src/trusted/plugin/pnacl_translate_thread.h b/ppapi/native_client/src/trusted/plugin/pnacl_translate_thread.h |
index 76621e5ec5a2f80d8fd388a17316ef310606411d..8ebb216f0e599e3f4daa5b96b438646ccf43f50b 100644 |
--- a/ppapi/native_client/src/trusted/plugin/pnacl_translate_thread.h |
+++ b/ppapi/native_client/src/trusted/plugin/pnacl_translate_thread.h |
@@ -48,16 +48,18 @@ class PnaclTranslateThread { |
PnaclResources* resources, |
Plugin* plugin); |
- // Signal the translate thread and subprocesses that they should stop. |
- void SetSubprocessesShouldDie(); |
+ // 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 |
+ // exit, which will cause any pending SRPCs to error. Because this is called |
+ // on the main thread, the translation thread must not use the subprocess |
+ // objects without the lock, other than InvokeSrpcMethod, which does not |
+ // race with service runtime shutdown. |
+ void AbortSubprocesses(); |
// Send bitcode bytes to the translator. Called from the main thread. |
void PutBytes(std::vector<char>* data, int count); |
private: |
- // Returns true if the translate thread and subprocesses should stop. |
- bool SubprocessesShouldDie(); |
- |
// Starts an individual llc or ld subprocess used for translation. |
NaClSubprocess* StartSubprocess(const nacl::string& url, |
const Manifest* manifest, |
@@ -74,28 +76,19 @@ class PnaclTranslateThread { |
const nacl::string& soname, |
const nacl::string& lib_dependencies); |
- // Register a reverse service interface which will be shutdown if the |
- // plugin is shutdown. The reverse service pointer must be available on the |
- // main thread because the translation thread could be blocked on SRPC |
- // waiting for the translator, which could be waiting on a reverse |
- // service call. |
- // (see also the comments in Plugin::~Plugin about ShutdownSubprocesses, |
- // but that only handles the main nexe and not the translator nexes.) |
- void RegisterReverseInterface(PluginReverseInterface *iface); |
// Callback to run when tasks are completed or an error has occurred. |
pp::CompletionCallback report_translate_finished_; |
- // True if the translation thread and related subprocesses should exit. |
- bool subprocesses_should_die_; |
- // Used to guard and publish subprocesses_should_die_. |
- struct NaClMutex subprocess_mu_; |
nacl::scoped_ptr<NaClThread> translate_thread_; |
- // Reverse interface to shutdown on SetSubprocessesShouldDie |
- PluginReverseInterface* current_rev_interface_; |
- |
- |
+ // Used to guard llc_subprocess and ld_subprocess |
+ struct NaClMutex subprocess_mu_; |
+ nacl::scoped_ptr<NaClSubprocess> llc_subprocess_; |
+ nacl::scoped_ptr<NaClSubprocess> ld_subprocess_; |
+ // Used to ensure the subprocesses don't get shutdown more than once. |
+ bool llc_subprocess_active_; |
+ bool ld_subprocess_active_; |
// Condition variable to synchronize communication with the SRPC thread. |
// SRPC thread waits on this condvar if data_buffers_ is empty (meaning |