Index: runtime/vm/debugger.cc |
=================================================================== |
--- runtime/vm/debugger.cc (revision 18152) |
+++ runtime/vm/debugger.cc (working copy) |
@@ -4,14 +4,18 @@ |
#include "vm/debugger.h" |
+#include <string> |
+ |
#include "include/dart_api.h" |
#include "vm/code_generator.h" |
#include "vm/code_patcher.h" |
#include "vm/compiler.h" |
+#include "vm/dart_api_impl.h" |
#include "vm/dart_entry.h" |
#include "vm/flags.h" |
#include "vm/globals.h" |
+#include "vm/isolate.h" |
#include "vm/longjump.h" |
#include "vm/object.h" |
#include "vm/object_store.h" |
@@ -1734,4 +1738,56 @@ |
code_breakpoints_ = bpt; |
} |
+ |
+// Global static pointer used to ensure a single instance of the class. |
+VmStatusService* VmStatusService::instance_ = NULL; |
+ |
+ |
+void VmStatusService::InitOnce() { |
+ VmStatusService::instance_ = new VmStatusService(); |
+ |
+ // Register built-in status plug-ins. RegisterPlugin is not used because |
+ // this isn't called within an isolate, and because parameter checking |
+ // isn't necessary. |
+ VmStatusService::instance_->service_map_["isolate"] = &Isolate::GetStatus; |
+ |
+ // TODO(tball): dynamically load any additional plug-ins. |
+} |
+ |
+ |
+Dart_Handle VmStatusService::RegisterPlugin( |
+ const char* status_type, Dart_VmStatusCallback callback) { |
siva
2013/02/11 19:14:55
Do you expect multiple threads to register plugins
|
+ if (status_type == NULL) { |
+ return Api::NewError("status_type not specified"); |
+ } |
+ if (callback == NULL) { |
+ return Api::NewError("callback not specified"); |
+ } |
+ VmStatusService::instance_->service_map_[status_type] = callback; |
+ return Api::True(Isolate::Current()); |
+} |
+ |
+ |
+char* VmStatusService::Dart_GetVmStatus(const char* request) { |
+ // Extract service type from beginning of string. |
+ char* start = const_cast<char*>(request); |
+ if (*start == '/') { |
+ start++; |
+ } |
+ size_t n = 0; |
+ while (*(start + n) != '\0' && *(start + n) != '/') { |
+ n++; |
+ } |
+ ASSERT(n != 0); |
+ char* status_type = strndup(start, n); |
+ ServiceMap* map = &VmStatusService::instance_->service_map_; |
+ ServiceMap::iterator itr = map->find(status_type); |
+ if (itr == map->end()) { |
+ return strdup(""); // No status available for this status type. |
+ } |
+ Dart_VmStatusCallback callback = itr->second; |
+ free(status_type); |
+ return (callback)(request); |
+} |
+ |
} // namespace dart |