Bug fix: can't increment an iterator after you erase
authorSteve Reinhardt <stever@eecs.umich.edu>
Fri, 2 Sep 2005 18:38:11 +0000 (14:38 -0400)
committerSteve Reinhardt <stever@eecs.umich.edu>
Fri, 2 Sep 2005 18:38:11 +0000 (14:38 -0400)
the thing it points to.  Somehow Linux doesn't care,
but Cygwin sure does.

--HG--
extra : convert_revision : 1209a75831f080f17a95433e546d7074f9f07332

arch/alpha/alpha_memory.cc

index 39c9397eadf3e70d78abf43edafb6209b8289c4b..8dda4d9c400982d59ae14bf0f806e19b5e233d38 100644 (file)
@@ -177,6 +177,7 @@ AlphaTLB::insert(Addr addr, AlphaISA::PTE &pte)
 void
 AlphaTLB::flushAll()
 {
+    DPRINTF(TLB, "flushAll\n");
     memset(table, 0, sizeof(AlphaISA::PTE[size]));
     lookupTable.clear();
     nlu = 0;
@@ -192,13 +193,16 @@ AlphaTLB::flushProcesses()
         AlphaISA::PTE *pte = &table[index];
         assert(pte->valid);
 
+        // we can't increment i after we erase it, so save a copy and
+        // increment it to get the next entry now
+        PageTable::iterator cur = i;
+        ++i;
+
         if (!pte->asma) {
             DPRINTF(TLB, "flush @%d: %#x -> %#x\n", index, pte->tag, pte->ppn);
             pte->valid = false;
-            lookupTable.erase(i);
+            lookupTable.erase(cur);
         }
-
-        ++i;
     }
 }