Browse Source

patched issues with hash table (and double assignments)

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@8426 8c9fc860-2736-0410-a75d-ab315db34111
felixf 6 years ago
parent
commit
db9b090fae
1 changed files with 19 additions and 8 deletions
  1. 19 8
      source/DiskFS.Mod

+ 19 - 8
source/DiskFS.Mod

@@ -925,17 +925,22 @@ TYPE
 		END Clear;
 		END Clear;
 		
 		
 		PROCEDURE Grow;
 		PROCEDURE Grow;
-		VAR old: DiskAdrArray; i,value: LONGINT;
+		VAR old: DiskAdrArray; i,x: LONGINT; index: SIZE;
 		BEGIN
 		BEGIN
 			old := table;
 			old := table;
 			NEW(table, LEN(old)*2); (* filled with zeroes -- ok *)
 			NEW(table, LEN(old)*2); (* filled with zeroes -- ok *)
 			size := LEN(table)-1;
 			size := LEN(table)-1;
 			count := 0;
 			count := 0;
 			FOR i := 0 TO LEN(old)-1 DO
 			FOR i := 0 TO LEN(old)-1 DO
-				value := old[i];
-				IF value # 0 THEN
-					table[HashValue(value)] := value;
-					INC(count);
+				x := old[i];
+				IF (x # 0) THEN
+					index := HashValue(x);
+					IF (table[index] = 0) THEN 
+						table[index] := x;
+						INC(count);
+					ELSE
+						HALT(100); (* double entry *)
+					END;
 				END;
 				END;
 			END;
 			END;
 		END Grow;
 		END Grow;
@@ -954,11 +959,17 @@ TYPE
 		END HashValue;
 		END HashValue;
 
 
 		PROCEDURE Add(x: DiskAdr);
 		PROCEDURE Add(x: DiskAdr);
+		VAR index: SIZE;
 		BEGIN {EXCLUSIVE}
 		BEGIN {EXCLUSIVE}
 			ASSERT(x # 0);
 			ASSERT(x # 0);
 			IF count > size DIV threshold THEN Grow END;
 			IF count > size DIV threshold THEN Grow END;
-			table[HashValue(x)] := x;
-			INC(count)
+			index := HashValue(x);
+			IF table[index] = 0 THEN 
+				table[index] := x;
+				INC(count);
+			ELSE
+				ASSERT(table[index] = x);
+			END;
 		END Add;
 		END Add;
 		
 		
 		PROCEDURE Contains(x: DiskAdr) : BOOLEAN;
 		PROCEDURE Contains(x: DiskAdr) : BOOLEAN;
@@ -1524,4 +1535,4 @@ END DiskFS.
 (*
 (*
 	04.02.2004	lb			Prevent disk space leaks during system run (disk GC)
 	04.02.2004	lb			Prevent disk space leaks during system run (disk GC)
 	03.01.2006	staubesv	Avoid longint overflow that caused disk gc even if not necessary
 	03.01.2006	staubesv	Avoid longint overflow that caused disk gc even if not necessary
-*)
+*)