Index: net/url_request/url_request_throttler_manager.cc |
diff --git a/net/url_request/url_request_throttler_manager.cc b/net/url_request/url_request_throttler_manager.cc |
index 330cc48a7b7674fcba9984d42508368487500a8c..383471fd47056293c3566cf77dfcac44837f9245 100644 |
--- a/net/url_request/url_request_throttler_manager.cc |
+++ b/net/url_request/url_request_throttler_manager.cc |
@@ -9,31 +9,6 @@ |
#include "base/logging.h" |
#include "base/string_util.h" |
-namespace { |
- |
-// TODO(joi): Remove after crbug.com/71721 is fixed. |
-struct IteratorHistory { |
- // Copy of 'this' pointer at time of access; this helps both because |
- // the this pointer is often obfuscated (at least for this particular |
- // stack trace) in fully optimized builds, and possibly to detect |
- // changes in the this pointer during iteration over the map (e.g. |
- // from another thread overwriting memory). |
- net::URLRequestThrottlerManager* self; |
- |
- // Copy of URL key. |
- char url[256]; |
- |
- // Not a refptr, we don't want to change behavior by keeping it alive. |
- net::URLRequestThrottlerEntryInterface* entry; |
- |
- // Set to true if the entry gets erased. Helpful to verify that entries |
- // with 0 refcount (since we don't take a refcount above) have been |
- // erased from the map. |
- bool was_erased; |
-}; |
- |
-} // namespace |
- |
namespace net { |
const unsigned int URLRequestThrottlerManager::kMaximumNumberOfEntries = 1500; |
@@ -45,7 +20,7 @@ URLRequestThrottlerManager* URLRequestThrottlerManager::GetInstance() { |
scoped_refptr<URLRequestThrottlerEntryInterface> |
URLRequestThrottlerManager::RegisterRequestUrl(const GURL &url) { |
- CHECK(being_tested_ || thread_checker_.CalledOnValidThread()); |
+ DCHECK(being_tested_ || CalledOnValidThread()); |
// Normalize the url. |
std::string url_id = GetIdFromUrl(url); |
@@ -58,9 +33,6 @@ scoped_refptr<URLRequestThrottlerEntryInterface> |
if (entry.get() == NULL) |
entry = new URLRequestThrottlerEntry(); |
- // TODO(joi): Demote CHECKs in this file to DCHECKs (or remove them) once |
- // we fully understand crbug.com/71721 |
- CHECK(entry.get()); |
return entry; |
} |
@@ -94,21 +66,17 @@ URLRequestThrottlerManager::URLRequestThrottlerManager() |
// Construction/destruction is on main thread (because BrowserMain |
// retrieves an instance to call InitializeOptions), but is from then on |
// used on I/O thread. |
- thread_checker_.DetachFromThread(); |
+ DetachFromThread(); |
url_id_replacements_.ClearPassword(); |
url_id_replacements_.ClearUsername(); |
url_id_replacements_.ClearQuery(); |
url_id_replacements_.ClearRef(); |
- |
- // TODO(joi): Remove after crbug.com/71721 is fixed. |
- base::strlcpy(magic_buffer_1_, "MAGICZZ", arraysize(magic_buffer_1_)); |
- base::strlcpy(magic_buffer_2_, "GOOGYZZ", arraysize(magic_buffer_2_)); |
} |
URLRequestThrottlerManager::~URLRequestThrottlerManager() { |
// Destruction is on main thread (AtExit), but real use is on I/O thread. |
- thread_checker_.DetachFromThread(); |
+ DetachFromThread(); |
// Delete all entries. |
url_entries_.clear(); |
@@ -119,8 +87,7 @@ std::string URLRequestThrottlerManager::GetIdFromUrl(const GURL& url) const { |
return url.possibly_invalid_spec(); |
GURL id = url.ReplaceComponents(url_id_replacements_); |
- // TODO(joi): Remove "GOOGY/MONSTA" stuff once crbug.com/71721 is done |
- return StringPrintf("GOOGY%sMONSTA", StringToLowerASCII(id.spec()).c_str()); |
+ return StringToLowerASCII(id.spec()).c_str(); |
} |
void URLRequestThrottlerManager::GarbageCollectEntriesIfNecessary() { |
@@ -133,48 +100,20 @@ void URLRequestThrottlerManager::GarbageCollectEntriesIfNecessary() { |
} |
void URLRequestThrottlerManager::GarbageCollectEntries() { |
- // TODO(joi): Remove these crash report aids once crbug.com/71721 |
- // is figured out. |
- IteratorHistory history[32] = { { 0 } }; |
- size_t history_ix = 0; |
- history[history_ix++].self = this; |
- |
- int nulls_found = 0; |
UrlEntryMap::iterator i = url_entries_.begin(); |
while (i != url_entries_.end()) { |
- if (i->second == NULL) { |
- ++nulls_found; |
- } |
- |
- // Keep a log of the first 31 items accessed after the first |
- // NULL encountered (hypothesis is there are multiple NULLs, |
- // and we may learn more about pattern of memory overwrite). |
- // We also log when we access the first entry, to get an original |
- // value for our this pointer. |
- if (nulls_found > 0 && history_ix < arraysize(history)) { |
- history[history_ix].self = this; |
- base::strlcpy(history[history_ix].url, i->first.c_str(), |
- arraysize(history[history_ix].url)); |
- history[history_ix].entry = i->second.get(); |
- history[history_ix].was_erased = false; |
- ++history_ix; |
- } |
- |
- // TODO(joi): Remove first i->second check when crbug.com/71721 is fixed. |
+ // TODO(joi): We know, as per crbug.com/71721, that values here can sometimes |
+ // be NULL because of a a memory overwrite coming from somewhere else. |
+ // Minidumps of the crash are at this point not giving us any new |
+ // information so adding the [i->second == NULL] check lessens the impact |
+ // on our users (it seems to generally avoid the crash). |
if (i->second == NULL || (i->second)->IsEntryOutdated()) { |
url_entries_.erase(i++); |
- |
- if (nulls_found > 0 && (history_ix - 1) < arraysize(history)) { |
- history[history_ix - 1].was_erased = true; |
- } |
} else { |
++i; |
} |
} |
- // TODO(joi): Make this a CHECK again after M11 branch point. |
- DCHECK(nulls_found == 0); |
- |
// In case something broke we want to make sure not to grow indefinitely. |
while (url_entries_.size() > kMaximumNumberOfEntries) { |
url_entries_.erase(url_entries_.begin()); |