| Index: tools/memory_watcher/memory_watcher.cc
|
| ===================================================================
|
| --- tools/memory_watcher/memory_watcher.cc (revision 30121)
|
| +++ tools/memory_watcher/memory_watcher.cc (working copy)
|
| @@ -88,16 +88,14 @@
|
| }
|
|
|
| void MemoryWatcher::OnTrack(HANDLE heap, int32 id, int32 size) {
|
| + // Don't track zeroes. It's a waste of time.
|
| + if (size == 0)
|
| + return;
|
| +
|
| // AllocationStack overrides new/delete to not allocate
|
| // from the main heap.
|
| - AllocationStack* stack = new AllocationStack(size);
|
| + AllocationStack* stack = new AllocationStack();
|
| {
|
| - // Don't track zeroes. It's a waste of time.
|
| - if (size == 0) {
|
| - delete stack;
|
| - return;
|
| - }
|
| -
|
| AutoLock lock(block_map_lock_);
|
|
|
| // Ideally, we'd like to verify that the block being added
|
| @@ -129,7 +127,7 @@
|
| }
|
|
|
| void MemoryWatcher::OnUntrack(HANDLE heap, int32 id, int32 size) {
|
| - DCHECK(size >= 0);
|
| + DCHECK_GE(size, 0);
|
|
|
| // Don't bother with these.
|
| if (size == 0)
|
| @@ -146,16 +144,22 @@
|
| DCHECK(id_it != stack_map_->end());
|
| id_it->second.size -= size;
|
| id_it->second.count--;
|
| - DCHECK(id_it->second.count >= 0);
|
| + DCHECK_GE(id_it->second.count, 0);
|
|
|
| // If there are no more callstacks with this stack, then we
|
| // have cleaned up all instances, and can safely delete the
|
| - // stack pointer in the stack_map.
|
| + // StackTracker in the stack_map.
|
| bool safe_to_delete = true;
|
| - if (id_it->second.count == 0)
|
| - stack_map_->erase(id_it);
|
| - else if (id_it->second.stack == stack)
|
| - safe_to_delete = false; // we're still using the stack
|
| + if (id_it->second.count != 0) {
|
| + // See if our |StackTracker| is also using |stack|.
|
| + if (id_it->second.stack == stack)
|
| + safe_to_delete = false; // We're still using |stack|.
|
| + } else {
|
| + // See if we skipped deleting our |StackTracker|'s |stack| earlier.
|
| + if (id_it->second.stack != stack)
|
| + delete id_it->second.stack; // We skipped it earlier.
|
| + stack_map_->erase(id_it); // Discard our StackTracker.
|
| + }
|
|
|
| block_map_size_ -= size;
|
| block_map_->erase(id);
|
|
|