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

Unified Diff: runtime/vm/service.cc

Issue 1132323002: Add Service ID zones to service protocol (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 5 years, 7 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « runtime/vm/service.h ('k') | runtime/vm/service/service.idl » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/service.cc
diff --git a/runtime/vm/service.cc b/runtime/vm/service.cc
index f17949f6a51ea77d23933e04b62fc7a82e94c6f7..ace6b6ac3a4675c2b7105764aac18e88f0359fb5 100644
--- a/runtime/vm/service.cc
+++ b/runtime/vm/service.cc
@@ -39,6 +39,35 @@ namespace dart {
DECLARE_FLAG(bool, trace_service);
DECLARE_FLAG(bool, trace_service_pause_events);
+ServiceIdZone::ServiceIdZone() {
+}
+
+
+ServiceIdZone::~ServiceIdZone() {
+}
+
+
+RingServiceIdZone::RingServiceIdZone(
+ ObjectIdRing* ring, ObjectIdRing::IdPolicy policy)
+ : ring_(ring),
+ policy_(policy) {
+ ASSERT(ring_ != NULL);
+}
+
+
+RingServiceIdZone::~RingServiceIdZone() {
+}
+
+
+char* RingServiceIdZone::GetServiceId(const Object& obj) {
+ Thread* thread = Thread::Current();
+ Zone* zone = thread->zone();
+ ASSERT(zone != NULL);
+ const intptr_t id = ring_->GetIdForObject(obj.raw(), policy_);
+ return zone->PrintToString("objects/%" Pd "", id);
+}
+
+
// TODO(johnmccutchan): Unify embedder service handler lists and their APIs.
EmbedderServiceHandler* Service::isolate_service_handler_head_ = NULL;
EmbedderServiceHandler* Service::root_service_handler_head_ = NULL;
@@ -450,6 +479,29 @@ void Service::InvokeMethod(Isolate* isolate, const Array& msg) {
js.Setup(zone.GetZone(), SendPort::Cast(reply_port).Id(),
seq, method_name, param_keys, param_values);
+ // RPC came in with a custom service id zone.
+ const char* id_zone_param = js.LookupParam("_idZone");
+
+ if (id_zone_param != NULL) {
+ // Override id zone.
+ if (strcmp("default", id_zone_param) == 0) {
+ // Ring with eager id allocation. This is the default ring and default
+ // policy.
+ // Nothing to do.
+ } else if (strcmp("default.reuse", id_zone_param) == 0) {
+ // Change the default ring's policy.
+ RingServiceIdZone* zone =
+ reinterpret_cast<RingServiceIdZone*>(js.id_zone());
+ zone->set_policy(ObjectIdRing::kReuseId);
+ } else {
+ // TODO(johnmccutchan): Support creating, deleting, and selecting
+ // custom service id zones.
+ // For now, always return an error.
+ PrintInvalidParamError(&js, "_idZone");
+ js.PostReply();
+ return;
+ }
+ }
const char* c_method_name = method_name.ToCString();
ServiceMethodDescriptor* method = FindMethod(c_method_name);
@@ -719,7 +771,7 @@ static bool GetIsolate(Isolate* isolate, JSONStream* js) {
static const MethodParameter* get_stack_params[] = {
ISOLATE_PARAMETER,
- new BoolParameter("full", false),
+ new BoolParameter("_full", false),
NULL,
};
@@ -728,7 +780,7 @@ static bool GetStack(Isolate* isolate, JSONStream* js) {
DebuggerStackTrace* stack = isolate->debugger()->StackTrace();
// Do we want the complete script object and complete local variable objects?
// This is true for dump requests.
- const bool full = BoolParameter::Parse(js->LookupParam("full"), false);
+ const bool full = BoolParameter::Parse(js->LookupParam("_full"), false);
JSONObject jsobj(js);
jsobj.AddProperty("type", "Stack");
{
@@ -784,14 +836,28 @@ void Service::SendEchoEvent(Isolate* isolate, const char* text) {
}
-static bool _TriggerEchoEvent(Isolate* isolate, JSONStream* js) {
+static bool TriggerEchoEvent(Isolate* isolate, JSONStream* js) {
Service::SendEchoEvent(isolate, js->LookupParam("text"));
JSONObject jsobj(js);
return HandleCommonEcho(&jsobj, js);
}
-static bool _Echo(Isolate* isolate, JSONStream* js) {
+static bool DumpIdZone(Isolate* isolate, JSONStream* js) {
+ // TODO(johnmccutchan): Respect _idZone parameter passed to RPC. For now,
+ // always send the ObjectIdRing.
+ //
+ ObjectIdRing* ring = isolate->object_id_ring();
+ ASSERT(ring != NULL);
+ // When printing the ObjectIdRing, force object id reuse policy.
+ RingServiceIdZone reuse_zone(ring, ObjectIdRing::kReuseId);
+ js->set_id_zone(&reuse_zone);
+ ring->PrintJSON(js);
+ return true;
+}
+
+
+static bool Echo(Isolate* isolate, JSONStream* js) {
JSONObject jsobj(js);
return HandleCommonEcho(&jsobj, js);
}
@@ -2318,7 +2384,7 @@ static bool GetObjectByAddress(Isolate* isolate, JSONStream* js) {
}
-static bool _RespondWithMalformedJson(Isolate* isolate,
+static bool RespondWithMalformedJson(Isolate* isolate,
JSONStream* js) {
JSONObject jsobj(js);
jsobj.AddProperty("a", "a");
@@ -2332,7 +2398,7 @@ static bool _RespondWithMalformedJson(Isolate* isolate,
}
-static bool _RespondWithMalformedObject(Isolate* isolate,
+static bool RespondWithMalformedObject(Isolate* isolate,
JSONStream* js) {
JSONObject jsobj(js);
jsobj.AddProperty("bart", "simpson");
@@ -2547,13 +2613,14 @@ static bool SetName(Isolate* isolate, JSONStream* js) {
static ServiceMethodDescriptor service_methods_[] = {
- { "_echo", _Echo,
+ { "_dumpIdZone", DumpIdZone, NULL },
+ { "_echo", Echo,
NULL },
- { "_respondWithMalformedJson", _RespondWithMalformedJson,
+ { "_respondWithMalformedJson", RespondWithMalformedJson,
NULL },
- { "_respondWithMalformedObject", _RespondWithMalformedObject,
+ { "_respondWithMalformedObject", RespondWithMalformedObject,
NULL },
- { "_triggerEchoEvent", _TriggerEchoEvent,
+ { "_triggerEchoEvent", TriggerEchoEvent,
NULL },
{ "addBreakpoint", AddBreakpoint,
add_breakpoint_params },
« no previous file with comments | « runtime/vm/service.h ('k') | runtime/vm/service/service.idl » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698