| Index: runtime/vm/malloc_hooks.cc
|
| diff --git a/runtime/vm/malloc_hooks.cc b/runtime/vm/malloc_hooks.cc
|
| index d838457889c2eb61561053c0ef251d79534492cb..a15906eae819a267252da97e13d93780203b4a97 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,7 +147,12 @@ 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
|
| @@ -154,7 +161,7 @@ class AllocationInfo {
|
| // 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;
|
| + static const intptr_t kSkipCount = 6;
|
| };
|
|
|
|
|
| @@ -416,7 +423,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 +443,7 @@ 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);
|
| + ASSERT(MallocHooksState::address_map()->Remove(ptr));
|
| delete allocation_info;
|
| }
|
| }
|
|
|