OLD | NEW |
---|---|
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 #include "native_client/src/trusted/plugin/pnacl_coordinator.h" | 5 #include "native_client/src/trusted/plugin/pnacl_coordinator.h" |
6 | 6 |
7 #include <utility> | 7 #include <utility> |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "native_client/src/include/portability_io.h" | 10 #include "native_client/src/include/portability_io.h" |
(...skipping 15 matching lines...) Expand all Loading... | |
26 | 26 |
27 namespace plugin { | 27 namespace plugin { |
28 | 28 |
29 class Plugin; | 29 class Plugin; |
30 | 30 |
31 namespace { | 31 namespace { |
32 | 32 |
33 const char kLlcUrl[] = "llc"; | 33 const char kLlcUrl[] = "llc"; |
34 const char kLdUrl[] = "ld"; | 34 const char kLdUrl[] = "ld"; |
35 | 35 |
36 nacl::string ResourceBaseUrl() { | 36 nacl::string ExtensionUrl() { |
37 return nacl::string("pnacl_support/") + GetSandboxISA() + "/"; | 37 const nacl::string kPnaclExtensionOrigin = |
38 "chrome-extension://gcodniebolpnpaiggndmcmmfpldlknih/"; | |
elijahtaylor (use chromium)
2011/12/19 21:42:52
Hard-coded extension string seems a bit fragile...
sehr (please use chromium)
2011/12/20 01:48:38
I agree that we need to have a better way to refer
| |
39 return kPnaclExtensionOrigin + GetSandboxISA() + "/"; | |
38 } | 40 } |
39 | 41 |
40 nacl::string Random32CharHexString(struct NaClDescRng* rng) { | 42 nacl::string Random32CharHexString(struct NaClDescRng* rng) { |
41 struct NaClDesc* desc = reinterpret_cast<struct NaClDesc*>(rng); | 43 struct NaClDesc* desc = reinterpret_cast<struct NaClDesc*>(rng); |
42 const struct NaClDescVtbl* vtbl = | 44 const struct NaClDescVtbl* vtbl = |
43 reinterpret_cast<const struct NaClDescVtbl*>(desc->base.vtbl); | 45 reinterpret_cast<const struct NaClDescVtbl*>(desc->base.vtbl); |
44 | 46 |
45 nacl::string hex_string; | 47 nacl::string hex_string; |
46 const int32_t kTempFileNameWords = 4; | 48 const int32_t kTempFileNameWords = 4; |
47 for (int32_t i = 0; i < kTempFileNameWords; ++i) { | 49 for (int32_t i = 0; i < kTempFileNameWords; ++i) { |
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
165 // Run the client's completion callback. | 167 // Run the client's completion callback. |
166 pp::Core* core = pp::Module::Get()->core(); | 168 pp::Core* core = pp::Module::Get()->core(); |
167 core->CallOnMainThread(0, done_callback_, PP_OK); | 169 core->CallOnMainThread(0, done_callback_, PP_OK); |
168 } | 170 } |
169 | 171 |
170 ////////////////////////////////////////////////////////////////////// | 172 ////////////////////////////////////////////////////////////////////// |
171 // Pnacl-specific manifest support. | 173 // Pnacl-specific manifest support. |
172 ////////////////////////////////////////////////////////////////////// | 174 ////////////////////////////////////////////////////////////////////// |
173 class PnaclManifest : public Manifest { | 175 class PnaclManifest : public Manifest { |
174 public: | 176 public: |
175 PnaclManifest(const pp::URLUtil_Dev* url_util, | 177 PnaclManifest(const pp::URLUtil_Dev* url_util) |
176 const nacl::string& manifest_base_url) | 178 : Manifest(url_util, ExtensionUrl(), GetSandboxISA(), false) { |
177 : Manifest(url_util, manifest_base_url, GetSandboxISA(), false) { | |
178 size_t last_slash_pos = manifest_base_url_.rfind("/"); | |
179 CHECK(last_slash_pos != nacl::string::npos); | |
180 // url_prefix contains everything in manifest_base_url up to and including | |
181 // the last slash. | |
182 url_prefix_ = | |
183 manifest_base_url_.substr(0, last_slash_pos + 1) + ResourceBaseUrl(); | |
184 } | 179 } |
185 virtual ~PnaclManifest() { } | 180 virtual ~PnaclManifest() { } |
186 | 181 |
187 virtual bool GetProgramURL(nacl::string* full_url, | 182 virtual bool GetProgramURL(nacl::string* full_url, |
188 ErrorInfo* error_info, | 183 ErrorInfo* error_info, |
189 bool* is_portable) { | 184 bool* is_portable) { |
190 // Does not contain program urls. | 185 // Does not contain program urls. |
191 UNREFERENCED_PARAMETER(full_url); | 186 UNREFERENCED_PARAMETER(full_url); |
192 UNREFERENCED_PARAMETER(error_info); | 187 UNREFERENCED_PARAMETER(error_info); |
193 UNREFERENCED_PARAMETER(is_portable); | 188 UNREFERENCED_PARAMETER(is_portable); |
194 PLUGIN_PRINTF(("PnaclManifest does not contain a program\n")); | 189 PLUGIN_PRINTF(("PnaclManifest does not contain a program\n")); |
195 error_info->SetReport(ERROR_MANIFEST_GET_NEXE_URL, | 190 error_info->SetReport(ERROR_MANIFEST_GET_NEXE_URL, |
196 "pnacl manifest does not contain a program"); | 191 "pnacl manifest does not contain a program"); |
197 return false; | 192 return false; |
198 } | 193 } |
199 | 194 |
200 virtual bool ResolveURL(const nacl::string& relative_url, | 195 virtual bool ResolveURL(const nacl::string& relative_url, |
201 nacl::string* full_url, | 196 nacl::string* full_url, |
202 ErrorInfo* error_info) const { | 197 ErrorInfo* error_info) const { |
203 // Does not do general URL resolution, simply appends relative_url to | 198 // Does not do general URL resolution, simply appends relative_url to |
204 // the end of url_prefix_. | 199 // the end of manifest_base_url_. |
205 UNREFERENCED_PARAMETER(error_info); | 200 UNREFERENCED_PARAMETER(error_info); |
206 *full_url = url_prefix_ + relative_url; | 201 *full_url = manifest_base_url_ + relative_url; |
207 return true; | 202 return true; |
208 } | 203 } |
209 | 204 |
210 virtual bool GetFileKeys(std::set<nacl::string>* keys) const { | 205 virtual bool GetFileKeys(std::set<nacl::string>* keys) const { |
211 // Does not support enumeration. | 206 // Does not support enumeration. |
212 PLUGIN_PRINTF(("PnaclManifest does not support key enumeration\n")); | 207 PLUGIN_PRINTF(("PnaclManifest does not support key enumeration\n")); |
213 UNREFERENCED_PARAMETER(keys); | 208 UNREFERENCED_PARAMETER(keys); |
214 return false; | 209 return false; |
215 } | 210 } |
216 | 211 |
217 virtual bool ResolveKey(const nacl::string& key, | 212 virtual bool ResolveKey(const nacl::string& key, |
218 nacl::string* full_url, | 213 nacl::string* full_url, |
219 ErrorInfo* error_info, | 214 ErrorInfo* error_info, |
220 bool* is_portable) const { | 215 bool* is_portable) const { |
221 *is_portable = false; | 216 *is_portable = false; |
222 // We can only resolve keys in the files/ namespace. | 217 // We can only resolve keys in the files/ namespace. |
223 const nacl::string kFilesPrefix = "files/"; | 218 const nacl::string kFilesPrefix = "files/"; |
224 size_t files_prefix_pos = key.find(kFilesPrefix); | 219 size_t files_prefix_pos = key.find(kFilesPrefix); |
225 if (files_prefix_pos == nacl::string::npos) { | 220 if (files_prefix_pos == nacl::string::npos) { |
226 error_info->SetReport(ERROR_MANIFEST_RESOLVE_URL, | 221 error_info->SetReport(ERROR_MANIFEST_RESOLVE_URL, |
227 "key did not start with files/"); | 222 "key did not start with files/"); |
228 return false; | 223 return false; |
229 } | 224 } |
230 // Append what follows files to the pnacl URL prefix. | 225 // Append what follows files to the pnacl URL prefix. |
231 nacl::string key_basename = key.substr(kFilesPrefix.length()); | 226 nacl::string key_basename = key.substr(kFilesPrefix.length()); |
232 return ResolveURL(key_basename, full_url, error_info); | 227 return ResolveURL(key_basename, full_url, error_info); |
233 } | 228 } |
234 | 229 |
235 private: | 230 // Since the pnacl coordinator manifest is in a base in the chrome extension |
236 nacl::string url_prefix_; | 231 // scheme, lookups will need to access resources in their extension origin. |
232 virtual bool PermitsExtensionUrls() const { | |
233 return true; | |
234 } | |
237 }; | 235 }; |
238 | 236 |
239 ////////////////////////////////////////////////////////////////////// | 237 ////////////////////////////////////////////////////////////////////// |
240 // The coordinator class. | 238 // The coordinator class. |
241 ////////////////////////////////////////////////////////////////////// | 239 ////////////////////////////////////////////////////////////////////// |
242 PnaclCoordinator* PnaclCoordinator::BitcodeToNative( | 240 PnaclCoordinator* PnaclCoordinator::BitcodeToNative( |
243 Plugin* plugin, | 241 Plugin* plugin, |
244 const nacl::string& pexe_url, | 242 const nacl::string& pexe_url, |
245 const pp::CompletionCallback& translate_notify_callback) { | 243 const pp::CompletionCallback& translate_notify_callback) { |
246 PLUGIN_PRINTF(("PnaclCoordinator::BitcodeToNative (plugin=%p, pexe=%s)\n", | 244 PLUGIN_PRINTF(("PnaclCoordinator::BitcodeToNative (plugin=%p, pexe=%s)\n", |
247 static_cast<void*>(plugin), pexe_url.c_str())); | 245 static_cast<void*>(plugin), pexe_url.c_str())); |
248 PnaclCoordinator* coordinator = | 246 PnaclCoordinator* coordinator = |
249 new PnaclCoordinator(plugin, | 247 new PnaclCoordinator(plugin, pexe_url, translate_notify_callback); |
250 pexe_url, | 248 PLUGIN_PRINTF(("PnaclCoordinator::BitcodeToNative (manifest=%p)\n", |
251 translate_notify_callback, | 249 reinterpret_cast<const void*>(coordinator->manifest_))); |
252 ResourceBaseUrl()); | |
253 // Load llc and ld. | 250 // Load llc and ld. |
254 std::vector<nacl::string> resource_urls; | 251 std::vector<nacl::string> resource_urls; |
255 resource_urls.push_back(kLlcUrl); | 252 resource_urls.push_back(kLlcUrl); |
256 resource_urls.push_back(kLdUrl); | 253 resource_urls.push_back(kLdUrl); |
257 pp::CompletionCallback resources_cb = | 254 pp::CompletionCallback resources_cb = |
258 coordinator->callback_factory_.NewCallback( | 255 coordinator->callback_factory_.NewCallback( |
259 &PnaclCoordinator::ResourcesDidLoad); | 256 &PnaclCoordinator::ResourcesDidLoad); |
260 coordinator->resources_.reset( | 257 coordinator->resources_.reset( |
261 new PnaclResources(plugin, | 258 new PnaclResources(plugin, |
262 coordinator, | 259 coordinator, |
263 coordinator->resource_base_url_, | 260 coordinator->manifest_, |
264 resource_urls, | 261 resource_urls, |
265 resources_cb)); | 262 resources_cb)); |
266 CHECK(coordinator->resources_ != NULL); | 263 CHECK(coordinator->resources_ != NULL); |
267 coordinator->resources_->StartDownloads(); | 264 coordinator->resources_->StartDownloads(); |
268 // ResourcesDidLoad will be invoked when all resources have been received. | 265 // ResourcesDidLoad will be invoked when all resources have been received. |
269 return coordinator; | 266 return coordinator; |
270 } | 267 } |
271 | 268 |
272 int32_t PnaclCoordinator::GetLoadedFileDesc(int32_t pp_error, | 269 int32_t PnaclCoordinator::GetLoadedFileDesc(int32_t pp_error, |
273 const nacl::string& url, | 270 const nacl::string& url, |
(...skipping 16 matching lines...) Expand all Loading... | |
290 if (file_desc_ok_to_close == NACL_NO_FILE_DESC) { | 287 if (file_desc_ok_to_close == NACL_NO_FILE_DESC) { |
291 ReportPpapiError(PP_ERROR_FAILED, component + " could not dup fd.\n"); | 288 ReportPpapiError(PP_ERROR_FAILED, component + " could not dup fd.\n"); |
292 return -1; | 289 return -1; |
293 } | 290 } |
294 return file_desc_ok_to_close; | 291 return file_desc_ok_to_close; |
295 } | 292 } |
296 | 293 |
297 PnaclCoordinator::PnaclCoordinator( | 294 PnaclCoordinator::PnaclCoordinator( |
298 Plugin* plugin, | 295 Plugin* plugin, |
299 const nacl::string& pexe_url, | 296 const nacl::string& pexe_url, |
300 const pp::CompletionCallback& translate_notify_callback, | 297 const pp::CompletionCallback& translate_notify_callback) |
301 const nacl::string& resource_base_url) | |
302 : plugin_(plugin), | 298 : plugin_(plugin), |
303 translate_notify_callback_(translate_notify_callback), | 299 translate_notify_callback_(translate_notify_callback), |
304 resource_base_url_(resource_base_url), | |
305 llc_subprocess_(NULL), | 300 llc_subprocess_(NULL), |
306 ld_subprocess_(NULL), | 301 ld_subprocess_(NULL), |
307 subprocesses_should_die_(false), | 302 subprocesses_should_die_(false), |
308 file_system_(new pp::FileSystem(plugin, PP_FILESYSTEMTYPE_LOCALTEMPORARY)), | 303 file_system_(new pp::FileSystem(plugin, PP_FILESYSTEMTYPE_LOCALTEMPORARY)), |
309 // TODO(sehr,jvoung): change base url to pnacl extension/testing url. | 304 // TODO(sehr,jvoung): change base url to pnacl extension/testing url. |
jvoung - send to chromium...
2011/12/19 21:37:08
TODO can be removed now =)
elijahtaylor (use chromium)
2011/12/19 21:42:52
Time to remove TODO?
sehr (please use chromium)
2011/12/20 01:48:38
Done.
sehr (please use chromium)
2011/12/20 01:48:38
Done.
| |
310 manifest_(new PnaclManifest(plugin->url_util(), | 305 manifest_(new PnaclManifest(plugin->url_util())), |
311 plugin->manifest_base_url())), | |
312 pexe_url_(pexe_url) { | 306 pexe_url_(pexe_url) { |
313 PLUGIN_PRINTF(("PnaclCoordinator::PnaclCoordinator (this=%p, plugin=%p)\n", | 307 PLUGIN_PRINTF(("PnaclCoordinator::PnaclCoordinator (this=%p, plugin=%p)\n", |
314 static_cast<void*>(this), static_cast<void*>(plugin))); | 308 static_cast<void*>(this), static_cast<void*>(plugin))); |
315 callback_factory_.Initialize(this); | 309 callback_factory_.Initialize(this); |
316 NaClXMutexCtor(&subprocess_mu_); | 310 NaClXMutexCtor(&subprocess_mu_); |
317 // Check the temporary file system. | |
318 CHECK(file_system_ != NULL); | |
elijahtaylor (use chromium)
2011/12/19 21:42:52
Why did you delete this check?
sehr (please use chromium)
2011/12/20 01:48:38
In chrome, new throws rather than returning null,
| |
319 } | 311 } |
320 | 312 |
321 PnaclCoordinator::~PnaclCoordinator() { | 313 PnaclCoordinator::~PnaclCoordinator() { |
322 PLUGIN_PRINTF(("PnaclCoordinator::~PnaclCoordinator (this=%p)\n", | 314 PLUGIN_PRINTF(("PnaclCoordinator::~PnaclCoordinator (this=%p)\n", |
323 static_cast<void*>(this))); | 315 static_cast<void*>(this))); |
324 // Join helper thread which will block the page from refreshing while a | 316 // Join helper thread which will block the page from refreshing while a |
325 // translation is happening. | 317 // translation is happening. |
326 if (translate_thread_.get() != NULL) { | 318 if (translate_thread_.get() != NULL) { |
327 SetSubprocessesShouldDie(true); | 319 SetSubprocessesShouldDie(true); |
328 NaClThreadJoin(translate_thread_.get()); | 320 NaClThreadJoin(translate_thread_.get()); |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
426 PLUGIN_PRINTF(("PnaclCoordinator::NexePairDidOpen (pp_error=%" | 418 PLUGIN_PRINTF(("PnaclCoordinator::NexePairDidOpen (pp_error=%" |
427 NACL_PRId32")\n", pp_error)); | 419 NACL_PRId32")\n", pp_error)); |
428 if (pp_error != PP_OK) { | 420 if (pp_error != PP_OK) { |
429 ReportPpapiError(pp_error); | 421 ReportPpapiError(pp_error); |
430 return; | 422 return; |
431 } | 423 } |
432 // Load the pexe file and get the translation started. | 424 // Load the pexe file and get the translation started. |
433 pp::CompletionCallback cb = | 425 pp::CompletionCallback cb = |
434 callback_factory_.NewCallback(&PnaclCoordinator::RunTranslate); | 426 callback_factory_.NewCallback(&PnaclCoordinator::RunTranslate); |
435 | 427 |
436 if (!plugin_->StreamAsFile(pexe_url_, cb.pp_completion_callback())) { | 428 if (!plugin_->StreamAsFile(pexe_url_, |
429 manifest_->PermitsExtensionUrls(), | |
430 cb.pp_completion_callback())) { | |
437 ReportNonPpapiError(nacl::string("failed to download ") + pexe_url_ + "\n"); | 431 ReportNonPpapiError(nacl::string("failed to download ") + pexe_url_ + "\n"); |
438 } | 432 } |
439 } | 433 } |
440 | 434 |
441 void PnaclCoordinator::RunTranslate(int32_t pp_error) { | 435 void PnaclCoordinator::RunTranslate(int32_t pp_error) { |
442 PLUGIN_PRINTF(("PnaclCoordinator::RunTranslate (pp_error=%" | 436 PLUGIN_PRINTF(("PnaclCoordinator::RunTranslate (pp_error=%" |
443 NACL_PRId32")\n", pp_error)); | 437 NACL_PRId32")\n", pp_error)); |
444 int32_t fd = GetLoadedFileDesc(pp_error, pexe_url_, "pexe"); | 438 int32_t fd = GetLoadedFileDesc(pp_error, pexe_url_, "pexe"); |
445 if (fd < 0) { | 439 if (fd < 0) { |
446 return; | 440 return; |
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
555 nacl::MutexLocker ml(&subprocess_mu_); | 549 nacl::MutexLocker ml(&subprocess_mu_); |
556 return subprocesses_should_die_; | 550 return subprocesses_should_die_; |
557 } | 551 } |
558 | 552 |
559 void PnaclCoordinator::SetSubprocessesShouldDie(bool subprocesses_should_die) { | 553 void PnaclCoordinator::SetSubprocessesShouldDie(bool subprocesses_should_die) { |
560 nacl::MutexLocker ml(&subprocess_mu_); | 554 nacl::MutexLocker ml(&subprocess_mu_); |
561 subprocesses_should_die_ = subprocesses_should_die; | 555 subprocesses_should_die_ = subprocesses_should_die; |
562 } | 556 } |
563 | 557 |
564 } // namespace plugin | 558 } // namespace plugin |
OLD | NEW |