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 #ifndef NATIVE_CLIENT_SRC_TRUSTED_PLUGIN_PNACL_COORDINATOR_H_ | 5 #ifndef NATIVE_CLIENT_SRC_TRUSTED_PLUGIN_PNACL_COORDINATOR_H_ |
6 #define NATIVE_CLIENT_SRC_TRUSTED_PLUGIN_PNACL_COORDINATOR_H_ | 6 #define NATIVE_CLIENT_SRC_TRUSTED_PLUGIN_PNACL_COORDINATOR_H_ |
7 | 7 |
8 #include <set> | 8 #include <set> |
9 #include <map> | 9 #include <map> |
10 #include <vector> | 10 #include <vector> |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
55 // (4) Load the nexe from "fd". | 55 // (4) Load the nexe from "fd". |
56 // (5) delete coord. | 56 // (5) delete coord. |
57 // | 57 // |
58 // Translation proceeds in two steps: | 58 // Translation proceeds in two steps: |
59 // (1) llc translates the bitcode in pexe_url_ to an object in obj_file_. | 59 // (1) llc translates the bitcode in pexe_url_ to an object in obj_file_. |
60 // (2) ld links the object code in obj_file_ and produces a nexe in nexe_file_. | 60 // (2) ld links the object code in obj_file_ and produces a nexe in nexe_file_. |
61 // | 61 // |
62 // The coordinator proceeds through several states. They are | 62 // The coordinator proceeds through several states. They are |
63 // LOAD_TRANSLATOR_BINARIES | 63 // LOAD_TRANSLATOR_BINARIES |
64 // Complete when ResourcesDidLoad is invoked. | 64 // Complete when ResourcesDidLoad is invoked. |
65 // OPEN_LOCAL_FILE_SYSTEM | 65 // |
66 // Complete when FileSystemDidOpen is invoked. | 66 // If cache is enabled: |
67 // CREATED_PNACL_TEMP_DIRECTORY | 67 // OPEN_LOCAL_FILE_SYSTEM |
68 // Complete when DirectoryWasCreated is invoked. | 68 // Complete when FileSystemDidOpen is invoked. |
69 // CACHED_FILE_OPEN | 69 // CREATED_PNACL_TEMP_DIRECTORY |
70 // Complete with success if cached version is available and jump to end. | 70 // Complete when DirectoryWasCreated is invoked. |
71 // Otherwise, proceed with usual pipeline of translation. | 71 // CACHED_FILE_OPEN |
72 // OPEN_TMP_WRITE_FOR_LLC_TO_LD_COMMUNICATION | 72 // Complete with success if cached version is available and jump to end. |
73 // Complete when ObjectWriteDidOpen is invoked. | 73 // Otherwise, proceed with usual pipeline of translation. |
74 // OPEN_TMP_READ_FOR_LLC_TO_LD_COMMUNICATION | 74 // |
75 // Complete when ObjectReadDidOpen is invoked. | 75 // OPEN_TMP_FOR_LLC_TO_LD_COMMUNICATION |
| 76 // Complete when ObjectFileDidOpen is invoked. |
76 // OPEN_TMP_FOR_LD_WRITING | 77 // OPEN_TMP_FOR_LD_WRITING |
77 // Complete when NexeWriteDidOpen is invoked. | 78 // Complete when NexeWriteDidOpen is invoked. |
78 // PREPARE_PEXE_FOR_STREAMING | 79 // PREPARE_PEXE_FOR_STREAMING |
79 // Complete when RunTranslate is invoked. | 80 // Complete when RunTranslate is invoked. |
80 // START_LD_AND_LLC_SUBPROCESS_AND_INITIATE_TRANSLATION | 81 // START_LD_AND_LLC_SUBPROCESS_AND_INITIATE_TRANSLATION |
81 // Complete when RunTranslate returns. | 82 // Complete when RunTranslate returns. |
82 // TRANSLATION_COMPLETE | 83 // TRANSLATION_COMPLETE |
83 // Complete when TranslateFinished is invoked. | 84 // Complete when TranslateFinished is invoked. |
84 // CLOSE_OBJECT_FILE | 85 // |
85 // Complete when ObjectFileWasClosed is invoked. | 86 // If cache is enabled: |
86 // DELETE_OBJECT_FILE | 87 // OPEN_CACHE_FOR_WRITE |
87 // Complete when ObjectFileWasDeleted is invoked. | 88 // Complete when CachedNexeOpenedForWrite is invoked |
88 // CLOSE_NEXE_FILE | 89 // COPY_NEXE_TO_CACHE |
89 // Complete when NexeFileWasClosed is invoked. | 90 // Complete when NexeWasCopiedToCache is invoked. |
90 // RENAME_NEXE_FILE | 91 // RENAME_CACHE_FILE |
91 // Complete when NexeFileWasRenamed is invoked. | 92 // Complete when NexeFileWasRenamed is invoked. |
| 93 // |
92 // OPEN_NEXE_FOR_SEL_LDR | 94 // OPEN_NEXE_FOR_SEL_LDR |
93 // Complete when NexeReadDidOpen is invoked. | 95 // Complete when NexeReadDidOpen is invoked. |
94 class PnaclCoordinator: public CallbackSource<FileStreamData> { | 96 class PnaclCoordinator: public CallbackSource<FileStreamData> { |
95 public: | 97 public: |
96 virtual ~PnaclCoordinator(); | 98 virtual ~PnaclCoordinator(); |
97 | 99 |
98 // The factory method for translations. | 100 // The factory method for translations. |
99 static PnaclCoordinator* BitcodeToNative( | 101 static PnaclCoordinator* BitcodeToNative( |
100 Plugin* plugin, | 102 Plugin* plugin, |
101 const nacl::string& pexe_url, | 103 const nacl::string& pexe_url, |
102 const nacl::string& cache_identity, | 104 const nacl::string& cache_identity, |
103 const pp::CompletionCallback& translate_notify_callback); | 105 const pp::CompletionCallback& translate_notify_callback); |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
148 // Invoked after we are sure the PNaCl temporary directory exists. | 150 // Invoked after we are sure the PNaCl temporary directory exists. |
149 void DirectoryWasCreated(int32_t pp_error); | 151 void DirectoryWasCreated(int32_t pp_error); |
150 // Invoked after we have checked the PNaCl cache for a translated version. | 152 // Invoked after we have checked the PNaCl cache for a translated version. |
151 void CachedFileDidOpen(int32_t pp_error); | 153 void CachedFileDidOpen(int32_t pp_error); |
152 // Invoked when a pexe data chunk arrives (when using streaming translation) | 154 // Invoked when a pexe data chunk arrives (when using streaming translation) |
153 void BitcodeStreamGotData(int32_t pp_error, FileStreamData data); | 155 void BitcodeStreamGotData(int32_t pp_error, FileStreamData data); |
154 // Invoked when the pexe download finishes (using streaming translation) | 156 // Invoked when the pexe download finishes (using streaming translation) |
155 void BitcodeStreamDidFinish(int32_t pp_error); | 157 void BitcodeStreamDidFinish(int32_t pp_error); |
156 // Invoked when the write descriptor for obj_file_ is created. | 158 // Invoked when the write descriptor for obj_file_ is created. |
157 void ObjectFileDidOpen(int32_t pp_error); | 159 void ObjectFileDidOpen(int32_t pp_error); |
158 // Invoked when the descriptors for nexe_file_ have been closed. | |
159 void NexeFileWasClosed(int32_t pp_error); | |
160 // Invoked when the nexe_file_ temporary has been renamed to the nexe name. | |
161 void NexeFileWasRenamed(int32_t pp_error); | |
162 // Invoked when the read descriptor for nexe_file_ is created. | |
163 void NexeReadDidOpen(int32_t pp_error); | |
164 // Invoked if there was an error and we've cleaned up the nexe_file_ temp. | |
165 void NexeFileWasDeleted(int32_t pp_error); | |
166 | |
167 // Once llc and ld nexes have been loaded and the two temporary files have | 160 // Once llc and ld nexes have been loaded and the two temporary files have |
168 // been created, this starts the translation. Translation starts two | 161 // been created, this starts the translation. Translation starts two |
169 // subprocesses, one for llc and one for ld. | 162 // subprocesses, one for llc and one for ld. |
170 void RunTranslate(int32_t pp_error); | 163 void RunTranslate(int32_t pp_error); |
171 | 164 |
| 165 // Invoked when translation is finished. |
172 void TranslateFinished(int32_t pp_error); | 166 void TranslateFinished(int32_t pp_error); |
| 167 |
| 168 // If the cache is enabled, open a cache file for write, then copy |
| 169 // the nexe data from temp_nexe_file_ to> cached_nexe_file_. |
| 170 // Once the copy is done, we commit it to the cache by renaming the |
| 171 // cache file to the final name. |
| 172 void CachedNexeOpenedForWrite(int32_t pp_error); |
| 173 void DidCopyNexeToCachePartial(int32_t pp_error, int32_t num_read_prev, |
| 174 int64_t cur_offset); |
| 175 void NexeWasCopiedToCache(int32_t pp_error); |
| 176 // Invoked when the nexe_file_ temporary has been renamed to the nexe name. |
| 177 void NexeFileWasRenamed(int32_t pp_error); |
| 178 // Invoked when the read descriptor for nexe_file_ is created. |
| 179 void NexeReadDidOpen(int32_t pp_error); |
| 180 |
173 // Keeps track of the pp_error upon entry to TranslateFinished, | 181 // Keeps track of the pp_error upon entry to TranslateFinished, |
174 // for inspection after cleanup. | 182 // for inspection after cleanup. |
175 int32_t translate_finish_error_; | 183 int32_t translate_finish_error_; |
176 | 184 |
177 // The plugin owning the nexe for which we are doing translation. | 185 // The plugin owning the nexe for which we are doing translation. |
178 Plugin* plugin_; | 186 Plugin* plugin_; |
179 | 187 |
180 pp::CompletionCallback translate_notify_callback_; | 188 pp::CompletionCallback translate_notify_callback_; |
181 // Threadsafety is required to support file lookups. | 189 // Threadsafety is required to support file lookups. |
182 pp::CompletionCallbackFactory<PnaclCoordinator, | 190 pp::CompletionCallbackFactory<PnaclCoordinator, |
(...skipping 19 matching lines...) Expand all Loading... |
202 | 210 |
203 // State used for querying the temporary directory. | 211 // State used for querying the temporary directory. |
204 nacl::scoped_ptr<pp::FileRef> dir_ref_; | 212 nacl::scoped_ptr<pp::FileRef> dir_ref_; |
205 | 213 |
206 // The URL for the pexe file. | 214 // The URL for the pexe file. |
207 nacl::string pexe_url_; | 215 nacl::string pexe_url_; |
208 // Optional cache identity for translation caching. | 216 // Optional cache identity for translation caching. |
209 nacl::string cache_identity_; | 217 nacl::string cache_identity_; |
210 // Object file, produced by the translator and consumed by the linker. | 218 // Object file, produced by the translator and consumed by the linker. |
211 nacl::scoped_ptr<TempFile> obj_file_; | 219 nacl::scoped_ptr<TempFile> obj_file_; |
212 // Translated nexe file, produced by the linker and consumed by sel_ldr. | 220 // Translated nexe file, produced by the linker. |
213 nacl::scoped_ptr<LocalTempFile> nexe_file_; | 221 nacl::scoped_ptr<TempFile> temp_nexe_file_; |
| 222 // Cached nexe file, consumed by sel_ldr. This will be NULL if we do |
| 223 // not have a writeable cache file. That is currently the case when |
| 224 // off_the_record_ is true. |
| 225 nacl::scoped_ptr<LocalTempFile> cached_nexe_file_; |
214 | 226 |
215 // Downloader for streaming translation | 227 // Downloader for streaming translation |
216 nacl::scoped_ptr<FileDownloader> streaming_downloader_; | 228 nacl::scoped_ptr<FileDownloader> streaming_downloader_; |
217 | 229 |
218 // Used to report information when errors (PPAPI or otherwise) are reported. | 230 // Used to report information when errors (PPAPI or otherwise) are reported. |
219 ErrorInfo error_info_; | 231 ErrorInfo error_info_; |
220 // True if an error was already reported, and translate_notify_callback_ | 232 // True if an error was already reported, and translate_notify_callback_ |
221 // was already run/consumed. | 233 // was already run/consumed. |
222 bool error_already_reported_; | 234 bool error_already_reported_; |
223 | 235 |
| 236 // True if compilation is off_the_record. |
| 237 bool off_the_record_; |
| 238 |
224 // The helper thread used to do translations via SRPC. | 239 // The helper thread used to do translations via SRPC. |
225 // Keep this last in declaration order to ensure the other variables | 240 // Keep this last in declaration order to ensure the other variables |
226 // haven't been destroyed yet when its destructor runs. | 241 // haven't been destroyed yet when its destructor runs. |
227 nacl::scoped_ptr<PnaclTranslateThread> translate_thread_; | 242 nacl::scoped_ptr<PnaclTranslateThread> translate_thread_; |
228 | 243 |
229 }; | 244 }; |
230 | 245 |
231 //---------------------------------------------------------------------- | 246 //---------------------------------------------------------------------- |
232 | 247 |
233 } // namespace plugin; | 248 } // namespace plugin; |
234 #endif // NATIVE_CLIENT_SRC_TRUSTED_PLUGIN_PNACL_COORDINATOR_H_ | 249 #endif // NATIVE_CLIENT_SRC_TRUSTED_PLUGIN_PNACL_COORDINATOR_H_ |
OLD | NEW |