Chromium Code Reviews| Index: runtime/vm/service.cc |
| diff --git a/runtime/vm/service.cc b/runtime/vm/service.cc |
| index c8c42499159649e8ab8167b06b30b9d12934fea4..b804a127dadee84cf426a4bf4109bf5a0cbb6cc2 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) { |
| + return default_value; |
| + } |
|
siva
2015/12/21 20:43:28
if (*value == '\0') should we also return the defa
Cutch
2015/12/21 22:07:38
Done.
|
| + 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"); |
| } |