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