| Index: runtime/vm/service.cc
|
| diff --git a/runtime/vm/service.cc b/runtime/vm/service.cc
|
| index c8c42499159649e8ab8167b06b30b9d12934fea4..963b820b7faaead06a7d7bf2f8b6eaa60155aec6 100644
|
| --- a/runtime/vm/service.cc
|
| +++ b/runtime/vm/service.cc
|
| @@ -476,6 +476,36 @@ class UIntParameter : public MethodParameter {
|
| };
|
|
|
|
|
| +class Int64Parameter : public MethodParameter {
|
| + public:
|
| + Int64Parameter(const char* name, bool required)
|
| + : MethodParameter(name, required) {
|
| + }
|
| +
|
| + virtual bool Validate(const char* value) const {
|
| + if (value == NULL) {
|
| + return false;
|
| + }
|
| + for (const char* cp = value; *cp != '\0'; cp++) {
|
| + if ((*cp < '0' || *cp > '9') && (*cp != '-')) {
|
| + return false;
|
| + }
|
| + }
|
| + return true;
|
| + }
|
| +
|
| + static int64_t Parse(const char* value, int64_t default_value = -1) {
|
| + if ((value == NULL) || (*value == '\0')) {
|
| + return default_value;
|
| + }
|
| + char* end_ptr = NULL;
|
| + int64_t result = strtoll(value, &end_ptr, 10);
|
| + ASSERT(*end_ptr == '\0'); // Parsed full string
|
| + return result;
|
| + }
|
| +};
|
| +
|
| +
|
| class IdParameter : public MethodParameter {
|
| public:
|
| IdParameter(const char* name, bool required)
|
| @@ -2733,6 +2763,8 @@ static const MethodParameter* get_cpu_profile_params[] = {
|
| ISOLATE_PARAMETER,
|
| new EnumParameter("tags", true, tags_enum_names),
|
| new BoolParameter("_codeTransitionTags", false),
|
| + new Int64Parameter("timeOriginMicros", false),
|
| + new Int64Parameter("timeExtentMicros", false),
|
| NULL,
|
| };
|
|
|
| @@ -2745,7 +2777,15 @@ static bool GetCpuProfile(Thread* thread, JSONStream* js) {
|
| if (BoolParameter::Parse(js->LookupParam("_codeTransitionTags"))) {
|
| extra_tags |= ProfilerService::kCodeTransitionTagsBit;
|
| }
|
| - ProfilerService::PrintJSON(js, tag_order, extra_tags);
|
| + int64_t time_origin_micros =
|
| + Int64Parameter::Parse(js->LookupParam("timeOriginMicros"));
|
| + int64_t time_extent_micros =
|
| + Int64Parameter::Parse(js->LookupParam("timeExtentMicros"));
|
| + ProfilerService::PrintJSON(js,
|
| + tag_order,
|
| + extra_tags,
|
| + time_origin_micros,
|
| + time_extent_micros);
|
| return true;
|
| }
|
|
|
| @@ -2753,6 +2793,8 @@ static bool GetCpuProfile(Thread* thread, JSONStream* js) {
|
| static const MethodParameter* get_cpu_profile_timeline_params[] = {
|
| ISOLATE_PARAMETER,
|
| new EnumParameter("tags", true, tags_enum_names),
|
| + new Int64Parameter("timeOriginMicros", false),
|
| + new Int64Parameter("timeExtentMicros", false),
|
| NULL,
|
| };
|
|
|
| @@ -2760,7 +2802,14 @@ static const MethodParameter* get_cpu_profile_timeline_params[] = {
|
| static bool GetCpuProfileTimeline(Thread* thread, JSONStream* js) {
|
| Profile::TagOrder tag_order =
|
| EnumMapper(js->LookupParam("tags"), tags_enum_names, tags_enum_values);
|
| - ProfilerService::PrintTimelineJSON(js, tag_order);
|
| + int64_t time_origin_micros =
|
| + UIntParameter::Parse(js->LookupParam("timeOriginMicros"));
|
| + int64_t time_extent_micros =
|
| + UIntParameter::Parse(js->LookupParam("timeExtentMicros"));
|
| + ProfilerService::PrintTimelineJSON(js,
|
| + tag_order,
|
| + time_origin_micros,
|
| + time_extent_micros);
|
| return true;
|
| }
|
|
|
| @@ -2769,6 +2818,8 @@ static const MethodParameter* get_allocation_samples_params[] = {
|
| ISOLATE_PARAMETER,
|
| new EnumParameter("tags", true, tags_enum_names),
|
| new IdParameter("classId", false),
|
| + new Int64Parameter("timeOriginMicros", false),
|
| + new Int64Parameter("timeExtentMicros", false),
|
| NULL,
|
| };
|
|
|
| @@ -2776,13 +2827,21 @@ static const MethodParameter* get_allocation_samples_params[] = {
|
| static bool GetAllocationSamples(Thread* thread, JSONStream* js) {
|
| Profile::TagOrder tag_order =
|
| EnumMapper(js->LookupParam("tags"), tags_enum_names, tags_enum_values);
|
| + int64_t time_origin_micros =
|
| + Int64Parameter::Parse(js->LookupParam("timeOriginMicros"));
|
| + int64_t time_extent_micros =
|
| + Int64Parameter::Parse(js->LookupParam("timeExtentMicros"));
|
| const char* class_id = js->LookupParam("classId");
|
| intptr_t cid = -1;
|
| GetPrefixedIntegerId(class_id, "classes/", &cid);
|
| Isolate* isolate = thread->isolate();
|
| if (IsValidClassId(isolate, cid)) {
|
| const Class& cls = Class::Handle(GetClassForId(isolate, cid));
|
| - ProfilerService::PrintAllocationJSON(js, tag_order, cls);
|
| + ProfilerService::PrintAllocationJSON(js,
|
| + tag_order,
|
| + cls,
|
| + time_origin_micros,
|
| + time_extent_micros);
|
| } else {
|
| PrintInvalidParamError(js, "classId");
|
| }
|
|
|