Keep views on views_ list so that they can be found again.
authorIan Lance Taylor <iant@google.com>
Mon, 10 Dec 2007 22:55:31 +0000 (22:55 +0000)
committerIan Lance Taylor <iant@google.com>
Mon, 10 Dec 2007 22:55:31 +0000 (22:55 +0000)
gold/fileread.cc

index 1e3b4638f68d255a4d67190ce7dce13deda37f3a..9579f0f5dd42242da951c2314604c4a1c23af231 100644 (file)
@@ -331,34 +331,40 @@ File_read::get_lasting_view(off_t start, off_t size, bool cache)
 void
 File_read::clear_views(bool destroying)
 {
-  for (Views::iterator p = this->views_.begin();
-       p != this->views_.end();
-       ++p)
+  Views::iterator p = this->views_.begin();
+  while (p != this->views_.end())
     {
       if (!p->second->is_locked()
          && (destroying || !p->second->should_cache()))
-       delete p->second;
+       {
+         delete p->second;
+
+         // map::erase invalidates only the iterator to the deleted
+         // element.
+         Views::iterator pe = p;
+         ++p;
+         this->views_.erase(pe);
+       }
       else
        {
          gold_assert(!destroying);
-         this->saved_views_.push_back(p->second);
+         ++p;
        }
     }
-  this->views_.clear();
 
-  Saved_views::iterator p = this->saved_views_.begin();
-  while (p != this->saved_views_.end())
+  Saved_views::iterator q = this->saved_views_.begin();
+  while (q != this->saved_views_.end())
     {
-      if (!(*p)->is_locked()
-         && (destroying || !(*p)->should_cache()))
+      if (!(*q)->is_locked()
+         && (destroying || !(*q)->should_cache()))
        {
-         delete *p;
-         p = this->saved_views_.erase(p);
+         delete *q;
+         q = this->saved_views_.erase(q);
        }
       else
        {
          gold_assert(!destroying);
-         ++p;
+         ++q;
        }
     }
 }