diff options
author | sky@chromium.org <sky@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-07-01 22:35:26 +0000 |
---|---|---|
committer | sky@chromium.org <sky@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-07-01 22:35:26 +0000 |
commit | a6ed943ee5fd6d4b09618f9154da2e715e9b053c (patch) | |
tree | acac6c6a9478d00b3592497f4f3ae7c63802d919 | |
parent | 30eb751d1a778b73e20c238ec2f54b7293eb1b6f (diff) | |
download | chromium_src-a6ed943ee5fd6d4b09618f9154da2e715e9b053c.zip chromium_src-a6ed943ee5fd6d4b09618f9154da2e715e9b053c.tar.gz chromium_src-a6ed943ee5fd6d4b09618f9154da2e715e9b053c.tar.bz2 |
Adds some debugging code in hopes of tracking down a
crash. Specifically:
. Adds a CHECK to IDMap that evaluates to true if adding NULL. The
default isn't to do this check.
. browser_shutdown CHECKs if the # RPHs changes while iterating
through the RPHs.
BUG=15615
TEST=none
Review URL: http://codereview.chromium.org/150181
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@19779 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | base/id_map.h | 17 | ||||
-rw-r--r-- | chrome/browser/browser_shutdown.cc | 4 | ||||
-rw-r--r-- | chrome/browser/renderer_host/render_process_host.cc | 1 |
3 files changed, 19 insertions, 3 deletions
diff --git a/base/id_map.h b/base/id_map.h index 4b8ef29..9f6111e 100644 --- a/base/id_map.h +++ b/base/id_map.h @@ -28,12 +28,17 @@ class IDMap { // Note, use iterator->first to get the ID, iterator->second to get the T* typedef typename HashTable::const_iterator const_iterator; - IDMap() : next_id_(1) { + IDMap() : next_id_(1), check_on_null_data_(false) { } - IDMap(const IDMap& other) : next_id_(other.next_id_), - data_(other.data_) { + IDMap(const IDMap& other) + : next_id_(other.next_id_), + data_(other.data_), + check_on_null_data_(other.check_on_null_data_) { } + // Sets whether Add should CHECK if passed in NULL data. Default is false. + void set_check_on_null_data(bool value) { check_on_null_data_ = value; } + const_iterator begin() const { return data_.begin(); } @@ -43,6 +48,7 @@ class IDMap { // Adds a view with an automatically generated unique ID. See AddWithID. int32 Add(T* data) { + CHECK(!check_on_null_data_ || data); int32 this_id = next_id_; DCHECK(data_.find(this_id) == data_.end()) << "Inserting duplicate item"; data_[this_id] = data; @@ -55,6 +61,7 @@ class IDMap { // this function, or allow this object to generate IDs and call Add. These // two methods may not be mixed, or duplicate IDs may be generated void AddWithID(T* data, int32 id) { + CHECK(!check_on_null_data_ || data); DCHECK(data_.find(id) == data_.end()) << "Inserting duplicate item"; data_[id] = data; } @@ -88,6 +95,10 @@ class IDMap { int32 next_id_; HashTable data_; + + private: + // See description above setter. + bool check_on_null_data_; }; #endif // BASE_ID_MAP_H__ diff --git a/chrome/browser/browser_shutdown.cc b/chrome/browser/browser_shutdown.cc index 8ef0dbe..b67542d 100644 --- a/chrome/browser/browser_shutdown.cc +++ b/chrome/browser/browser_shutdown.cc @@ -65,6 +65,7 @@ void OnShutdownStarting(ShutdownType type) { // a no-op in some cases, so we still need to go through the normal // shutdown path for the ones that didn't exit here. shutdown_num_processes_slow_ = 0; + size_t start_rph_size = RenderProcessHost::size(); for (RenderProcessHost::iterator hosts = RenderProcessHost::begin(); hosts != RenderProcessHost::end(); ++hosts) { @@ -74,6 +75,9 @@ void OnShutdownStarting(ShutdownType type) { // higher up, it's not possible to get here. Confirm this and change // FastShutdownIfPossible to just be FastShutdown. shutdown_num_processes_slow_++; + // The number of RPHs should not have changed as the result of invoking + // FastShutdownIfPossible. + CHECK(start_rph_size == RenderProcessHost::size()); } } } diff --git a/chrome/browser/renderer_host/render_process_host.cc b/chrome/browser/renderer_host/render_process_host.cc index 49e70da..dc1f8b1 100644 --- a/chrome/browser/renderer_host/render_process_host.cc +++ b/chrome/browser/renderer_host/render_process_host.cc @@ -85,6 +85,7 @@ RenderProcessHost::RenderProcessHost(Profile* profile) pid_(-1), profile_(profile), sudden_termination_allowed_(true) { + all_hosts.set_check_on_null_data(true); } RenderProcessHost::~RenderProcessHost() { |