Index: runtime/vm/malloc_hooks.cc |
diff --git a/runtime/vm/malloc_hooks.cc b/runtime/vm/malloc_hooks.cc |
index e3cbdd10175501ad5c758aa8193121d17af636cc..6502bbb3a06ecfcad03a192cd283c6983a794643 100644 |
--- a/runtime/vm/malloc_hooks.cc |
+++ b/runtime/vm/malloc_hooks.cc |
@@ -131,13 +131,15 @@ class MallocLocker : public ValueObject { |
// -Stack trace corresponding to the location of allocation, if applicable |
class AllocationInfo { |
public: |
- explicit AllocationInfo(intptr_t allocation_size) |
- : sample_(NULL), allocation_size_(allocation_size) { |
+ AllocationInfo(uword address, intptr_t allocation_size) |
+ : sample_(NULL), address_(address), allocation_size_(allocation_size) { |
// Stack trace collection is disabled when we are in the process of creating |
// the first OSThread in order to prevent deadlocks. |
if (MallocHooksState::ProfilingEnabled() && |
MallocHooksState::stack_trace_collection_enabled()) { |
- sample_ = Profiler::SampleNativeAllocation(kSkipCount); |
+ sample_ = Profiler::SampleNativeAllocation(kSkipCount, address, |
+ allocation_size); |
+ ASSERT(sample_->native_allocation_address() == address_); |
} |
} |
@@ -145,16 +147,13 @@ class AllocationInfo { |
intptr_t allocation_size() const { return allocation_size_; } |
private: |
+ // Note: sample_ is not owned by AllocationInfo, but by the SampleBuffer |
+ // created by the profiler. As such, this is only here to track if the sample |
+ // is still associated with a native allocation, and its fields are never |
+ // accessed from this class. |
Sample* sample_; |
+ uword address_; |
intptr_t allocation_size_; |
- |
- // The number of frames that are generated by the malloc hooks and collection |
- // of the stack trace. These frames are ignored when collecting the stack |
- // trace for a memory allocation. If this number is incorrect, some tests in |
- // malloc_hook_tests.cc might fail, particularily |
- // StackTraceMallocHookLengthTest. If this value is updated, please make sure |
- // that the MallocHooks test cases pass on all platforms. |
- static const intptr_t kSkipCount = 5; |
}; |
@@ -416,7 +415,8 @@ void MallocHooksState::RecordAllocHook(const void* ptr, size_t size) { |
// Now that we hold the lock, check to make sure everything is still active. |
if ((ptr != NULL) && MallocHooksState::Active()) { |
MallocHooksState::IncrementHeapAllocatedMemoryInBytes(size); |
- MallocHooksState::address_map()->Insert(ptr, new AllocationInfo(size)); |
+ MallocHooksState::address_map()->Insert( |
+ ptr, new AllocationInfo(reinterpret_cast<uword>(ptr), size)); |
} |
} |
@@ -435,7 +435,8 @@ void MallocHooksState::RecordFreeHook(const void* ptr) { |
if (MallocHooksState::address_map()->Lookup(ptr, &allocation_info)) { |
MallocHooksState::DecrementHeapAllocatedMemoryInBytes( |
allocation_info->allocation_size()); |
- MallocHooksState::address_map()->Remove(ptr); |
+ const bool result = MallocHooksState::address_map()->Remove(ptr); |
+ ASSERT(result); |
delete allocation_info; |
} |
} |