changeset 69fad6658160 in /z/repo/gem5
details: http://repo.gem5.org/gem5?cmd=changeset;node=69fad6658160
description:
        gem5: fix some iterator use and erase bugs

diffstat:

 src/cpu/pc_event.cc            |   9 +++++++--
 src/mem/cache/prefetch/base.cc |  10 ++++++----
 2 files changed, 13 insertions(+), 6 deletions(-)

diffs (57 lines):

diff -r 5d80de4bbf96 -r 69fad6658160 src/cpu/pc_event.cc
--- a/src/cpu/pc_event.cc       Thu May 10 18:04:27 2012 -0500
+++ b/src/cpu/pc_event.cc       Thu May 10 18:04:27 2012 -0500
@@ -56,13 +56,18 @@
 {
     int removed = 0;
     range_t range = equal_range(event);
-    for (iterator i = range.first; i != range.second; ++i) {
+    iterator i = range.first;
+    while (i != range.second &&
+           i != pc_map.end()) {
         if (*i == event) {
             DPRINTF(PCEvent, "PC based event removed at %#x: %s\n",
                     event->pc(), event->descr());
-            pc_map.erase(i);
+            i = pc_map.erase(i);
             ++removed;
+        } else {
+            i++;
         }
+
     }
 
     return removed > 0;
diff -r 5d80de4bbf96 -r 69fad6658160 src/mem/cache/prefetch/base.cc
--- a/src/mem/cache/prefetch/base.cc    Thu May 10 18:04:27 2012 -0500
+++ b/src/mem/cache/prefetch/base.cc    Thu May 10 18:04:27 2012 -0500
@@ -182,7 +182,7 @@
             pfRemovedMSHR++;
             delete (*iter)->req;
             delete (*iter);
-            pf.erase(iter);
+            iter = pf.erase(iter);
             if (pf.empty())
                 cache->deassertMemSideBusRequest(BaseCache::Request_PF);
         }
@@ -194,15 +194,17 @@
         // Needed for serial calculators like GHB
         if (serialSquash) {
             iter = pf.end();
-            iter--;
+            if (iter != pf.begin())
+                iter--;
             while (!pf.empty() && ((*iter)->time >= time)) {
                 pfSquashed++;
                 DPRINTF(HWPrefetch, "Squashing old prefetch addr: 0x%x\n",
                         (*iter)->getAddr());
                 delete (*iter)->req;
                 delete (*iter);
-                pf.erase(iter);
-                iter--;
+                iter = pf.erase(iter);
+                if (iter != pf.begin())
+                    iter--;
             }
             if (pf.empty())
                 cache->deassertMemSideBusRequest(BaseCache::Request_PF);
_______________________________________________
gem5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/gem5-dev

Reply via email to