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

Side by Side Diff: ppapi/native_client/src/trusted/plugin/plugin.cc

Issue 649603004: Non-SFI NaCl: Batch-open resource files (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fix win x64 Created 6 years, 1 month 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 unified diff | Download patch
OLDNEW
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 #include "ppapi/native_client/src/trusted/plugin/plugin.h" 5 #include "ppapi/native_client/src/trusted/plugin/plugin.h"
6 6
7 #include <sys/stat.h> 7 #include <sys/stat.h>
8 #include <sys/types.h> 8 #include <sys/types.h>
9 9
10 #include <string> 10 #include <string>
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
110 } 110 }
111 111
112 void Plugin::SignalStartSelLdrDone(int32_t pp_error, 112 void Plugin::SignalStartSelLdrDone(int32_t pp_error,
113 bool* started, 113 bool* started,
114 ServiceRuntime* service_runtime) { 114 ServiceRuntime* service_runtime) {
115 *started = (pp_error == PP_OK); 115 *started = (pp_error == PP_OK);
116 service_runtime->SignalStartSelLdrDone(); 116 service_runtime->SignalStartSelLdrDone();
117 } 117 }
118 118
119 void Plugin::LoadNaClModule(PP_NaClFileInfo file_info, 119 void Plugin::LoadNaClModule(PP_NaClFileInfo file_info,
120 PP_NaClResourceFileHandle* resource_file_handles,
121 uint32_t resource_file_handles_len,
120 bool uses_nonsfi_mode, 122 bool uses_nonsfi_mode,
121 PP_NaClAppProcessType process_type, 123 PP_NaClAppProcessType process_type,
122 const pp::CompletionCallback& init_done_cb) { 124 const pp::CompletionCallback& init_done_cb) {
123 CHECK(pp::Module::Get()->core()->IsMainThread()); 125 CHECK(pp::Module::Get()->core()->IsMainThread());
124 // Before forking a new sel_ldr process, ensure that we do not leak 126 // Before forking a new sel_ldr process, ensure that we do not leak
125 // the ServiceRuntime object for an existing subprocess, and that any 127 // the ServiceRuntime object for an existing subprocess, and that any
126 // associated listener threads do not go unjoined because if they 128 // associated listener threads do not go unjoined because if they
127 // outlive the Plugin object, they will not be memory safe. 129 // outlive the Plugin object, they will not be memory safe.
128 ShutDownSubprocesses(); 130 ShutDownSubprocesses();
129 pp::Var manifest_base_url = 131 pp::Var manifest_base_url =
130 pp::Var(pp::PASS_REF, nacl_interface_->GetManifestBaseURL(pp_instance())); 132 pp::Var(pp::PASS_REF, nacl_interface_->GetManifestBaseURL(pp_instance()));
131 std::string manifest_base_url_str = manifest_base_url.AsString(); 133 std::string manifest_base_url_str = manifest_base_url.AsString();
132 134
133 SelLdrStartParams params(manifest_base_url_str, 135 SelLdrStartParams params(manifest_base_url_str,
134 file_info, 136 file_info,
137 resource_file_handles,
138 resource_file_handles_len,
135 process_type); 139 process_type);
136 ErrorInfo error_info; 140 ErrorInfo error_info;
137 ServiceRuntime* service_runtime = new ServiceRuntime( 141 ServiceRuntime* service_runtime = new ServiceRuntime(
138 this, pp_instance(), true, uses_nonsfi_mode, init_done_cb); 142 this, pp_instance(), true, uses_nonsfi_mode, init_done_cb);
139 main_subprocess_.set_service_runtime(service_runtime); 143 main_subprocess_.set_service_runtime(service_runtime);
140 if (NULL == service_runtime) { 144 if (NULL == service_runtime) {
141 error_info.SetReport( 145 error_info.SetReport(
142 PP_NACL_ERROR_SEL_LDR_INIT, 146 PP_NACL_ERROR_SEL_LDR_INIT,
143 "sel_ldr init failure " + main_subprocess_.description()); 147 "sel_ldr init failure " + main_subprocess_.description());
144 ReportLoadError(error_info); 148 ReportLoadError(error_info);
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
190 "unable to allocate helper subprocess."); 194 "unable to allocate helper subprocess.");
191 return NULL; 195 return NULL;
192 } 196 }
193 197
194 // Do not report UMA stats for translator-related nexes. 198 // Do not report UMA stats for translator-related nexes.
195 // TODO(sehr): define new UMA stats for translator related nexe events. 199 // TODO(sehr): define new UMA stats for translator related nexe events.
196 // NOTE: The PNaCl translator nexes are not built to use the IRT. This is 200 // NOTE: The PNaCl translator nexes are not built to use the IRT. This is
197 // done to save on address space and swap space. 201 // done to save on address space and swap space.
198 SelLdrStartParams params(helper_url, 202 SelLdrStartParams params(helper_url,
199 file_info, 203 file_info,
204 NULL,
205 0,
200 PP_PNACL_TRANSLATOR_PROCESS_TYPE); 206 PP_PNACL_TRANSLATOR_PROCESS_TYPE);
201 207
202 // Helper NaCl modules always use the PNaCl manifest, as there is no 208 // Helper NaCl modules always use the PNaCl manifest, as there is no
203 // corresponding NMF. 209 // corresponding NMF.
204 if (!LoadHelperNaClModuleInternal(nacl_subprocess.get(), params)) 210 if (!LoadHelperNaClModuleInternal(nacl_subprocess.get(), params))
205 return NULL; 211 return NULL;
206 212
207 // We need not wait for the init_done callback. We can block 213 // We need not wait for the init_done callback. We can block
208 // here in StartSrpcServices, since helper NaCl modules 214 // here in StartSrpcServices, since helper NaCl modules
209 // are spawned from a private thread. 215 // are spawned from a private thread.
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
241 nacl_interface_->RequestNaClManifest(pp_instance(), 247 nacl_interface_->RequestNaClManifest(pp_instance(),
242 open_cb.pp_completion_callback()); 248 open_cb.pp_completion_callback());
243 return true; 249 return true;
244 } 250 }
245 251
246 Plugin::Plugin(PP_Instance pp_instance) 252 Plugin::Plugin(PP_Instance pp_instance)
247 : pp::Instance(pp_instance), 253 : pp::Instance(pp_instance),
248 main_subprocess_("main subprocess", NULL, NULL), 254 main_subprocess_("main subprocess", NULL, NULL),
249 uses_nonsfi_mode_(false), 255 uses_nonsfi_mode_(false),
250 wrapper_factory_(NULL), 256 wrapper_factory_(NULL),
257 resource_file_handles_(NULL),
258 resource_file_handles_len_(0),
251 nacl_interface_(NULL), 259 nacl_interface_(NULL),
252 uma_interface_(this) { 260 uma_interface_(this) {
253 callback_factory_.Initialize(this); 261 callback_factory_.Initialize(this);
254 nacl_interface_ = GetNaClInterface(); 262 nacl_interface_ = GetNaClInterface();
255 CHECK(nacl_interface_ != NULL); 263 CHECK(nacl_interface_ != NULL);
256 264
257 // Notify PPB_NaCl_Private that the instance is created before altering any 265 // Notify PPB_NaCl_Private that the instance is created before altering any
258 // state that it tracks. 266 // state that it tracks.
259 nacl_interface_->InstanceCreated(pp_instance); 267 nacl_interface_->InstanceCreated(pp_instance);
260 nexe_file_info_ = kInvalidNaClFileInfo; 268 nexe_file_info_ = kInvalidNaClFileInfo;
(...skipping 28 matching lines...) Expand all
289 // 297 //
290 // The main_subprocess object, which wraps the main service_runtime 298 // The main_subprocess object, which wraps the main service_runtime
291 // object, is dtor'd implicitly after the explicit code below runs, 299 // object, is dtor'd implicitly after the explicit code below runs,
292 // so the main service runtime object will not have been dtor'd, 300 // so the main service runtime object will not have been dtor'd,
293 // though the Shutdown method may have been called, during the 301 // though the Shutdown method may have been called, during the
294 // lifetime of the service threads. 302 // lifetime of the service threads.
295 ShutDownSubprocesses(); 303 ShutDownSubprocesses();
296 304
297 delete wrapper_factory_; 305 delete wrapper_factory_;
298 306
307 for (uint32_t i = 0; i < resource_file_handles_len_; ++i) {
308 free(resource_file_handles_[i].key);
309 }
310 delete[] resource_file_handles_;
311
299 HistogramTimeSmall( 312 HistogramTimeSmall(
300 "NaCl.Perf.ShutdownTime.Total", 313 "NaCl.Perf.ShutdownTime.Total",
301 (NaClGetTimeOfDayMicroseconds() - shutdown_start) 314 (NaClGetTimeOfDayMicroseconds() - shutdown_start)
302 / NACL_MICROS_PER_MILLI); 315 / NACL_MICROS_PER_MILLI);
303 } 316 }
304 317
305 bool Plugin::HandleDocumentLoad(const pp::URLLoader& url_loader) { 318 bool Plugin::HandleDocumentLoad(const pp::URLLoader& url_loader) {
306 // We don't know if the plugin will handle the document load, but return 319 // We don't know if the plugin will handle the document load, but return
307 // true in order to give it a chance to respond once the proxy is started. 320 // true in order to give it a chance to respond once the proxy is started.
308 return true; 321 return true;
309 } 322 }
310 323
311 void Plugin::NexeFileDidOpen(int32_t pp_error) { 324 void Plugin::NexeFileDidOpen(int32_t pp_error) {
312 if (pp_error != PP_OK) 325 if (pp_error != PP_OK)
313 return; 326 return;
314 LoadNaClModule( 327 LoadNaClModule(
315 nexe_file_info_, 328 nexe_file_info_,
329 resource_file_handles_,
330 resource_file_handles_len_,
316 uses_nonsfi_mode_, 331 uses_nonsfi_mode_,
317 PP_NATIVE_NACL_PROCESS_TYPE, 332 PP_NATIVE_NACL_PROCESS_TYPE,
318 callback_factory_.NewCallback(&Plugin::NexeFileDidOpenContinuation)); 333 callback_factory_.NewCallback(&Plugin::NexeFileDidOpenContinuation));
319 } 334 }
320 335
321 void Plugin::NexeFileDidOpenContinuation(int32_t pp_error) { 336 void Plugin::NexeFileDidOpenContinuation(int32_t pp_error) {
322 UNREFERENCED_PARAMETER(pp_error); 337 UNREFERENCED_PARAMETER(pp_error);
323 NaClLog(4, "Entered NexeFileDidOpenContinuation\n"); 338 NaClLog(4, "Entered NexeFileDidOpenContinuation\n");
324 if (LoadNaClModuleContinuationIntern()) { 339 if (LoadNaClModuleContinuationIntern()) {
325 NaClLog(4, "NexeFileDidOpenContinuation: success;" 340 NaClLog(4, "NexeFileDidOpenContinuation: success;"
(...skipping 17 matching lines...) Expand all
343 358
344 // Inform JavaScript that we successfully translated the bitcode to a nexe. 359 // Inform JavaScript that we successfully translated the bitcode to a nexe.
345 PP_FileHandle handle = pnacl_coordinator_->TakeTranslatedFileHandle(); 360 PP_FileHandle handle = pnacl_coordinator_->TakeTranslatedFileHandle();
346 361
347 PP_NaClFileInfo info; 362 PP_NaClFileInfo info;
348 info.handle = handle; 363 info.handle = handle;
349 info.token_lo = 0; 364 info.token_lo = 0;
350 info.token_hi = 0; 365 info.token_hi = 0;
351 LoadNaClModule( 366 LoadNaClModule(
352 info, 367 info,
368 NULL,
369 0,
353 false, /* uses_nonsfi_mode */ 370 false, /* uses_nonsfi_mode */
354 PP_PNACL_PROCESS_TYPE, 371 PP_PNACL_PROCESS_TYPE,
355 callback_factory_.NewCallback(&Plugin::BitcodeDidTranslateContinuation)); 372 callback_factory_.NewCallback(&Plugin::BitcodeDidTranslateContinuation));
356 } 373 }
357 374
358 void Plugin::BitcodeDidTranslateContinuation(int32_t pp_error) { 375 void Plugin::BitcodeDidTranslateContinuation(int32_t pp_error) {
359 NaClLog(4, "Entered BitcodeDidTranslateContinuation\n"); 376 NaClLog(4, "Entered BitcodeDidTranslateContinuation\n");
360 UNREFERENCED_PARAMETER(pp_error); 377 UNREFERENCED_PARAMETER(pp_error);
361 if (LoadNaClModuleContinuationIntern()) { 378 if (LoadNaClModuleContinuationIntern()) {
362 int64_t loaded; 379 int64_t loaded;
(...skipping 29 matching lines...) Expand all
392 program_url, 409 program_url,
393 pnacl_options, 410 pnacl_options,
394 translate_callback)); 411 translate_callback));
395 return; 412 return;
396 } else { 413 } else {
397 pp::CompletionCallback open_callback = 414 pp::CompletionCallback open_callback =
398 callback_factory_.NewCallback(&Plugin::NexeFileDidOpen); 415 callback_factory_.NewCallback(&Plugin::NexeFileDidOpen);
399 // Will always call the callback on success or failure. 416 // Will always call the callback on success or failure.
400 nacl_interface_->DownloadNexe(pp_instance(), 417 nacl_interface_->DownloadNexe(pp_instance(),
401 program_url.c_str(), 418 program_url.c_str(),
419 // pre-open resource files on nonsfi mode
420 // TODO(yusukes): Enable the feature for
421 // SFI-NaCl too.
422 uses_nonsfi_mode,
402 &nexe_file_info_, 423 &nexe_file_info_,
424 &resource_file_handles_,
425 &resource_file_handles_len_,
403 open_callback.pp_completion_callback()); 426 open_callback.pp_completion_callback());
404 return; 427 return;
405 } 428 }
406 } 429 }
407 } 430 }
408 431
409 void Plugin::ReportLoadError(const ErrorInfo& error_info) { 432 void Plugin::ReportLoadError(const ErrorInfo& error_info) {
410 nacl_interface_->ReportLoadError(pp_instance(), 433 nacl_interface_->ReportLoadError(pp_instance(),
411 error_info.error_code(), 434 error_info.error_code(),
412 error_info.message().c_str()); 435 error_info.message().c_str());
413 } 436 }
414 437
415 } // namespace plugin 438 } // namespace plugin
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698