Jelajahi Sumber

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 tahun lalu
induk
melakukan
db9b090fae
1 mengubah file dengan 19 tambahan dan 8 penghapusan
  1. 19 8
      source/DiskFS.Mod

+ 19 - 8
source/DiskFS.Mod

@@ -925,17 +925,22 @@ TYPE
 		END Clear;
 		
 		PROCEDURE Grow;
-		VAR old: DiskAdrArray; i,value: LONGINT;
+		VAR old: DiskAdrArray; i,x: LONGINT; index: SIZE;
 		BEGIN
 			old := table;
 			NEW(table, LEN(old)*2); (* filled with zeroes -- ok *)
 			size := LEN(table)-1;
 			count := 0;
 			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 Grow;
@@ -954,11 +959,17 @@ TYPE
 		END HashValue;
 
 		PROCEDURE Add(x: DiskAdr);
+		VAR index: SIZE;
 		BEGIN {EXCLUSIVE}
 			ASSERT(x # 0);
 			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;
 		
 		PROCEDURE Contains(x: DiskAdr) : BOOLEAN;
@@ -1524,4 +1535,4 @@ END DiskFS.
 (*
 	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
-*)
+*)