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

Side by Side Diff: ppapi/proxy/serialized_var.cc

Issue 6334016: Refactor PPAPI proxy resource handling to maintain which host they came from,... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 9 years, 10 months 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 | Annotate | Revision Log
« no previous file with comments | « ppapi/proxy/serialized_var.h ('k') | ppapi/proxy/serialized_var_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 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/proxy/serialized_var.h" 5 #include "ppapi/proxy/serialized_var.h"
6 6
7 #include "base/logging.h" 7 #include "base/logging.h"
8 #include "ipc/ipc_message_utils.h" 8 #include "ipc/ipc_message_utils.h"
9 #include "ppapi/proxy/dispatcher.h" 9 #include "ppapi/proxy/dispatcher.h"
10 #include "ppapi/proxy/interface_proxy.h" 10 #include "ppapi/proxy/interface_proxy.h"
11 #include "ppapi/proxy/ppapi_param_traits.h" 11 #include "ppapi/proxy/ppapi_param_traits.h"
12 #include "ppapi/proxy/var_serialization_rules.h" 12 #include "ppapi/proxy/var_serialization_rules.h"
13 13
14 namespace pp { 14 namespace pp {
15 namespace proxy { 15 namespace proxy {
16 16
17 // SerializedVar::Inner -------------------------------------------------------- 17 // SerializedVar::Inner --------------------------------------------------------
18 18
19 SerializedVar::Inner::Inner() 19 SerializedVar::Inner::Inner()
20 : serialization_rules_(NULL), 20 : serialization_rules_(NULL),
21 var_(PP_MakeUndefined()), 21 var_(PP_MakeUndefined()),
22 cleanup_mode_(CLEANUP_NONE) { 22 cleanup_mode_(CLEANUP_NONE),
23 dispatcher_for_end_send_pass_ref_(NULL) {
23 #ifndef NDEBUG 24 #ifndef NDEBUG
24 has_been_serialized_ = false; 25 has_been_serialized_ = false;
25 has_been_deserialized_ = false; 26 has_been_deserialized_ = false;
26 #endif 27 #endif
27 } 28 }
28 29
29 SerializedVar::Inner::Inner(VarSerializationRules* serialization_rules) 30 SerializedVar::Inner::Inner(VarSerializationRules* serialization_rules)
30 : serialization_rules_(serialization_rules), 31 : serialization_rules_(serialization_rules),
31 var_(PP_MakeUndefined()), 32 var_(PP_MakeUndefined()),
32 cleanup_mode_(CLEANUP_NONE) { 33 cleanup_mode_(CLEANUP_NONE),
34 dispatcher_for_end_send_pass_ref_(NULL) {
33 #ifndef NDEBUG 35 #ifndef NDEBUG
34 has_been_serialized_ = false; 36 has_been_serialized_ = false;
35 has_been_deserialized_ = false; 37 has_been_deserialized_ = false;
36 #endif 38 #endif
37 } 39 }
38 40
39 SerializedVar::Inner::Inner(VarSerializationRules* serialization_rules, 41 SerializedVar::Inner::Inner(VarSerializationRules* serialization_rules,
40 const PP_Var& var) 42 const PP_Var& var)
41 : serialization_rules_(serialization_rules), 43 : serialization_rules_(serialization_rules),
42 var_(var), 44 var_(var),
43 cleanup_mode_(CLEANUP_NONE) { 45 cleanup_mode_(CLEANUP_NONE),
46 dispatcher_for_end_send_pass_ref_(NULL) {
44 #ifndef NDEBUG 47 #ifndef NDEBUG
45 has_been_serialized_ = false; 48 has_been_serialized_ = false;
46 has_been_deserialized_ = false; 49 has_been_deserialized_ = false;
47 #endif 50 #endif
48 } 51 }
49 52
50 SerializedVar::Inner::~Inner() { 53 SerializedVar::Inner::~Inner() {
51 switch (cleanup_mode_) { 54 switch (cleanup_mode_) {
52 case END_SEND_PASS_REF: 55 case END_SEND_PASS_REF:
53 serialization_rules_->EndSendPassRef(var_); 56 DCHECK(dispatcher_for_end_send_pass_ref_);
57 serialization_rules_->EndSendPassRef(var_,
58 dispatcher_for_end_send_pass_ref_);
54 break; 59 break;
55 case END_RECEIVE_CALLER_OWNED: 60 case END_RECEIVE_CALLER_OWNED:
56 serialization_rules_->EndReceiveCallerOwned(var_); 61 serialization_rules_->EndReceiveCallerOwned(var_);
57 break; 62 break;
58 default: 63 default:
59 break; 64 break;
60 } 65 }
61 } 66 }
62 67
63 PP_Var SerializedVar::Inner::GetVar() const { 68 PP_Var SerializedVar::Inner::GetVar() const {
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after
197 } 202 }
198 203
199 // All success cases get here. We avoid writing the type above so that the 204 // All success cases get here. We avoid writing the type above so that the
200 // output param is untouched (defaults to VARTYPE_UNDEFINED) even in the 205 // output param is untouched (defaults to VARTYPE_UNDEFINED) even in the
201 // failure case. 206 // failure case.
202 if (success) 207 if (success)
203 var_.type = static_cast<PP_VarType>(type); 208 var_.type = static_cast<PP_VarType>(type);
204 return success; 209 return success;
205 } 210 }
206 211
212 void SerializedVar::Inner::SetCleanupModeToEndSendPassRef(
213 Dispatcher* dispatcher) {
214 DCHECK(dispatcher);
215 DCHECK(!dispatcher_for_end_send_pass_ref_);
216 dispatcher_for_end_send_pass_ref_ = dispatcher;
217 cleanup_mode_ = END_SEND_PASS_REF;
218 }
219
220 void SerializedVar::Inner::SetCleanupModeToEndReceiveCallerOwned() {
221 cleanup_mode_ = END_RECEIVE_CALLER_OWNED;
222 }
223
207 // SerializedVar --------------------------------------------------------------- 224 // SerializedVar ---------------------------------------------------------------
208 225
209 SerializedVar::SerializedVar() : inner_(new Inner) { 226 SerializedVar::SerializedVar() : inner_(new Inner) {
210 } 227 }
211 228
212 SerializedVar::SerializedVar(VarSerializationRules* serialization_rules) 229 SerializedVar::SerializedVar(VarSerializationRules* serialization_rules)
213 : inner_(new Inner(serialization_rules)) { 230 : inner_(new Inner(serialization_rules)) {
214 } 231 }
215 232
216 SerializedVar::SerializedVar(VarSerializationRules* serialization_rules, 233 SerializedVar::SerializedVar(VarSerializationRules* serialization_rules,
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
332 349
333 SerializedVarReceiveInput::~SerializedVarReceiveInput() { 350 SerializedVarReceiveInput::~SerializedVarReceiveInput() {
334 } 351 }
335 352
336 PP_Var SerializedVarReceiveInput::Get(Dispatcher* dispatcher) { 353 PP_Var SerializedVarReceiveInput::Get(Dispatcher* dispatcher) {
337 serialized_.inner_->set_serialization_rules( 354 serialized_.inner_->set_serialization_rules(
338 dispatcher->serialization_rules()); 355 dispatcher->serialization_rules());
339 356
340 // Ensure that when the serialized var goes out of scope it cleans up the 357 // Ensure that when the serialized var goes out of scope it cleans up the
341 // stuff we're making in BeginReceiveCallerOwned. 358 // stuff we're making in BeginReceiveCallerOwned.
342 serialized_.inner_->set_cleanup_mode(SerializedVar::END_RECEIVE_CALLER_OWNED); 359 serialized_.inner_->SetCleanupModeToEndReceiveCallerOwned();
343 360
344 serialized_.inner_->SetVar( 361 serialized_.inner_->SetVar(
345 serialized_.inner_->serialization_rules()->BeginReceiveCallerOwned( 362 serialized_.inner_->serialization_rules()->BeginReceiveCallerOwned(
346 serialized_.inner_->GetIncompleteVar(), 363 serialized_.inner_->GetIncompleteVar(),
347 serialized_.inner_->GetStringPtr(), 364 serialized_.inner_->GetStringPtr(),
348 dispatcher)); 365 dispatcher));
349 return serialized_.inner_->GetVar(); 366 return serialized_.inner_->GetVar();
350 } 367 }
351 368
352 // SerializedVarVectorReceiveInput --------------------------------------------- 369 // SerializedVarVectorReceiveInput ---------------------------------------------
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
389 SerializedVarReturnValue::SerializedVarReturnValue(SerializedVar* serialized) 406 SerializedVarReturnValue::SerializedVarReturnValue(SerializedVar* serialized)
390 : serialized_(serialized) { 407 : serialized_(serialized) {
391 } 408 }
392 409
393 void SerializedVarReturnValue::Return(Dispatcher* dispatcher, 410 void SerializedVarReturnValue::Return(Dispatcher* dispatcher,
394 const PP_Var& var) { 411 const PP_Var& var) {
395 serialized_->inner_->set_serialization_rules( 412 serialized_->inner_->set_serialization_rules(
396 dispatcher->serialization_rules()); 413 dispatcher->serialization_rules());
397 414
398 // Var must clean up after our BeginSendPassRef call. 415 // Var must clean up after our BeginSendPassRef call.
399 serialized_->inner_->set_cleanup_mode(SerializedVar::END_SEND_PASS_REF); 416 serialized_->inner_->SetCleanupModeToEndSendPassRef(dispatcher);
400 417
401 serialized_->inner_->SetVar( 418 serialized_->inner_->SetVar(
402 dispatcher->serialization_rules()->BeginSendPassRef( 419 dispatcher->serialization_rules()->BeginSendPassRef(
403 var, 420 var,
404 serialized_->inner_->GetStringPtr())); 421 serialized_->inner_->GetStringPtr()));
405 } 422 }
406 423
407 // SerializedVarOutParam ------------------------------------------------------- 424 // SerializedVarOutParam -------------------------------------------------------
408 425
409 SerializedVarOutParam::SerializedVarOutParam(SerializedVar* serialized) 426 SerializedVarOutParam::SerializedVarOutParam(SerializedVar* serialized)
410 : serialized_(serialized), 427 : serialized_(serialized),
411 writable_var_(PP_MakeUndefined()) { 428 writable_var_(PP_MakeUndefined()),
429 dispatcher_(NULL) {
412 } 430 }
413 431
414 SerializedVarOutParam::~SerializedVarOutParam() { 432 SerializedVarOutParam::~SerializedVarOutParam() {
415 if (serialized_->inner_->serialization_rules()) { 433 if (serialized_->inner_->serialization_rules()) {
416 // When unset, OutParam wasn't called. We'll just leave the var untouched 434 // When unset, OutParam wasn't called. We'll just leave the var untouched
417 // in that case. 435 // in that case.
418 serialized_->inner_->SetVar( 436 serialized_->inner_->SetVar(
419 serialized_->inner_->serialization_rules()->BeginSendPassRef( 437 serialized_->inner_->serialization_rules()->BeginSendPassRef(
420 writable_var_, serialized_->inner_->GetStringPtr())); 438 writable_var_, serialized_->inner_->GetStringPtr()));
421 439
422 // Normally the current object will be created on the stack to wrap a 440 // Normally the current object will be created on the stack to wrap a
423 // SerializedVar and won't have a scope around the actual IPC send. So we 441 // SerializedVar and won't have a scope around the actual IPC send. So we
424 // need to tell the SerializedVar to do the begin/end send pass ref calls. 442 // need to tell the SerializedVar to do the begin/end send pass ref calls.
425 serialized_->inner_->set_cleanup_mode(SerializedVar::END_SEND_PASS_REF); 443 serialized_->inner_->SetCleanupModeToEndSendPassRef(dispatcher_);
426 } 444 }
427 } 445 }
428 446
429 PP_Var* SerializedVarOutParam::OutParam(Dispatcher* dispatcher) { 447 PP_Var* SerializedVarOutParam::OutParam(Dispatcher* dispatcher) {
448 dispatcher_ = dispatcher;
430 serialized_->inner_->set_serialization_rules( 449 serialized_->inner_->set_serialization_rules(
431 dispatcher->serialization_rules()); 450 dispatcher->serialization_rules());
432 return &writable_var_; 451 return &writable_var_;
433 } 452 }
434 453
435 // SerializedVarVectorOutParam ------------------------------------------------- 454 // SerializedVarVectorOutParam -------------------------------------------------
436 455
437 SerializedVarVectorOutParam::SerializedVarVectorOutParam( 456 SerializedVarVectorOutParam::SerializedVarVectorOutParam(
438 std::vector<SerializedVar>* serialized) 457 std::vector<SerializedVar>* serialized)
439 : dispatcher_(NULL), 458 : dispatcher_(NULL),
(...skipping 21 matching lines...) Expand all
461 // ownership of the array. 480 // ownership of the array.
462 free(array_); 481 free(array_);
463 } 482 }
464 483
465 PP_Var** SerializedVarVectorOutParam::ArrayOutParam(Dispatcher* dispatcher) { 484 PP_Var** SerializedVarVectorOutParam::ArrayOutParam(Dispatcher* dispatcher) {
466 DCHECK(!dispatcher_); // Should only be called once. 485 DCHECK(!dispatcher_); // Should only be called once.
467 dispatcher_ = dispatcher; 486 dispatcher_ = dispatcher;
468 return &array_; 487 return &array_;
469 } 488 }
470 489
490 SerializedVarTestConstructor::SerializedVarTestConstructor(
491 const PP_Var& pod_var) {
492 DCHECK(pod_var.type != PP_VARTYPE_STRING);
493 inner_->SetVar(pod_var);
494 }
495
496 SerializedVarTestConstructor::SerializedVarTestConstructor(
497 const std::string& str) {
498 PP_Var string_var;
499 string_var.type = PP_VARTYPE_STRING;
500 string_var.value.as_id = 0;
501 inner_->SetVar(string_var);
502 *inner_->GetStringPtr() = str;
503 }
504
505 SerializedVarTestReader::SerializedVarTestReader(const SerializedVar& var)
506 : SerializedVar(var) {
507 }
508
471 } // namespace proxy 509 } // namespace proxy
472 } // namespace pp 510 } // namespace pp
473 511
OLDNEW
« no previous file with comments | « ppapi/proxy/serialized_var.h ('k') | ppapi/proxy/serialized_var_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698