Index: chrome/browser/url_fetcher_protect.cc |
=================================================================== |
--- chrome/browser/url_fetcher_protect.cc (revision 8164) |
+++ chrome/browser/url_fetcher_protect.cc (working copy) |
@@ -1,173 +0,0 @@ |
-// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "chrome/browser/url_fetcher_protect.h" |
- |
-// URLFetcherProtectEntry ---------------------------------------------------- |
- |
-using base::TimeDelta; |
-using base::TimeTicks; |
- |
-// Default parameters. Time is in milliseconds. |
-// static |
-const int URLFetcherProtectEntry::kDefaultSlidingWindowPeriod = 2000; |
- |
-const int URLFetcherProtectEntry::kDefaultMaxSendThreshold = 20; |
-const int URLFetcherProtectEntry::kDefaultMaxRetries = 0; |
- |
-const int URLFetcherProtectEntry::kDefaultInitialTimeout = 100; |
-const double URLFetcherProtectEntry::kDefaultMultiplier = 2.0; |
-const int URLFetcherProtectEntry::kDefaultConstantFactor = 100; |
-const int URLFetcherProtectEntry::kDefaultMaximumTimeout = 60000; |
- |
- |
-URLFetcherProtectEntry::URLFetcherProtectEntry() |
- : sliding_window_period_(kDefaultSlidingWindowPeriod), |
- max_send_threshold_(kDefaultMaxSendThreshold), |
- max_retries_(kDefaultMaxRetries), |
- initial_timeout_(kDefaultInitialTimeout), |
- multiplier_(kDefaultMultiplier), |
- constant_factor_(kDefaultConstantFactor), |
- maximum_timeout_(kDefaultMaximumTimeout) { |
- ResetBackoff(); |
-} |
- |
-URLFetcherProtectEntry::URLFetcherProtectEntry(int sliding_window_period, |
- int max_send_threshold, |
- int max_retries, |
- int initial_timeout, |
- double multiplier, |
- int constant_factor, |
- int maximum_timeout) |
- : sliding_window_period_(sliding_window_period), |
- max_send_threshold_(max_send_threshold), |
- max_retries_(max_retries), |
- initial_timeout_(initial_timeout), |
- multiplier_(multiplier), |
- constant_factor_(constant_factor), |
- maximum_timeout_(maximum_timeout) { |
- ResetBackoff(); |
-} |
- |
-int URLFetcherProtectEntry::UpdateBackoff(EventType event_type) { |
- // request may be sent in different threads |
- AutoLock lock(lock_); |
- |
- TimeDelta t; |
- switch (event_type) { |
- case SEND: |
- t = AntiOverload(); |
- break; |
- case SUCCESS: |
- t = ResetBackoff(); |
- break; |
- case FAILURE: |
- t = IncreaseBackoff(); |
- break; |
- default: |
- NOTREACHED(); |
- } |
- |
- int wait = static_cast<int>(t.InMilliseconds()); |
- DCHECK(wait >= 0); |
- return wait; |
-} |
- |
-TimeDelta URLFetcherProtectEntry::AntiOverload() { |
- TimeDelta sw = TimeDelta::FromMilliseconds(sliding_window_period_); |
- TimeTicks now = TimeTicks::Now(); |
- // Estimate when the next request will be sent. |
- release_time_ = now; |
- if (send_log_.size() > 0) { |
- release_time_ = std::max(release_time_, send_log_.back()); |
- } |
- // Checks if there are too many send events in recent time. |
- if (send_log_.size() >= static_cast<unsigned>(max_send_threshold_)) { |
- release_time_ = std::max(release_time_, send_log_.front() + sw); |
- } |
- // Logs the new send event. |
- send_log_.push(release_time_); |
- // Drops the out-of-date events in the event list. |
- while (!send_log_.empty() && |
- (send_log_.front() + sw <= send_log_.back())) { |
- send_log_.pop(); |
- } |
- return release_time_ - now; |
-} |
- |
-TimeDelta URLFetcherProtectEntry::ResetBackoff() { |
- timeout_period_ = initial_timeout_; |
- release_time_ = TimeTicks::Now(); |
- return TimeDelta::FromMilliseconds(0); |
-} |
- |
-TimeDelta URLFetcherProtectEntry::IncreaseBackoff() { |
- TimeTicks now = TimeTicks::Now(); |
- |
- release_time_ = std::max(release_time_, now) + |
- TimeDelta::FromMilliseconds(timeout_period_); |
- |
- // Calculates the new backoff time. |
- timeout_period_ = static_cast<int> |
- (multiplier_ * timeout_period_ + constant_factor_); |
- if (maximum_timeout_ && timeout_period_ > maximum_timeout_) |
- timeout_period_ = maximum_timeout_; |
- |
- return release_time_ - now; |
-} |
- |
-// URLFetcherProtectManager -------------------------------------------------- |
- |
-// static |
-scoped_ptr<URLFetcherProtectManager> URLFetcherProtectManager::protect_manager_; |
-Lock URLFetcherProtectManager::lock_; |
- |
-URLFetcherProtectManager::~URLFetcherProtectManager() { |
- // Deletes all entries |
- ProtectService::iterator i; |
- for (i = services_.begin(); i != services_.end(); ++i) { |
- if (i->second) |
- delete i->second; |
- } |
-} |
- |
-// static |
-URLFetcherProtectManager* URLFetcherProtectManager::GetInstance() { |
- AutoLock lock(lock_); |
- |
- if (protect_manager_.get() == NULL) { |
- protect_manager_.reset(new URLFetcherProtectManager()); |
- } |
- return protect_manager_.get(); |
-} |
- |
-URLFetcherProtectEntry* URLFetcherProtectManager::Register(std::string id) { |
- AutoLock lock(lock_); |
- |
- ProtectService::iterator i = services_.find(id); |
- |
- if (i != services_.end()) { |
- // The entry exists. |
- return i->second; |
- } |
- |
- // Creates a new entry. |
- URLFetcherProtectEntry* entry = new URLFetcherProtectEntry(); |
- services_[id] = entry; |
- return entry; |
-} |
- |
-URLFetcherProtectEntry* URLFetcherProtectManager::Register( |
- std::string id, URLFetcherProtectEntry* entry) { |
- AutoLock lock(lock_); |
- |
- ProtectService::iterator i = services_.find(id); |
- if (i != services_.end()) { |
- // The entry exists. |
- delete i->second; |
- } |
- |
- services_[id] = entry; |
- return entry; |
-} |