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

Unified Diff: runtime/vm/service.cc

Issue 100103011: Changes to support dprof and Observatory profiler UIs (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 7 years 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
Index: runtime/vm/service.cc
diff --git a/runtime/vm/service.cc b/runtime/vm/service.cc
index cff1f2819d34e85f5dbb8a2a6533170a449116f1..2b73cc65473719d0db599f00264e7c30e0b7eda1 100644
--- a/runtime/vm/service.cc
+++ b/runtime/vm/service.cc
@@ -14,6 +14,7 @@
#include "vm/object_id_ring.h"
#include "vm/object_store.h"
#include "vm/port.h"
+#include "vm/profiler.h"
namespace dart {
@@ -251,7 +252,7 @@ static void HandleEcho(Isolate* isolate, JSONStream* js) {
}
-static bool GetIntegerId(const char* s, intptr_t* id) {
+static bool GetIntegerId(const char* s, intptr_t* id, int base = 10) {
if ((s == NULL) || (*s == '\0')) {
// Empty string.
return false;
@@ -262,7 +263,28 @@ static bool GetIntegerId(const char* s, intptr_t* id) {
}
intptr_t r = 0;
char* end_ptr = NULL;
- r = strtol(s, &end_ptr, 10);
+ r = strtol(s, &end_ptr, base);
+ if (end_ptr == s) {
+ // String was not advanced at all, cannot be valid.
+ return false;
+ }
+ *id = r;
+ return true;
+}
+
+
+static bool GetUnsignedIntegerId(const char* s, uintptr_t* id, int base = 10) {
+ if ((s == NULL) || (*s == '\0')) {
+ // Empty string.
+ return false;
+ }
+ if (id == NULL) {
+ // No id pointer.
+ return false;
+ }
+ uintptr_t r = 0;
+ char* end_ptr = NULL;
+ r = strtoul(s, &end_ptr, base);
if (end_ptr == s) {
// String was not advanced at all, cannot be valid.
return false;
@@ -521,9 +543,31 @@ static void HandleCpu(Isolate* isolate, JSONStream* js) {
}
+static void HandleCode(Isolate* isolate, JSONStream* js) {
+ REQUIRE_COLLECTION_ID("code");
+ uintptr_t pc;
+ if (!GetUnsignedIntegerId(js->GetArgument(1), &pc, 16)) {
+ PrintError(js, "Must specify code address: code/c0deadd0.");
+ return;
+ }
+ Code& code = Code::Handle(Code::LookupCode(pc));
+ if (code.IsNull()) {
+ PrintError(js, "Could not find code at %" Px "", pc);
+ return;
+ }
+ code.PrintToJSONStream(js, false);
+}
+
+
+static void HandleProfile(Isolate* isolate, JSONStream* js) {
+ Profiler::PrintToJSONStream(isolate, js);
+}
+
+
static ServiceMessageHandlerEntry __message_handlers[] = {
{ "_echo", HandleEcho },
{ "classes", HandleClasses },
+ { "code", HandleCode },
{ "cpu", HandleCpu },
{ "debug", HandleDebug },
{ "libraries", HandleLibraries },
@@ -531,6 +575,7 @@ static ServiceMessageHandlerEntry __message_handlers[] = {
{ "name", HandleName },
{ "objecthistogram", HandleObjectHistogram},
{ "objects", HandleObjects },
+ { "profile", HandleProfile },
Ivan Posva 2013/12/30 23:06:09 We will want to separate profile from profile tick
{ "scripts", HandleScripts },
{ "stacktrace", HandleStackTrace },
};

Powered by Google App Engine
This is Rietveld 408576698