From 2e2d1dc96adf544db753abe990a5874c6e4bd8d3 Mon Sep 17 00:00:00 2001 From: whh8b <whh8b@git.zephyr-software.com> Date: Fri, 24 Oct 2014 17:35:39 +0000 Subject: [PATCH] Fix errors in Memory space merge functions. --- src/memory_space.cpp | 33 +++++++++++++++++++-------------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/src/memory_space.cpp b/src/memory_space.cpp index 903cf4a..29c23b3 100644 --- a/src/memory_space.cpp +++ b/src/memory_space.cpp @@ -65,10 +65,8 @@ void MemorySpace_t::MergeFreeRange(RangeAddress_t addr) printf("from: %p to %p\n", (void*)r.GetStart(), (void*)r.GetEnd()); printf("to: %p to %p\n", (void*)nnr.GetStart(), (void*)nnr.GetEnd()); } - free_ranges.insert(it, nnr); - free_ranges.erase(it); nr = nnr; - merged = true; + free_ranges.erase(it); break; } else if ((addr-1) == r.GetEnd()) { /* @@ -82,17 +80,12 @@ void MemorySpace_t::MergeFreeRange(RangeAddress_t addr) printf("from: %p to %p\n", (void*)r.GetStart(), (void*)r.GetEnd()); printf("to: %p to %p\n", (void*)nnr.GetStart(), (void*)nnr.GetEnd()); } - free_ranges.insert(it, nnr); - free_ranges.erase(it); nr = nnr; - merged = true; + free_ranges.erase(it); break; } } - if (!merged) - free_ranges.insert(it, nr); - /* * Correctness: * Take a pass through and see if there are @@ -110,15 +103,19 @@ void MemorySpace_t::MergeFreeRange(RangeAddress_t addr) * <--r--> * <--nr--> */ - (r.GetEnd() >= nr.GetStart() && + ((r.GetEnd()+1) >= nr.GetStart() && r.GetEnd() <= nr.GetEnd()) || /* - * <--r--> * <--nr--> + * <--r--> */ - (r.GetStart() <= nr.GetEnd() && - r.GetEnd() >= nr.GetEnd()) + ((nr.GetEnd()+1) >= r.GetStart() && + nr.GetEnd() <= r.GetEnd()) ) && + /* + * The ranges themselves are not + * identical. + */ (r.GetStart() != nr.GetStart() || r.GetEnd() != nr.GetEnd())) { @@ -135,9 +132,17 @@ void MemorySpace_t::MergeFreeRange(RangeAddress_t addr) } free_ranges.insert(it, merged_range); free_ranges.erase(it); - return; + merged = true; + break; } } + + if (!merged) + { + free_ranges.push_back(nr); + } +} + } std::list<Range_t>::iterator MemorySpace_t::FindFreeRange(RangeAddress_t addr) -- GitLab