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

Side by Side Diff: runtime/vm/service.cc

Issue 834233003: Fix for issue 21398 (only send "literal like" objects across isolates spawned using spawnURI (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 5 years, 11 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
OLDNEW
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #include "vm/service.h" 5 #include "vm/service.h"
6 6
7 #include "include/dart_api.h" 7 #include "include/dart_api.h"
8 #include "platform/globals.h" 8 #include "platform/globals.h"
9 9
10 #include "vm/compiler.h" 10 #include "vm/compiler.h"
(...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after
221 StackZone zone(isolate); 221 StackZone zone(isolate);
222 HANDLESCOPE(isolate); 222 HANDLESCOPE(isolate);
223 GET_NON_NULL_NATIVE_ARGUMENT(SendPort, sp, arguments->NativeArgAt(0)); 223 GET_NON_NULL_NATIVE_ARGUMENT(SendPort, sp, arguments->NativeArgAt(0));
224 GET_NON_NULL_NATIVE_ARGUMENT(Array, message, arguments->NativeArgAt(1)); 224 GET_NON_NULL_NATIVE_ARGUMENT(Array, message, arguments->NativeArgAt(1));
225 225
226 // Set the type of the OOB message. 226 // Set the type of the OOB message.
227 message.SetAt(0, Smi::Handle(isolate, Smi::New(Message::kServiceOOBMsg))); 227 message.SetAt(0, Smi::Handle(isolate, Smi::New(Message::kServiceOOBMsg)));
228 228
229 // Serialize message. 229 // Serialize message.
230 uint8_t* data = NULL; 230 uint8_t* data = NULL;
231 MessageWriter writer(&data, &allocator); 231 MessageWriter writer(&data, &allocator, false);
232 writer.WriteMessage(message); 232 writer.WriteMessage(message);
233 233
234 // TODO(turnidge): Throw an exception when the return value is false? 234 // TODO(turnidge): Throw an exception when the return value is false?
235 PortMap::PostMessage(new Message(sp.Id(), data, writer.BytesWritten(), 235 PortMap::PostMessage(new Message(sp.Id(), data, writer.BytesWritten(),
236 Message::kOOBPriority)); 236 Message::kOOBPriority));
237 } 237 }
238 238
239 239
240 static void SendRootServiceMessage(Dart_NativeArguments args) { 240 static void SendRootServiceMessage(Dart_NativeArguments args) {
241 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); 241 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args);
(...skipping 24 matching lines...) Expand all
266 #define VM_SERVICE_ISOLATE_STARTUP_MESSAGE_ID 1 266 #define VM_SERVICE_ISOLATE_STARTUP_MESSAGE_ID 1
267 #define VM_SERVICE_ISOLATE_SHUTDOWN_MESSAGE_ID 2 267 #define VM_SERVICE_ISOLATE_SHUTDOWN_MESSAGE_ID 2
268 268
269 269
270 static RawArray* MakeServiceControlMessage(Dart_Port port_id, intptr_t code, 270 static RawArray* MakeServiceControlMessage(Dart_Port port_id, intptr_t code,
271 const String& name) { 271 const String& name) {
272 const Array& list = Array::Handle(Array::New(4)); 272 const Array& list = Array::Handle(Array::New(4));
273 ASSERT(!list.IsNull()); 273 ASSERT(!list.IsNull());
274 const Integer& code_int = Integer::Handle(Integer::New(code)); 274 const Integer& code_int = Integer::Handle(Integer::New(code));
275 const Integer& port_int = Integer::Handle(Integer::New(port_id)); 275 const Integer& port_int = Integer::Handle(Integer::New(port_id));
276 const SendPort& send_port = SendPort::Handle(SendPort::New(port_id)); 276 const SendPort& send_port = SendPort::Handle(SendPort::New(port_id, false));
Ivan Posva 2015/01/12 05:50:04 false? Shouldn't the second parameter to a SendPor
siva 2015/01/12 21:41:13 Good point, left over from my previous version, ch
277 list.SetAt(0, code_int); 277 list.SetAt(0, code_int);
278 list.SetAt(1, port_int); 278 list.SetAt(1, port_int);
279 list.SetAt(2, send_port); 279 list.SetAt(2, send_port);
280 list.SetAt(3, name); 280 list.SetAt(3, name);
281 return list.raw(); 281 return list.raw();
282 } 282 }
283 283
284 284
285 class RegisterRunningIsolatesVisitor : public IsolateVisitor { 285 class RegisterRunningIsolatesVisitor : public IsolateVisitor {
286 public: 286 public:
(...skipping 20 matching lines...) Expand all
307 ASSERT(Isolate::Current() == service_isolate_); 307 ASSERT(Isolate::Current() == service_isolate_);
308 if ((isolate == service_isolate_) || 308 if ((isolate == service_isolate_) ||
309 (isolate == Dart::vm_isolate())) { 309 (isolate == Dart::vm_isolate())) {
310 // We do not register the service or vm isolate. 310 // We do not register the service or vm isolate.
311 return; 311 return;
312 } 312 }
313 // Setup arguments for call. 313 // Setup arguments for call.
314 Dart_Port port_id = isolate->main_port(); 314 Dart_Port port_id = isolate->main_port();
315 const Integer& port_int = Integer::Handle(Integer::New(port_id)); 315 const Integer& port_int = Integer::Handle(Integer::New(port_id));
316 ASSERT(!port_int.IsNull()); 316 ASSERT(!port_int.IsNull());
317 const SendPort& send_port = SendPort::Handle(SendPort::New(port_id)); 317 const SendPort& send_port = SendPort::Handle(SendPort::New(port_id, false));
Ivan Posva 2015/01/12 05:50:04 ditto
siva 2015/01/12 21:41:13 ditto.
318 const String& name = String::Handle(String::New(isolate->name())); 318 const String& name = String::Handle(String::New(isolate->name()));
319 ASSERT(!name.IsNull()); 319 ASSERT(!name.IsNull());
320 const Array& args = Array::Handle(Array::New(3)); 320 const Array& args = Array::Handle(Array::New(3));
321 ASSERT(!args.IsNull()); 321 ASSERT(!args.IsNull());
322 args.SetAt(0, port_int); 322 args.SetAt(0, port_int);
323 args.SetAt(1, send_port); 323 args.SetAt(1, send_port);
324 args.SetAt(2, name); 324 args.SetAt(2, name);
325 Object& r = Object::Handle(service_isolate_); 325 Object& r = Object::Handle(service_isolate_);
326 r = DartEntry::InvokeFunction(register_function_, args); 326 r = DartEntry::InvokeFunction(register_function_, args);
327 ASSERT(!r.IsError()); 327 ASSERT(!r.IsError());
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after
490 ASSERT(isolate != NULL); 490 ASSERT(isolate != NULL);
491 HANDLESCOPE(isolate); 491 HANDLESCOPE(isolate);
492 const String& name = String::Handle(String::New(isolate->name())); 492 const String& name = String::Handle(String::New(isolate->name()));
493 ASSERT(!name.IsNull()); 493 ASSERT(!name.IsNull());
494 const Array& list = Array::Handle( 494 const Array& list = Array::Handle(
495 MakeServiceControlMessage(Dart_GetMainPortId(), 495 MakeServiceControlMessage(Dart_GetMainPortId(),
496 VM_SERVICE_ISOLATE_STARTUP_MESSAGE_ID, 496 VM_SERVICE_ISOLATE_STARTUP_MESSAGE_ID,
497 name)); 497 name));
498 ASSERT(!list.IsNull()); 498 ASSERT(!list.IsNull());
499 uint8_t* data = NULL; 499 uint8_t* data = NULL;
500 MessageWriter writer(&data, &allocator); 500 MessageWriter writer(&data, &allocator, false);
501 writer.WriteMessage(list); 501 writer.WriteMessage(list);
502 intptr_t len = writer.BytesWritten(); 502 intptr_t len = writer.BytesWritten();
503 if (FLAG_trace_service) { 503 if (FLAG_trace_service) {
504 OS::Print("Isolate %s %" Pd64 " registered with service \n", 504 OS::Print("Isolate %s %" Pd64 " registered with service \n",
505 name.ToCString(), 505 name.ToCString(),
506 Dart_GetMainPortId()); 506 Dart_GetMainPortId());
507 } 507 }
508 return PortMap::PostMessage( 508 return PortMap::PostMessage(
509 new Message(port_, data, len, Message::kNormalPriority)); 509 new Message(port_, data, len, Message::kNormalPriority));
510 } 510 }
511 511
512 512
513 bool Service::SendIsolateShutdownMessage() { 513 bool Service::SendIsolateShutdownMessage() {
514 if (!IsRunning()) { 514 if (!IsRunning()) {
515 return false; 515 return false;
516 } 516 }
517 Isolate* isolate = Isolate::Current(); 517 Isolate* isolate = Isolate::Current();
518 ASSERT(isolate != NULL); 518 ASSERT(isolate != NULL);
519 HANDLESCOPE(isolate); 519 HANDLESCOPE(isolate);
520 const String& name = String::Handle(String::New(isolate->name())); 520 const String& name = String::Handle(String::New(isolate->name()));
521 ASSERT(!name.IsNull()); 521 ASSERT(!name.IsNull());
522 const Array& list = Array::Handle( 522 const Array& list = Array::Handle(
523 MakeServiceControlMessage(Dart_GetMainPortId(), 523 MakeServiceControlMessage(Dart_GetMainPortId(),
524 VM_SERVICE_ISOLATE_SHUTDOWN_MESSAGE_ID, 524 VM_SERVICE_ISOLATE_SHUTDOWN_MESSAGE_ID,
525 name)); 525 name));
526 ASSERT(!list.IsNull()); 526 ASSERT(!list.IsNull());
527 uint8_t* data = NULL; 527 uint8_t* data = NULL;
528 MessageWriter writer(&data, &allocator); 528 MessageWriter writer(&data, &allocator, false);
529 writer.WriteMessage(list); 529 writer.WriteMessage(list);
530 intptr_t len = writer.BytesWritten(); 530 intptr_t len = writer.BytesWritten();
531 if (FLAG_trace_service) { 531 if (FLAG_trace_service) {
532 OS::Print("Isolate %s %" Pd64 " deregistered with service \n", 532 OS::Print("Isolate %s %" Pd64 " deregistered with service \n",
533 name.ToCString(), 533 name.ToCString(),
534 Dart_GetMainPortId()); 534 Dart_GetMainPortId());
535 } 535 }
536 return PortMap::PostMessage( 536 return PortMap::PostMessage(
537 new Message(port_, data, len, Message::kNormalPriority)); 537 new Message(port_, data, len, Message::kNormalPriority));
538 } 538 }
(...skipping 2087 matching lines...) Expand 10 before | Expand all | Expand 10 after
2626 HANDLESCOPE(isolate); 2626 HANDLESCOPE(isolate);
2627 2627
2628 // Construct a list of the form [eventId, eventMessage]. 2628 // Construct a list of the form [eventId, eventMessage].
2629 const Array& list = Array::Handle(Array::New(2)); 2629 const Array& list = Array::Handle(Array::New(2));
2630 ASSERT(!list.IsNull()); 2630 ASSERT(!list.IsNull());
2631 list.SetAt(0, Integer::Handle(Integer::New(eventId))); 2631 list.SetAt(0, Integer::Handle(Integer::New(eventId)));
2632 list.SetAt(1, eventMessage); 2632 list.SetAt(1, eventMessage);
2633 2633
2634 // Push the event to port_. 2634 // Push the event to port_.
2635 uint8_t* data = NULL; 2635 uint8_t* data = NULL;
2636 MessageWriter writer(&data, &allocator); 2636 MessageWriter writer(&data, &allocator, false);
2637 writer.WriteMessage(list); 2637 writer.WriteMessage(list);
2638 intptr_t len = writer.BytesWritten(); 2638 intptr_t len = writer.BytesWritten();
2639 if (FLAG_trace_service) { 2639 if (FLAG_trace_service) {
2640 OS::Print("Pushing event of type %" Pd ", len %" Pd "\n", eventId, len); 2640 OS::Print("Pushing event of type %" Pd ", len %" Pd "\n", eventId, len);
2641 } 2641 }
2642 // TODO(turnidge): For now we ignore failure to send an event. Revisit? 2642 // TODO(turnidge): For now we ignore failure to send an event. Revisit?
2643 PortMap::PostMessage( 2643 PortMap::PostMessage(
2644 new Message(port_, data, len, Message::kNormalPriority)); 2644 new Message(port_, data, len, Message::kNormalPriority));
2645 } 2645 }
2646 2646
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after
2780 while (current != NULL) { 2780 while (current != NULL) {
2781 if (strcmp(name, current->name()) == 0) { 2781 if (strcmp(name, current->name()) == 0) {
2782 return current; 2782 return current;
2783 } 2783 }
2784 current = current->next(); 2784 current = current->next();
2785 } 2785 }
2786 return NULL; 2786 return NULL;
2787 } 2787 }
2788 2788
2789 } // namespace dart 2789 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/raw_object_snapshot.cc ('k') | runtime/vm/snapshot.h » ('j') | runtime/vm/snapshot.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698