Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(620)

Unified Diff: ppapi/native_client/src/trusted/plugin/pnacl_coordinator.h

Issue 8786005: Move command line processing out of coordinator (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 9 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: ppapi/native_client/src/trusted/plugin/pnacl_coordinator.h
===================================================================
--- ppapi/native_client/src/trusted/plugin/pnacl_coordinator.h (revision 113812)
+++ ppapi/native_client/src/trusted/plugin/pnacl_coordinator.h (working copy)
@@ -14,56 +14,132 @@
#include "native_client/src/shared/platform/nacl_sync_checked.h"
#include "native_client/src/shared/platform/nacl_threads.h"
#include "native_client/src/shared/srpc/nacl_srpc.h"
+#include "native_client/src/trusted/desc/nacl_desc_rng.h"
#include "native_client/src/trusted/desc/nacl_desc_wrapper.h"
#include "native_client/src/trusted/plugin/delayed_callback.h"
#include "native_client/src/trusted/plugin/nacl_subprocess.h"
#include "native_client/src/trusted/plugin/plugin_error.h"
#include "native_client/src/trusted/plugin/pnacl_resources.h"
+#include "ppapi/c/pp_file_info.h"
#include "ppapi/cpp/completion_callback.h"
+#include "ppapi/cpp/file_io.h"
+#include "ppapi/cpp/file_ref.h"
+#include "ppapi/cpp/file_system.h"
struct NaClMutex;
+struct PPB_FileIOTrusted;
namespace plugin {
class Plugin;
class PnaclCoordinator;
+// Represents a file used as a temporary between stages in translation.
robertm 2011/12/12 16:23:29 Maybe add a more concrete use example so that the
sehr (please use chromium) 2011/12/13 00:12:45 I hope what I have added is sufficient.
+class PnaclFileDescPair {
+ public:
+ PnaclFileDescPair(pp::FileSystem* file_system, PnaclCoordinator* coordinator);
+ ~PnaclFileDescPair();
+ // Opens a pair of file IO objects referring to a randomly named file in
+ // file_system_. One IO is for writing the file and another for reading it.
+ void Open(const pp::CompletionCallback& cb);
+ // Gets the POSIX file descriptor for a resource.
+ int32_t GetFD(int32_t pp_error,
+ const pp::Resource& resource,
+ const nacl::string& component);
+ // Called when the writable file IO was opened.
+ void WriteFileDidOpen(int32_t pp_error);
+ // Called when the readable file IO was opened.
+ void ReadFileDidOpen(int32_t pp_error);
+
+ // Accessors.
+ nacl::DescWrapper* write_wrapper() { return write_wrapper_.get(); }
+ nacl::DescWrapper* read_wrapper() { return read_wrapper_.get(); }
+
+ private:
+ pp::FileSystem* file_system_;
+ PnaclCoordinator* coordinator_;
+ const PPB_FileIOTrusted* file_io_trusted_;
+ pp::CompletionCallbackFactory<PnaclFileDescPair> callback_factory_;
+ nacl::string filename_;
+ nacl::scoped_ptr<pp::FileRef> write_ref_;
+ nacl::scoped_ptr<pp::FileIO> write_io_;
+ nacl::scoped_ptr<nacl::DescWrapper> write_wrapper_;
+ nacl::scoped_ptr<pp::FileRef> read_ref_;
+ nacl::scoped_ptr<pp::FileIO> read_io_;
+ nacl::scoped_ptr<nacl::DescWrapper> read_wrapper_;
+ pp::CompletionCallback done_callback_;
+ // Random number generator used to create filenames.
+ struct NaClDescRng rng_desc_;
+};
+
+// A reference counting class that can be used for one background thread.
+// The default NonThreadSafeRefCount asserts that it is only used on the
+// main thread. Needed for CompletionCallbackFactory in PnaclTranslationUnit.
+class PnaclNonThreadSafeRefCount {
robertm 2011/12/12 16:23:29 the point of this class seems dubious as it does
sehr (please use chromium) 2011/12/13 00:12:45 After fusing the two classes, it needed to be sync
+ public:
+ PnaclNonThreadSafeRefCount() : ref_(0) { }
+ int32_t AddRef() { return ++ref_; }
+ int32_t Release() { return --ref_; }
+
+ private:
+ int32_t ref_;
+};
+
+// Represents an individual bitcode file during a translation.
struct PnaclTranslationUnit {
robertm 2011/12/12 16:23:29 why a struct?
sehr (please use chromium) 2011/12/13 00:12:45 I eliminated this struct by merging it into PnaclC
- PnaclTranslationUnit(PnaclCoordinator* coord)
+ public:
+ PnaclTranslationUnit(PnaclCoordinator* coord, const nacl::string& url)
: coordinator(coord),
- obj_len(-1),
- is_shared_library(false),
- soname(""),
- lib_dependencies("") {
+ pexe_url(url) {
+ NaClXMutexCtor(&mu);
+ NaClXCondVarCtor(&cv);
+ callback_factory.Initialize(this);
}
- // Punch hole in abstraction.
+
+ // Invoked on the main thread on behalf of the lookup service to start
+ // loading a particular URL.
+ void LoadOneFile(int32_t pp_error,
+ const nacl::string& url,
+ nacl::DescWrapper** wrapper,
+ pp::CompletionCallback& done_cb);
+ // Invoked by the renderer when the file was loaded.
+ void DidLoadFile(int32_t pp_error,
+ const nacl::string& full_url,
+ nacl::DescWrapper** wrapper,
+ pp::CompletionCallback& done_cb);
+ // Signals the waiting lookup service to resume.
+ void ResumeLookup(int32_t pp_error, PnaclTranslationUnit* trans);
+ // Performs the lookup of the descriptor for url.
+ nacl::DescWrapper* LookupDesc(const nacl::string& url);
+
+ // To refer back to shared resources.
PnaclCoordinator* coordinator;
-
+ // The URL for the pexe file.
+ nacl::string pexe_url;
+ // Factory for callbacks used in file lookups.
+ pp::CompletionCallbackFactory<PnaclTranslationUnit,
+ PnaclNonThreadSafeRefCount> callback_factory;
// Borrowed reference which must outlive the thread.
nacl::scoped_ptr<nacl::DescWrapper> pexe_wrapper;
-
- // Object file produced by translator and consumed by the linker.
- nacl::scoped_ptr<nacl::DescWrapper> obj_wrapper;
- int32_t obj_len;
-
- // Information extracted from the pexe that is needed by the linker.
- bool is_shared_library;
- nacl::string soname;
- nacl::string lib_dependencies;
-
- // The translated user nexe file.
- nacl::scoped_ptr<nacl::DescWrapper> nexe_wrapper;
-
+ // Object file, produced by the translator and consumed by the linker.
+ nacl::scoped_ptr<PnaclFileDescPair> obj_file;
+ // Translated nexe file, produced by the linker and consumed by sel_ldr.
+ nacl::scoped_ptr<PnaclFileDescPair> nexe_file;
// Callbacks to run when tasks or completed or an error has occurred.
pp::CompletionCallback translate_done_cb;
- pp::CompletionCallback link_done_cb;
+ // Support for file lookups.
+ struct NaClMutex mu;
robertm 2011/12/12 16:23:29 these should be private if possible
sehr (please use chromium) 2011/12/13 00:12:45 Done.
+ struct NaClCondVar cv;
+ bool lookup_is_complete;
+
ErrorInfo error_info;
};
-typedef std::pair<nacl::string, pp::CompletionCallback> url_callback_pair;
+// typedef std::pair<nacl::string, pp::CompletionCallback> url_callback_pair;
+typedef std::vector<nacl::string> string_vector;
// A class that handles PNaCl client-side translation.
// Usage:
robertm 2011/12/12 16:23:29 since we do not have a design the class comment wo
sehr (please use chromium) 2011/12/13 00:12:45 Done.
@@ -80,7 +156,8 @@
translate_notify_callback_(pp::BlockUntilComplete()),
llc_subprocess_(NULL),
ld_subprocess_(NULL),
- subprocesses_should_die_(false) {
+ subprocesses_should_die_(false),
+ file_system_is_initialized_(false) {
NaClXMutexCtor(&subprocess_mu_);
}
@@ -102,41 +179,36 @@
const nacl::string& url,
const nacl::string& component);
- // Run when faced with a PPAPI error condition. It brings control back to the
- // plugin by invoking the |translate_notify_callback_|.
- void PnaclPpapiError(int32_t pp_error);
// Run |translate_notify_callback_| with an error condition that is not
// PPAPI specific.
- void PnaclNonPpapiError();
- // Wrapper for Plugin ReportLoadAbort.
- void ReportLoadAbort();
- // Wrapper for Plugin ReportLoadError.
- void ReportLoadError(const ErrorInfo& error);
+ void ReportNonPpapiError(const nacl::string& message);
+ // Run when faced with a PPAPI error condition. Bring control back to the
+ // plugin by invoking the |translate_notify_callback_|.
+ void ReportPpapiError(int32_t pp_error, const nacl::string& message);
+ void ReportPpapiError(int32_t pp_error, const ErrorInfo& error);
// Accessors for use by helper threads.
robertm 2011/12/12 16:23:29 can these be avoided? many seem to be used during
sehr (please use chromium) 2011/12/13 00:12:45 Fusing PnaclTranslationUnit into PnaclCoordinator
nacl::string resource_base_url() const { return resource_base_url_; }
+ PnaclResources* resources() const { return resources_.get(); }
Plugin* plugin() const { return plugin_; }
- nacl::string llc_url() const { return llc_url_; }
NaClSubprocess* llc_subprocess() const { return llc_subprocess_; }
- bool StartLlcSubProcess();
- nacl::string ld_url() const { return ld_url_; }
NaClSubprocess* ld_subprocess() const { return ld_subprocess_; }
- bool StartLdSubProcess();
+ NaClSubprocess* StartSubProcess(const nacl::string& url);
bool SubprocessesShouldDie();
void SetSubprocessesShouldDie(bool subprocesses_should_die);
- PnaclResources* resources() const { return resources_.get(); }
protected:
robertm 2011/12/12 16:23:29 protected vs private is very subtle, please add c
sehr (please use chromium) 2011/12/13 00:12:45 There are no child classes, so I moved all this to
+ // Callback for when various files, etc. have been downloaded.
+ void ResourcesDidLoad(int32_t pp_error);
- // Callbacks for when various files, etc. have been downloaded.
- void ResourcesDidLoad(int32_t pp_error,
- const nacl::string& url,
- PnaclTranslationUnit* translation_unit);
+ // Callbacks for temporary file related stages.
+ void FileSystemDidOpen(int32_t pp_error);
+ void ObjectPairDidOpen(int32_t pp_error, PnaclTranslationUnit* translation);
+ void NexePairDidOpen(int32_t pp_error, PnaclTranslationUnit* translation);
// Callbacks for compute-based translation steps.
- void RunTranslate(int32_t pp_error,
- const nacl::string& url,
- PnaclTranslationUnit* translation_unit);
+ void DoStartTranslation(int32_t pp_error, PnaclTranslationUnit* translation);
+ void RunTranslate(int32_t pp_error, PnaclTranslationUnit* translation_unit);
void RunLink(int32_t pp_error, PnaclTranslationUnit* translation_unit);
// Pnacl translation completed normally.
@@ -151,8 +223,6 @@
// URLs used to lookup downloaded resources.
nacl::string resource_base_url_;
- nacl::string llc_url_;
- nacl::string ld_url_;
// Helper subprocesses loaded by the plugin (deleted by the plugin).
robertm 2011/12/12 16:23:29 please comment all variables and add any informati
sehr (please use chromium) 2011/12/13 00:12:45 Done.
// We may want to do cleanup ourselves when we are in the
@@ -171,8 +241,9 @@
// it easier to add steps later (the mechanism could look like PostMessage?).
nacl::scoped_ptr<PnaclTranslationUnit> translation_unit_;
nacl::scoped_ptr<NaClThread> translate_thread_;
- nacl::scoped_ptr<NaClThread> link_thread_;
-
+ // Translation creates local temporary files.
+ nacl::scoped_ptr<pp::FileSystem> file_system_;
+ bool file_system_is_initialized_;
// An auxiliary class that manages downloaded resources.
nacl::scoped_ptr<PnaclResources> resources_;
};

Powered by Google App Engine
This is Rietveld 408576698