| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/net/passive_log_collector.h" | 5 #include "chrome/browser/net/passive_log_collector.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "base/compiler_specific.h" | 9 #include "base/compiler_specific.h" |
| 10 #include "base/string_util.h" | 10 #include "base/string_util.h" |
| (...skipping 271 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 282 | 282 |
| 283 // After the deletion queue has reached its maximum size, start | 283 // After the deletion queue has reached its maximum size, start |
| 284 // deleting sources in FIFO order. | 284 // deleting sources in FIFO order. |
| 285 if (deletion_queue_.size() > max_graveyard_size_) { | 285 if (deletion_queue_.size() > max_graveyard_size_) { |
| 286 uint32 oldest = deletion_queue_.front(); | 286 uint32 oldest = deletion_queue_.front(); |
| 287 deletion_queue_.pop_front(); | 287 deletion_queue_.pop_front(); |
| 288 DeleteSourceInfo(oldest); | 288 DeleteSourceInfo(oldest); |
| 289 } | 289 } |
| 290 } | 290 } |
| 291 | 291 |
| 292 void PassiveLogCollector::SourceTracker::EraseFromDeletionQueue( |
| 293 uint32 source_id) { |
| 294 DeletionQueue::iterator it = |
| 295 std::remove(deletion_queue_.begin(), deletion_queue_.end(), |
| 296 source_id); |
| 297 DCHECK(it != deletion_queue_.end()); |
| 298 deletion_queue_.erase(it); |
| 299 } |
| 300 |
| 292 void PassiveLogCollector::SourceTracker::AdjustReferenceCountForSource( | 301 void PassiveLogCollector::SourceTracker::AdjustReferenceCountForSource( |
| 293 int offset, uint32 source_id) { | 302 int offset, uint32 source_id) { |
| 294 DCHECK(offset == -1 || offset == 1) << "invalid offset: " << offset; | 303 DCHECK(offset == -1 || offset == 1) << "invalid offset: " << offset; |
| 295 | 304 |
| 296 // In general it is invalid to call AdjustReferenceCountForSource() on | 305 // In general it is invalid to call AdjustReferenceCountForSource() on |
| 297 // source that doesn't exist. However, it is possible that if | 306 // source that doesn't exist. However, it is possible that if |
| 298 // SourceTracker::Clear() was previously called this can happen. | 307 // SourceTracker::Clear() was previously called this can happen. |
| 299 SourceIDToInfoMap::iterator it = sources_.find(source_id); | 308 SourceIDToInfoMap::iterator it = sources_.find(source_id); |
| 300 if (it == sources_.end()) { | 309 if (it == sources_.end()) { |
| 301 LOG(WARNING) << "Released a reference to nonexistent source."; | 310 LOG(WARNING) << "Released a reference to nonexistent source."; |
| 302 return; | 311 return; |
| 303 } | 312 } |
| 304 | 313 |
| 305 SourceInfo& info = it->second; | 314 SourceInfo& info = it->second; |
| 306 DCHECK_GE(info.reference_count, 0); | 315 DCHECK_GE(info.reference_count, 0); |
| 307 info.reference_count += offset; | 316 info.reference_count += offset; |
| 308 | 317 |
| 309 if (info.reference_count < 0) { | 318 bool released_unmatched_reference = info.reference_count < 0; |
| 319 if (released_unmatched_reference) { |
| 310 // In general this shouldn't happen, however it is possible to reach this | 320 // In general this shouldn't happen, however it is possible to reach this |
| 311 // state if SourceTracker::Clear() was called earlier. | 321 // state if SourceTracker::Clear() was called earlier. |
| 312 LOG(WARNING) << "Released unmatched reference count."; | 322 LOG(WARNING) << "Released unmatched reference count."; |
| 313 info.reference_count = 0; | 323 info.reference_count = 0; |
| 314 } | 324 } |
| 315 | 325 |
| 316 if (!info.is_alive) { | 326 if (!info.is_alive) { |
| 317 if (info.reference_count == 1 && offset == 1) { | 327 if (info.reference_count == 1 && offset == 1) { |
| 318 // If we just added a reference to a dead source that had no references, | 328 // If we just added a reference to a dead source that had no references, |
| 319 // it must have been in the deletion queue, so remove it from the queue. | 329 // it must have been in the deletion queue, so remove it from the queue. |
| 320 DeletionQueue::iterator it = | 330 EraseFromDeletionQueue(source_id); |
| 321 std::remove(deletion_queue_.begin(), deletion_queue_.end(), | |
| 322 source_id); | |
| 323 DCHECK(it != deletion_queue_.end()); | |
| 324 deletion_queue_.erase(it); | |
| 325 } else if (info.reference_count == 0) { | 331 } else if (info.reference_count == 0) { |
| 332 if (released_unmatched_reference) |
| 333 EraseFromDeletionQueue(source_id); |
| 326 // If we just released the final reference to a dead source, go ahead | 334 // If we just released the final reference to a dead source, go ahead |
| 327 // and delete it right away. | 335 // and delete it right away. |
| 328 DeleteSourceInfo(source_id); | 336 DeleteSourceInfo(source_id); |
| 329 } | 337 } |
| 330 } | 338 } |
| 331 } | 339 } |
| 332 | 340 |
| 333 void PassiveLogCollector::SourceTracker::AddReferenceToSourceDependency( | 341 void PassiveLogCollector::SourceTracker::AddReferenceToSourceDependency( |
| 334 const net::NetLog::Source& source, SourceInfo* info) { | 342 const net::NetLog::Source& source, SourceInfo* info) { |
| 335 // Find the tracker which should be holding |source|. | 343 // Find the tracker which should be holding |source|. |
| (...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 554 PassiveLogCollector::DNSJobTracker::DoAddEntry(const Entry& entry, | 562 PassiveLogCollector::DNSJobTracker::DoAddEntry(const Entry& entry, |
| 555 SourceInfo* out_info) { | 563 SourceInfo* out_info) { |
| 556 AddEntryToSourceInfo(entry, out_info); | 564 AddEntryToSourceInfo(entry, out_info); |
| 557 if (entry.type == net::NetLog::TYPE_HOST_RESOLVER_IMPL_JOB && | 565 if (entry.type == net::NetLog::TYPE_HOST_RESOLVER_IMPL_JOB && |
| 558 entry.phase == net::NetLog::PHASE_END) { | 566 entry.phase == net::NetLog::PHASE_END) { |
| 559 return ACTION_MOVE_TO_GRAVEYARD; | 567 return ACTION_MOVE_TO_GRAVEYARD; |
| 560 } else { | 568 } else { |
| 561 return ACTION_NONE; | 569 return ACTION_NONE; |
| 562 } | 570 } |
| 563 } | 571 } |
| OLD | NEW |