Index: chrome/browser/net/passive_log_collector.cc |
=================================================================== |
--- chrome/browser/net/passive_log_collector.cc (revision 65117) |
+++ chrome/browser/net/passive_log_collector.cc (working copy) |
@@ -289,6 +289,15 @@ |
} |
} |
+void PassiveLogCollector::SourceTracker::EraseFromDeletionQueue( |
+ uint32 source_id) { |
+ DeletionQueue::iterator it = |
+ std::remove(deletion_queue_.begin(), deletion_queue_.end(), |
+ source_id); |
+ DCHECK(it != deletion_queue_.end()); |
+ deletion_queue_.erase(it); |
+} |
+ |
void PassiveLogCollector::SourceTracker::AdjustReferenceCountForSource( |
int offset, uint32 source_id) { |
DCHECK(offset == -1 || offset == 1) << "invalid offset: " << offset; |
@@ -306,7 +315,8 @@ |
DCHECK_GE(info.reference_count, 0); |
info.reference_count += offset; |
- if (info.reference_count < 0) { |
+ bool released_unmatched_reference = info.reference_count < 0; |
+ if (released_unmatched_reference) { |
// In general this shouldn't happen, however it is possible to reach this |
// state if SourceTracker::Clear() was called earlier. |
LOG(WARNING) << "Released unmatched reference count."; |
@@ -317,12 +327,10 @@ |
if (info.reference_count == 1 && offset == 1) { |
// If we just added a reference to a dead source that had no references, |
// it must have been in the deletion queue, so remove it from the queue. |
- DeletionQueue::iterator it = |
- std::remove(deletion_queue_.begin(), deletion_queue_.end(), |
- source_id); |
- DCHECK(it != deletion_queue_.end()); |
- deletion_queue_.erase(it); |
+ EraseFromDeletionQueue(source_id); |
} else if (info.reference_count == 0) { |
+ if (released_unmatched_reference) |
+ EraseFromDeletionQueue(source_id); |
// If we just released the final reference to a dead source, go ahead |
// and delete it right away. |
DeleteSourceInfo(source_id); |