Index: runtime/vm/profiler_service.h |
diff --git a/runtime/vm/profiler_service.h b/runtime/vm/profiler_service.h |
index d9205b3b7a1ee851107a8f1778c3f4e0d1de36b1..ab7f72ba09294621232f0e6da69354813280d002 100644 |
--- a/runtime/vm/profiler_service.h |
+++ b/runtime/vm/profiler_service.h |
@@ -9,6 +9,7 @@ |
#include "vm/code_observers.h" |
#include "vm/globals.h" |
#include "vm/growable_array.h" |
+#include "vm/hash_map.h" |
#include "vm/object.h" |
#include "vm/tags.h" |
#include "vm/thread_interrupter.h" |
@@ -29,8 +30,30 @@ class ProfileCodeTable; |
class RawCode; |
class RawFunction; |
class SampleFilter; |
+class ProcessedSample; |
class ProcessedSampleBuffer; |
+class AllocationKeyValueTrait { |
+ public: |
+ typedef intptr_t Key; |
Cutch
2017/03/16 20:38:16
what is the key?
bkonyi
2017/03/16 20:48:40
Size of the allocation. Will add comment/better na
bkonyi
2017/03/21 01:53:24
Removed.
|
+ typedef intptr_t Value; |
Cutch
2017/03/16 20:38:16
what is the value?
bkonyi
2017/03/16 20:48:40
The number of allocations of the size represented
bkonyi
2017/03/21 01:53:24
Removed.
|
+ |
+ struct Pair { |
+ Key key; |
+ Value value; |
+ Pair() : key(), value(-1) {} |
+ Pair(const Key key, const Value value) : key(key), value(value) {} |
+ Pair(const Pair& other) : key(other.key), value(other.value) {} |
+ }; |
+ |
+ static Key KeyOf(Pair kv) { return kv.key; } |
+ static Value ValueOf(Pair kv) { return kv.value; } |
+ static uintptr_t Hashcode(Key key) { return key; } |
+ static bool IsKeyEqual(Pair kv, Key key) { return kv.key == key; } |
+}; |
+ |
+typedef DirectChainedHashMap<AllocationKeyValueTrait> AllocationHashMap; |
+ |
class ProfileFunctionSourcePosition { |
public: |
explicit ProfileFunctionSourcePosition(TokenPosition token_pos); |
@@ -83,12 +106,15 @@ class ProfileFunction : public ZoneAllocated { |
intptr_t exclusive_ticks() const { return exclusive_ticks_; } |
intptr_t inclusive_ticks() const { return inclusive_ticks_; } |
- |
void IncInclusiveTicks() { inclusive_ticks_++; } |
- |
void Tick(bool exclusive, |
intptr_t inclusive_serial, |
- TokenPosition token_position); |
+ TokenPosition token_position, |
+ ProcessedSample* sample); |
+ |
+ bool contains_native_allocation() const { |
+ return contains_native_allocation_; |
+ } |
static const char* KindToCString(Kind kind); |
@@ -119,6 +145,11 @@ class ProfileFunction : public ZoneAllocated { |
intptr_t inclusive_ticks_; |
intptr_t inclusive_serial_; |
+ void AccumulateAllocation(intptr_t allocation_size, bool exclusive); |
+ bool contains_native_allocation_; |
+ AllocationHashMap exclusive_native_allocations_; |
+ AllocationHashMap inclusive_native_allocations_; |
+ |
void PrintToJSONObject(JSONObject* func); |
// A |ProfileCode| that contains this function. |
void AddProfileCode(intptr_t code_table_index); |
@@ -193,6 +224,10 @@ class ProfileCode : public ZoneAllocated { |
} |
void IncInclusiveTicks() { inclusive_ticks_++; } |
+ bool contains_native_allocation() const { |
+ return contains_native_allocation_; |
+ } |
+ |
bool IsOptimizedDart() const; |
RawCode* code() const { return code_.raw(); } |
@@ -205,8 +240,9 @@ class ProfileCode : public ZoneAllocated { |
void PrintToJSONArray(JSONArray* codes); |
private: |
- void Tick(uword pc, bool exclusive, intptr_t serial); |
+ void Tick(uword pc, bool exclusive, intptr_t serial, ProcessedSample* sample); |
void TickAddress(uword pc, bool exclusive); |
+ void AccumulateAllocation(intptr_t allocation_size, bool exclusive); |
ProfileFunction* SetFunctionAndName(ProfileFunctionTable* table); |
@@ -227,6 +263,10 @@ class ProfileCode : public ZoneAllocated { |
intptr_t inclusive_ticks_; |
intptr_t inclusive_serial_; |
+ AllocationHashMap exclusive_native_allocations_; |
+ AllocationHashMap inclusive_native_allocations_; |
+ bool contains_native_allocation_; |
+ |
const Code& code_; |
char* name_; |
int64_t compile_timestamp_; |
@@ -258,6 +298,13 @@ class ProfileTrieNode : public ZoneAllocated { |
intptr_t count() const { return count_; } |
void Tick() { count_++; } |
+ void IncrementAllocation(intptr_t allocation, bool exclusive) { |
+ ASSERT(allocation >= 0); |
+ if (exclusive) { |
+ exclusive_allocations_ += allocation; |
+ } |
+ inclusive_allocations_ += allocation; |
+ } |
intptr_t NumChildren() const { return children_.length(); } |
@@ -284,6 +331,8 @@ class ProfileTrieNode : public ZoneAllocated { |
intptr_t table_index_; |
intptr_t count_; |
+ intptr_t exclusive_allocations_; |
+ intptr_t inclusive_allocations_; |
ZoneGrowableArray<ProfileTrieNode*> children_; |
intptr_t frame_id_; |