Browse Source

improved marking speed further

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@8304 8c9fc860-2736-0410-a75d-ab315db34111
felixf 7 years ago
parent
commit
ef19980a3f
2 changed files with 23 additions and 9 deletions
  1. 18 7
      source/DiskFS.Mod
  2. 5 2
      source/Files.Mod

+ 18 - 7
source/DiskFS.Mod

@@ -402,28 +402,38 @@ TYPE
 						j := hd.aleng + 1;
 						REPEAT
 							DEC(j);
-							IF hd.sec[j] # 0 THEN MarkSector(vol, hd.sec[j]) ELSE hd.aleng := j-1; bad := TRUE END
-						UNTIL j = 0
+							IF hd.sec[j] # 0 THEN hd.sec[j] := hd.sec[j] DIV SectorFactor; (* preparation for block marking *)
+							ELSE hd.aleng := j-1; bad := TRUE 
+							END
+						UNTIL j = 0;
+						vol.MarkBlocks(hd.sec,0,hd.aleng+1); 
 					ELSE
 						j := SectorTableSize;
 						REPEAT
 							DEC(j);
-							IF hd.sec[j] # 0 THEN MarkSector(vol, hd.sec[j]) ELSE hd.aleng := j-1; bad := TRUE END
+							IF hd.sec[j] # 0 THEN 
+								hd.sec[j] := hd.sec[j] DIV SectorFactor; (* preparation for block marking *)
+							ELSE hd.aleng := j-1; bad := TRUE 
+							END
 						UNTIL j = 0;
+						vol.MarkBlocks(hd.sec,0,SectorTableSize); 
 						IF hd.ext = 0 THEN hd.aleng := SectorTableSize-1; bad := TRUE END;
 						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;
 							WHILE (i <= n) & ~bad DO
 								IF sup.x[i] # 0 THEN
-									MarkSector(vol, sup.x[i]); GetSector(vol, sup.x[i], sub);
+									GetSector(vol, sup.x[i], sub);
+									sup.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
 									END;
 									FOR j := 0 TO size-1 DO
 										IF (sub.x[j] MOD SectorFactor = 0) & (sub.x[j] > 0) THEN
-											sub.x[j] := sub.x[j] DIV SectorFactor;
+											sub.x[j] := sub.x[j] DIV SectorFactor; (* preparation for block marking *)
 										ELSE
+											sub.x[j] := 0; 
 											bad := TRUE
 										END
 									END;
@@ -436,7 +446,8 @@ TYPE
 									ELSE hd.aleng := SectorTableSize + (i-1) * IndexSize
 									END
 								END
-							END
+							END;
+							vol.MarkBlocks(sup.x,0,n);
 						END
 					END;
 					IF bad THEN

+ 5 - 2
source/Files.Mod

@@ -226,8 +226,11 @@ TYPE
 			IF ReadOnly IN flags THEN HALT(ReadOnlyError) END;
 			FOR i := ofs TO ofs + len -1 DO
 				adr := a[i];
-				IF (adr < 1) OR (adr > size) THEN HALT(InvalidAdr) END;
-				INCL(map[adr DIV SetSize], adr MOD SetSize);
+				IF (adr = 0 ) THEN (* do nothing -- error should have been handled outside *)
+				ELSE 
+					IF (adr < 1) OR (adr > size) THEN HALT(InvalidAdr) END;
+					INCL(map[adr DIV SetSize], adr MOD SetSize);
+				END;
 			END;
 			INC(used, len);
 		END MarkBlocks;