OLD | NEW |
---|---|
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #include "vm/service.h" | 5 #include "vm/service.h" |
6 | 6 |
7 #include "include/dart_api.h" | 7 #include "include/dart_api.h" |
8 #include "include/dart_native_api.h" | 8 #include "include/dart_native_api.h" |
9 #include "platform/globals.h" | 9 #include "platform/globals.h" |
10 | 10 |
(...skipping 458 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
469 return -1; | 469 return -1; |
470 } | 470 } |
471 char* end_ptr = NULL; | 471 char* end_ptr = NULL; |
472 uintptr_t result = strtoul(value, &end_ptr, 10); | 472 uintptr_t result = strtoul(value, &end_ptr, 10); |
473 ASSERT(*end_ptr == '\0'); // Parsed full string | 473 ASSERT(*end_ptr == '\0'); // Parsed full string |
474 return result; | 474 return result; |
475 } | 475 } |
476 }; | 476 }; |
477 | 477 |
478 | 478 |
479 class Int64Parameter : public MethodParameter { | |
480 public: | |
481 Int64Parameter(const char* name, bool required) | |
482 : MethodParameter(name, required) { | |
483 } | |
484 | |
485 virtual bool Validate(const char* value) const { | |
486 if (value == NULL) { | |
487 return false; | |
488 } | |
489 for (const char* cp = value; *cp != '\0'; cp++) { | |
490 if ((*cp < '0' || *cp > '9') && (*cp != '-')) { | |
491 return false; | |
492 } | |
493 } | |
494 return true; | |
495 } | |
496 | |
497 static int64_t Parse(const char* value, int64_t default_value = -1) { | |
498 if (value == NULL) { | |
499 return default_value; | |
500 } | |
siva
2015/12/21 20:43:28
if (*value == '\0') should we also return the defa
Cutch
2015/12/21 22:07:38
Done.
| |
501 char* end_ptr = NULL; | |
502 int64_t result = strtoll(value, &end_ptr, 10); | |
503 ASSERT(*end_ptr == '\0'); // Parsed full string | |
504 return result; | |
505 } | |
506 }; | |
507 | |
508 | |
479 class IdParameter : public MethodParameter { | 509 class IdParameter : public MethodParameter { |
480 public: | 510 public: |
481 IdParameter(const char* name, bool required) | 511 IdParameter(const char* name, bool required) |
482 : MethodParameter(name, required) { | 512 : MethodParameter(name, required) { |
483 } | 513 } |
484 | 514 |
485 virtual bool Validate(const char* value) const { | 515 virtual bool Validate(const char* value) const { |
486 return (value != NULL); | 516 return (value != NULL); |
487 } | 517 } |
488 }; | 518 }; |
(...skipping 2237 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2726 Profile::kVMUser, | 2756 Profile::kVMUser, |
2727 Profile::kVM, | 2757 Profile::kVM, |
2728 Profile::kNoTags, // Default value. | 2758 Profile::kNoTags, // Default value. |
2729 }; | 2759 }; |
2730 | 2760 |
2731 | 2761 |
2732 static const MethodParameter* get_cpu_profile_params[] = { | 2762 static const MethodParameter* get_cpu_profile_params[] = { |
2733 ISOLATE_PARAMETER, | 2763 ISOLATE_PARAMETER, |
2734 new EnumParameter("tags", true, tags_enum_names), | 2764 new EnumParameter("tags", true, tags_enum_names), |
2735 new BoolParameter("_codeTransitionTags", false), | 2765 new BoolParameter("_codeTransitionTags", false), |
2766 new Int64Parameter("timeOriginMicros", false), | |
2767 new Int64Parameter("timeExtentMicros", false), | |
2736 NULL, | 2768 NULL, |
2737 }; | 2769 }; |
2738 | 2770 |
2739 | 2771 |
2740 // TODO(johnmccutchan): Rename this to GetCpuSamples. | 2772 // TODO(johnmccutchan): Rename this to GetCpuSamples. |
2741 static bool GetCpuProfile(Thread* thread, JSONStream* js) { | 2773 static bool GetCpuProfile(Thread* thread, JSONStream* js) { |
2742 Profile::TagOrder tag_order = | 2774 Profile::TagOrder tag_order = |
2743 EnumMapper(js->LookupParam("tags"), tags_enum_names, tags_enum_values); | 2775 EnumMapper(js->LookupParam("tags"), tags_enum_names, tags_enum_values); |
2744 intptr_t extra_tags = 0; | 2776 intptr_t extra_tags = 0; |
2745 if (BoolParameter::Parse(js->LookupParam("_codeTransitionTags"))) { | 2777 if (BoolParameter::Parse(js->LookupParam("_codeTransitionTags"))) { |
2746 extra_tags |= ProfilerService::kCodeTransitionTagsBit; | 2778 extra_tags |= ProfilerService::kCodeTransitionTagsBit; |
2747 } | 2779 } |
2748 ProfilerService::PrintJSON(js, tag_order, extra_tags); | 2780 int64_t time_origin_micros = |
2781 Int64Parameter::Parse(js->LookupParam("timeOriginMicros")); | |
2782 int64_t time_extent_micros = | |
2783 Int64Parameter::Parse(js->LookupParam("timeExtentMicros")); | |
2784 ProfilerService::PrintJSON(js, | |
2785 tag_order, | |
2786 extra_tags, | |
2787 time_origin_micros, | |
2788 time_extent_micros); | |
2749 return true; | 2789 return true; |
2750 } | 2790 } |
2751 | 2791 |
2752 | 2792 |
2753 static const MethodParameter* get_cpu_profile_timeline_params[] = { | 2793 static const MethodParameter* get_cpu_profile_timeline_params[] = { |
2754 ISOLATE_PARAMETER, | 2794 ISOLATE_PARAMETER, |
2755 new EnumParameter("tags", true, tags_enum_names), | 2795 new EnumParameter("tags", true, tags_enum_names), |
2796 new Int64Parameter("timeOriginMicros", false), | |
2797 new Int64Parameter("timeExtentMicros", false), | |
2756 NULL, | 2798 NULL, |
2757 }; | 2799 }; |
2758 | 2800 |
2759 | 2801 |
2760 static bool GetCpuProfileTimeline(Thread* thread, JSONStream* js) { | 2802 static bool GetCpuProfileTimeline(Thread* thread, JSONStream* js) { |
2761 Profile::TagOrder tag_order = | 2803 Profile::TagOrder tag_order = |
2762 EnumMapper(js->LookupParam("tags"), tags_enum_names, tags_enum_values); | 2804 EnumMapper(js->LookupParam("tags"), tags_enum_names, tags_enum_values); |
2763 ProfilerService::PrintTimelineJSON(js, tag_order); | 2805 int64_t time_origin_micros = |
2806 UIntParameter::Parse(js->LookupParam("timeOriginMicros")); | |
2807 int64_t time_extent_micros = | |
2808 UIntParameter::Parse(js->LookupParam("timeExtentMicros")); | |
2809 ProfilerService::PrintTimelineJSON(js, | |
2810 tag_order, | |
2811 time_origin_micros, | |
2812 time_extent_micros); | |
2764 return true; | 2813 return true; |
2765 } | 2814 } |
2766 | 2815 |
2767 | 2816 |
2768 static const MethodParameter* get_allocation_samples_params[] = { | 2817 static const MethodParameter* get_allocation_samples_params[] = { |
2769 ISOLATE_PARAMETER, | 2818 ISOLATE_PARAMETER, |
2770 new EnumParameter("tags", true, tags_enum_names), | 2819 new EnumParameter("tags", true, tags_enum_names), |
2771 new IdParameter("classId", false), | 2820 new IdParameter("classId", false), |
2821 new Int64Parameter("timeOriginMicros", false), | |
2822 new Int64Parameter("timeExtentMicros", false), | |
2772 NULL, | 2823 NULL, |
2773 }; | 2824 }; |
2774 | 2825 |
2775 | 2826 |
2776 static bool GetAllocationSamples(Thread* thread, JSONStream* js) { | 2827 static bool GetAllocationSamples(Thread* thread, JSONStream* js) { |
2777 Profile::TagOrder tag_order = | 2828 Profile::TagOrder tag_order = |
2778 EnumMapper(js->LookupParam("tags"), tags_enum_names, tags_enum_values); | 2829 EnumMapper(js->LookupParam("tags"), tags_enum_names, tags_enum_values); |
2830 int64_t time_origin_micros = | |
2831 Int64Parameter::Parse(js->LookupParam("timeOriginMicros")); | |
2832 int64_t time_extent_micros = | |
2833 Int64Parameter::Parse(js->LookupParam("timeExtentMicros")); | |
2779 const char* class_id = js->LookupParam("classId"); | 2834 const char* class_id = js->LookupParam("classId"); |
2780 intptr_t cid = -1; | 2835 intptr_t cid = -1; |
2781 GetPrefixedIntegerId(class_id, "classes/", &cid); | 2836 GetPrefixedIntegerId(class_id, "classes/", &cid); |
2782 Isolate* isolate = thread->isolate(); | 2837 Isolate* isolate = thread->isolate(); |
2783 if (IsValidClassId(isolate, cid)) { | 2838 if (IsValidClassId(isolate, cid)) { |
2784 const Class& cls = Class::Handle(GetClassForId(isolate, cid)); | 2839 const Class& cls = Class::Handle(GetClassForId(isolate, cid)); |
2785 ProfilerService::PrintAllocationJSON(js, tag_order, cls); | 2840 ProfilerService::PrintAllocationJSON(js, |
2841 tag_order, | |
2842 cls, | |
2843 time_origin_micros, | |
2844 time_extent_micros); | |
2786 } else { | 2845 } else { |
2787 PrintInvalidParamError(js, "classId"); | 2846 PrintInvalidParamError(js, "classId"); |
2788 } | 2847 } |
2789 return true; | 2848 return true; |
2790 } | 2849 } |
2791 | 2850 |
2792 | 2851 |
2793 static const MethodParameter* clear_cpu_profile_params[] = { | 2852 static const MethodParameter* clear_cpu_profile_params[] = { |
2794 ISOLATE_PARAMETER, | 2853 ISOLATE_PARAMETER, |
2795 NULL, | 2854 NULL, |
(...skipping 799 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3595 const ServiceMethodDescriptor& method = service_methods_[i]; | 3654 const ServiceMethodDescriptor& method = service_methods_[i]; |
3596 if (strcmp(method_name, method.name) == 0) { | 3655 if (strcmp(method_name, method.name) == 0) { |
3597 return &method; | 3656 return &method; |
3598 } | 3657 } |
3599 } | 3658 } |
3600 return NULL; | 3659 return NULL; |
3601 } | 3660 } |
3602 | 3661 |
3603 | 3662 |
3604 } // namespace dart | 3663 } // namespace dart |
OLD | NEW |