Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/v8.h" | 5 #include "src/v8.h" |
| 6 | 6 |
| 7 #include "src/heap-snapshot-generator-inl.h" | 7 #include "src/heap-snapshot-generator-inl.h" |
| 8 | 8 |
| 9 #include "src/allocation-tracker.h" | 9 #include "src/allocation-tracker.h" |
| 10 #include "src/code-stubs.h" | 10 #include "src/code-stubs.h" |
| (...skipping 2725 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2736 | 2736 |
| 2737 writer_->AddString("\"trace_function_infos\":["); | 2737 writer_->AddString("\"trace_function_infos\":["); |
| 2738 SerializeTraceNodeInfos(); | 2738 SerializeTraceNodeInfos(); |
| 2739 if (writer_->aborted()) return; | 2739 if (writer_->aborted()) return; |
| 2740 writer_->AddString("],\n"); | 2740 writer_->AddString("],\n"); |
| 2741 writer_->AddString("\"trace_tree\":["); | 2741 writer_->AddString("\"trace_tree\":["); |
| 2742 SerializeTraceTree(); | 2742 SerializeTraceTree(); |
| 2743 if (writer_->aborted()) return; | 2743 if (writer_->aborted()) return; |
| 2744 writer_->AddString("],\n"); | 2744 writer_->AddString("],\n"); |
| 2745 | 2745 |
| 2746 writer_->AddString("\"samples\":["); | |
| 2747 SerializeSamples(); | |
| 2748 if (writer_->aborted()) return; | |
| 2749 writer_->AddString("],\n"); | |
| 2750 | |
| 2746 writer_->AddString("\"strings\":["); | 2751 writer_->AddString("\"strings\":["); |
| 2747 SerializeStrings(); | 2752 SerializeStrings(); |
| 2748 if (writer_->aborted()) return; | 2753 if (writer_->aborted()) return; |
| 2749 writer_->AddCharacter(']'); | 2754 writer_->AddCharacter(']'); |
| 2750 writer_->AddCharacter('}'); | 2755 writer_->AddCharacter('}'); |
| 2751 writer_->Finalize(); | 2756 writer_->Finalize(); |
| 2752 } | 2757 } |
| 2753 | 2758 |
| 2754 | 2759 |
| 2755 int HeapSnapshotJSONSerializer::GetStringId(const char* s) { | 2760 int HeapSnapshotJSONSerializer::GetStringId(const char* s) { |
| (...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2932 JSON_S("name") "," | 2937 JSON_S("name") "," |
| 2933 JSON_S("script_name") "," | 2938 JSON_S("script_name") "," |
| 2934 JSON_S("script_id") "," | 2939 JSON_S("script_id") "," |
| 2935 JSON_S("line") "," | 2940 JSON_S("line") "," |
| 2936 JSON_S("column")) "," | 2941 JSON_S("column")) "," |
| 2937 JSON_S("trace_node_fields") ":" JSON_A( | 2942 JSON_S("trace_node_fields") ":" JSON_A( |
| 2938 JSON_S("id") "," | 2943 JSON_S("id") "," |
| 2939 JSON_S("function_info_index") "," | 2944 JSON_S("function_info_index") "," |
| 2940 JSON_S("count") "," | 2945 JSON_S("count") "," |
| 2941 JSON_S("size") "," | 2946 JSON_S("size") "," |
| 2942 JSON_S("children")))); | 2947 JSON_S("children")) "," |
| 2948 JSON_S("sample_fields") ":" JSON_A( | |
| 2949 JSON_S("timstamp_ms") "," | |
|
alph
2015/03/19 20:43:53
_usec or just timestamp?
yurys
2015/03/20 08:30:41
Done.
| |
| 2950 JSON_S("next_object_id")))); | |
| 2943 #undef JSON_S | 2951 #undef JSON_S |
| 2944 #undef JSON_O | 2952 #undef JSON_O |
| 2945 #undef JSON_A | 2953 #undef JSON_A |
| 2946 writer_->AddString(",\"node_count\":"); | 2954 writer_->AddString(",\"node_count\":"); |
| 2947 writer_->AddNumber(snapshot_->entries().length()); | 2955 writer_->AddNumber(snapshot_->entries().length()); |
| 2948 writer_->AddString(",\"edge_count\":"); | 2956 writer_->AddString(",\"edge_count\":"); |
| 2949 writer_->AddNumber(snapshot_->edges().length()); | 2957 writer_->AddNumber(snapshot_->edges().length()); |
| 2950 writer_->AddString(",\"trace_function_count\":"); | 2958 writer_->AddString(",\"trace_function_count\":"); |
| 2951 uint32_t count = 0; | 2959 uint32_t count = 0; |
| 2952 AllocationTracker* tracker = snapshot_->profiler()->allocation_tracker(); | 2960 AllocationTracker* tracker = snapshot_->profiler()->allocation_tracker(); |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3021 void HeapSnapshotJSONSerializer::SerializeTraceNodeInfos() { | 3029 void HeapSnapshotJSONSerializer::SerializeTraceNodeInfos() { |
| 3022 AllocationTracker* tracker = snapshot_->profiler()->allocation_tracker(); | 3030 AllocationTracker* tracker = snapshot_->profiler()->allocation_tracker(); |
| 3023 if (!tracker) return; | 3031 if (!tracker) return; |
| 3024 // The buffer needs space for 6 unsigned ints, 6 commas, \n and \0 | 3032 // The buffer needs space for 6 unsigned ints, 6 commas, \n and \0 |
| 3025 const int kBufferSize = | 3033 const int kBufferSize = |
| 3026 6 * MaxDecimalDigitsIn<sizeof(unsigned)>::kUnsigned // NOLINT | 3034 6 * MaxDecimalDigitsIn<sizeof(unsigned)>::kUnsigned // NOLINT |
| 3027 + 6 + 1 + 1; | 3035 + 6 + 1 + 1; |
| 3028 EmbeddedVector<char, kBufferSize> buffer; | 3036 EmbeddedVector<char, kBufferSize> buffer; |
| 3029 const List<AllocationTracker::FunctionInfo*>& list = | 3037 const List<AllocationTracker::FunctionInfo*>& list = |
| 3030 tracker->function_info_list(); | 3038 tracker->function_info_list(); |
| 3031 bool first_entry = true; | |
| 3032 for (int i = 0; i < list.length(); i++) { | 3039 for (int i = 0; i < list.length(); i++) { |
| 3033 AllocationTracker::FunctionInfo* info = list[i]; | 3040 AllocationTracker::FunctionInfo* info = list[i]; |
| 3034 int buffer_pos = 0; | 3041 int buffer_pos = 0; |
| 3035 if (first_entry) { | 3042 if (i > 0) { |
| 3036 first_entry = false; | |
| 3037 } else { | |
| 3038 buffer[buffer_pos++] = ','; | 3043 buffer[buffer_pos++] = ','; |
| 3039 } | 3044 } |
| 3040 buffer_pos = utoa(info->function_id, buffer, buffer_pos); | 3045 buffer_pos = utoa(info->function_id, buffer, buffer_pos); |
| 3041 buffer[buffer_pos++] = ','; | 3046 buffer[buffer_pos++] = ','; |
| 3042 buffer_pos = utoa(GetStringId(info->name), buffer, buffer_pos); | 3047 buffer_pos = utoa(GetStringId(info->name), buffer, buffer_pos); |
| 3043 buffer[buffer_pos++] = ','; | 3048 buffer[buffer_pos++] = ','; |
| 3044 buffer_pos = utoa(GetStringId(info->script_name), buffer, buffer_pos); | 3049 buffer_pos = utoa(GetStringId(info->script_name), buffer, buffer_pos); |
| 3045 buffer[buffer_pos++] = ','; | 3050 buffer[buffer_pos++] = ','; |
| 3046 // The cast is safe because script id is a non-negative Smi. | 3051 // The cast is safe because script id is a non-negative Smi. |
| 3047 buffer_pos = utoa(static_cast<unsigned>(info->script_id), buffer, | 3052 buffer_pos = utoa(static_cast<unsigned>(info->script_id), buffer, |
| 3048 buffer_pos); | 3053 buffer_pos); |
| 3049 buffer[buffer_pos++] = ','; | 3054 buffer[buffer_pos++] = ','; |
| 3050 buffer_pos = SerializePosition(info->line, buffer, buffer_pos); | 3055 buffer_pos = SerializePosition(info->line, buffer, buffer_pos); |
| 3051 buffer[buffer_pos++] = ','; | 3056 buffer[buffer_pos++] = ','; |
| 3052 buffer_pos = SerializePosition(info->column, buffer, buffer_pos); | 3057 buffer_pos = SerializePosition(info->column, buffer, buffer_pos); |
| 3053 buffer[buffer_pos++] = '\n'; | 3058 buffer[buffer_pos++] = '\n'; |
| 3054 buffer[buffer_pos++] = '\0'; | 3059 buffer[buffer_pos++] = '\0'; |
| 3055 writer_->AddString(buffer.start()); | 3060 writer_->AddString(buffer.start()); |
| 3056 } | 3061 } |
| 3057 } | 3062 } |
| 3058 | 3063 |
| 3059 | 3064 |
| 3065 void HeapSnapshotJSONSerializer::SerializeSamples() { | |
| 3066 const List<HeapObjectsMap::TimeInterval>& samples = | |
| 3067 snapshot_->profiler()->heap_object_map()->samples(); | |
| 3068 if (samples.is_empty()) return; | |
| 3069 base::TimeTicks start_time = samples[0].timestamp; | |
| 3070 // The buffer needs space for 2 unsigned ints, 2 commas, \n and \0 | |
| 3071 const int kBufferSize = MaxDecimalDigitsIn<sizeof( | |
| 3072 base::TimeDelta().InMicroseconds())>::kUnsigned + | |
| 3073 MaxDecimalDigitsIn<sizeof(samples[0].id)>::kUnsigned + | |
| 3074 2 + 1 + 1; | |
| 3075 EmbeddedVector<char, kBufferSize> buffer; | |
| 3076 for (int i = 0; i < samples.length(); i++) { | |
| 3077 HeapObjectsMap::TimeInterval& sample = samples[i]; | |
| 3078 int buffer_pos = 0; | |
| 3079 if (i > 0) { | |
| 3080 buffer[buffer_pos++] = ','; | |
| 3081 } | |
| 3082 base::TimeDelta time_delta = sample.timestamp - start_time; | |
| 3083 buffer_pos = utoa(time_delta.InMicroseconds(), buffer, buffer_pos); | |
| 3084 buffer[buffer_pos++] = ','; | |
| 3085 buffer_pos = utoa(sample.id, buffer, buffer_pos); | |
| 3086 buffer[buffer_pos++] = '\n'; | |
| 3087 buffer[buffer_pos++] = '\0'; | |
| 3088 writer_->AddString(buffer.start()); | |
| 3089 } | |
| 3090 } | |
| 3091 | |
| 3092 | |
| 3060 void HeapSnapshotJSONSerializer::SerializeString(const unsigned char* s) { | 3093 void HeapSnapshotJSONSerializer::SerializeString(const unsigned char* s) { |
| 3061 writer_->AddCharacter('\n'); | 3094 writer_->AddCharacter('\n'); |
| 3062 writer_->AddCharacter('\"'); | 3095 writer_->AddCharacter('\"'); |
| 3063 for ( ; *s != '\0'; ++s) { | 3096 for ( ; *s != '\0'; ++s) { |
| 3064 switch (*s) { | 3097 switch (*s) { |
| 3065 case '\b': | 3098 case '\b': |
| 3066 writer_->AddString("\\b"); | 3099 writer_->AddString("\\b"); |
| 3067 continue; | 3100 continue; |
| 3068 case '\f': | 3101 case '\f': |
| 3069 writer_->AddString("\\f"); | 3102 writer_->AddString("\\f"); |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3119 writer_->AddString("\"<dummy>\""); | 3152 writer_->AddString("\"<dummy>\""); |
| 3120 for (int i = 1; i < sorted_strings.length(); ++i) { | 3153 for (int i = 1; i < sorted_strings.length(); ++i) { |
| 3121 writer_->AddCharacter(','); | 3154 writer_->AddCharacter(','); |
| 3122 SerializeString(sorted_strings[i]); | 3155 SerializeString(sorted_strings[i]); |
| 3123 if (writer_->aborted()) return; | 3156 if (writer_->aborted()) return; |
| 3124 } | 3157 } |
| 3125 } | 3158 } |
| 3126 | 3159 |
| 3127 | 3160 |
| 3128 } } // namespace v8::internal | 3161 } } // namespace v8::internal |
| OLD | NEW |