浏览代码

Went back to last assumed working version and followed a more conservative approach.

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@8414 8c9fc860-2736-0410-a75d-ab315db34111
felixf 6 年之前
父节点
当前提交
d1082c89da
共有 1 个文件被更改,包括 37 次插入29 次删除
  1. 37 29
      source/DiskFS.Mod

+ 37 - 29
source/DiskFS.Mod

@@ -373,8 +373,27 @@ TYPE
 		VAR k: LONGINT; A: ARRAY 2000 OF DiskAdr; files: LONGINT; bad: BOOLEAN;
 		VAR k: LONGINT; A: ARRAY 2000 OF DiskAdr; files: LONGINT; bad: BOOLEAN;
 
 
 			PROCEDURE MarkSectors;
 			PROCEDURE MarkSectors;
-			VAR L, R, i, j, n: LONGINT; x: DiskAdr; hd: FileHeader; sup, sub, mark, marksup: IndexSector;
-				size: Files.TSize;
+			VAR L, R, i, j, n: LONGINT; x: DiskAdr; hd: FileHeader; sup, sub: IndexSector; mark: ARRAY 512 OF DiskAdr; markPosition: LONGINT;
+
+				PROCEDURE StartMarking;
+				BEGIN
+					markPosition := 0;
+				END StartMarking;
+
+				PROCEDURE FinishMarking;
+				BEGIN
+					vol.MarkBlocks(mark,0,markPosition);
+					markPosition := 0;
+				END FinishMarking;
+				
+				PROCEDURE MarkSector(vol: Files.Volume (* ignored *); sec: LONGINT);
+				BEGIN
+					mark[markPosition] := sec DIV SectorFactor;
+					INC(markPosition); 
+					IF markPosition = LEN(mark) THEN
+						FinishMarking;
+					END; 
+				END MarkSector;
 
 
 				PROCEDURE sift(L, R: LONGINT);
 				PROCEDURE sift(L, R: LONGINT);
 					VAR i, j: LONGINT; x: DiskAdr;
 					VAR i, j: LONGINT; x: DiskAdr;
@@ -388,6 +407,7 @@ TYPE
 				END sift;
 				END sift;
 
 
 			BEGIN
 			BEGIN
+				StartMarking;
 				KernelLog.String(" marking");
 				KernelLog.String(" marking");
 				L := k DIV 2; R := k; (*heapsort*)
 				L := k DIV 2; R := k; (*heapsort*)
 				WHILE L > 0 DO DEC(L); sift(L, R) END ;
 				WHILE L > 0 DO DEC(L); sift(L, R) END ;
@@ -402,54 +422,41 @@ TYPE
 						j := hd.aleng + 1;
 						j := hd.aleng + 1;
 						REPEAT
 						REPEAT
 							DEC(j);
 							DEC(j);
-							IF hd.sec[j] # 0 THEN mark.x[j] := hd.sec[j] DIV SectorFactor; (* preparation for block marking *)
-							ELSE hd.aleng := j-1; bad := TRUE; mark.x[j] := 0;
-							END
-						UNTIL j = 0;
-						vol.MarkBlocks(mark.x,0,hd.aleng+1); 
+							IF hd.sec[j] # 0 THEN MarkSector(vol, hd.sec[j]) ELSE hd.aleng := j-1; bad := TRUE END
+						UNTIL j = 0
 					ELSE
 					ELSE
 						j := SectorTableSize;
 						j := SectorTableSize;
 						REPEAT
 						REPEAT
 							DEC(j);
 							DEC(j);
-							IF hd.sec[j] # 0 THEN 
-								mark.x[j] := hd.sec[j] DIV SectorFactor; (* preparation for block marking *)
-							ELSE hd.aleng := j-1; bad := TRUE; mark.x[j] := 0;
-							END
+							IF hd.sec[j] # 0 THEN MarkSector(vol, hd.sec[j]) ELSE hd.aleng := j-1; bad := TRUE END
 						UNTIL j = 0;
 						UNTIL j = 0;
-						vol.MarkBlocks(mark.x,0,SectorTableSize); 
 						IF hd.ext = 0 THEN hd.aleng := SectorTableSize-1; bad := TRUE END;
 						IF hd.ext = 0 THEN hd.aleng := SectorTableSize-1; bad := TRUE END;
 						IF ~bad THEN
 						IF ~bad THEN
-							MarkSector(vol, hd.ext); 
-							GetSector(vol, hd.ext, sup);
+							MarkSector(vol, hd.ext); GetSector(vol, hd.ext, sup);
 							n := (hd.aleng - SectorTableSize) DIV IndexSize; i := 0;
 							n := (hd.aleng - SectorTableSize) DIV IndexSize; i := 0;
 							WHILE (i <= n) & ~bad DO
 							WHILE (i <= n) & ~bad DO
 								IF sup.x[i] # 0 THEN
 								IF sup.x[i] # 0 THEN
-									GetSector(vol, sup.x[i], sub);
-									marksup.x[i] := sup.x[i] DIV SectorFactor; (* preparation for block marking *)
-									IF i < n THEN size := IndexSize
-									ELSE size := (hd.aleng - SectorTableSize) MOD IndexSize + 1
+									MarkSector(vol, sup.x[i]); GetSector(vol, sup.x[i], sub);
+									IF i < n THEN j := IndexSize
+									ELSE j := (hd.aleng - SectorTableSize) MOD IndexSize + 1
 									END;
 									END;
-									FOR j := 0 TO size-1 DO
+									REPEAT
+										DEC(j);
 										IF (sub.x[j] MOD SectorFactor = 0) & (sub.x[j] > 0) THEN
 										IF (sub.x[j] MOD SectorFactor = 0) & (sub.x[j] > 0) THEN
-											mark.x[j] := sub.x[j] DIV SectorFactor; (* preparation for block marking *)
+											MarkSector(vol, sub.x[j])
 										ELSE
 										ELSE
-											mark.x[j] := 0; 
 											bad := TRUE
 											bad := TRUE
 										END
 										END
-									END;
-									vol.MarkBlocks(mark.x,0,size);
+									UNTIL j = 0;
 									INC(i)
 									INC(i)
-								ELSE 
-									bad := TRUE;
-									marksup.x[i] := 0;
+								ELSE bad := TRUE
 								END;
 								END;
 								IF bad THEN
 								IF bad THEN
 									IF i = 0 THEN hd.aleng := SectorTableSize-1
 									IF i = 0 THEN hd.aleng := SectorTableSize-1
 									ELSE hd.aleng := SectorTableSize + (i-1) * IndexSize
 									ELSE hd.aleng := SectorTableSize + (i-1) * IndexSize
 									END
 									END
 								END
 								END
-							END;
-							vol.MarkBlocks(marksup.x,0,n);
+							END
 						END
 						END
 					END;
 					END;
 					IF bad THEN
 					IF bad THEN
@@ -458,7 +465,8 @@ TYPE
 						PutSector(vol, A[L], hd)
 						PutSector(vol, A[L], hd)
 					END;
 					END;
 					INC(L)
 					INC(L)
-				END
+				END;
+				FinishMarking;
 			END MarkSectors;
 			END MarkSectors;
 
 
 			PROCEDURE TraverseDir(dpg: DiskAdr);
 			PROCEDURE TraverseDir(dpg: DiskAdr);