Jelajahi Sumber

Improved marking speed by combining several markings within an exclusive block

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@8297 8c9fc860-2736-0410-a75d-ab315db34111
felixf 7 tahun lalu
induk
melakukan
d46ad33c42
2 mengubah file dengan 20 tambahan dan 7 penghapusan
  1. 8 7
      source/DiskFS.Mod
  2. 12 0
      source/Files.Mod

+ 8 - 7
source/DiskFS.Mod

@@ -374,6 +374,7 @@ TYPE
 
 			PROCEDURE MarkSectors;
 			VAR L, R, i, j, n: LONGINT; x: DiskAdr; hd: FileHeader; sup, sub: IndexSector;
+				size: Files.TSize;
 
 				PROCEDURE sift(L, R: LONGINT);
 					VAR i, j: LONGINT; x: DiskAdr;
@@ -416,17 +417,17 @@ TYPE
 							WHILE (i <= n) & ~bad DO
 								IF sup.x[i] # 0 THEN
 									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
+									IF i < n THEN size := IndexSize
+									ELSE size := (hd.aleng - SectorTableSize) MOD IndexSize + 1
 									END;
-									REPEAT
-										DEC(j);
+									FOR j := 0 TO size-1 DO
 										IF (sub.x[j] MOD SectorFactor = 0) & (sub.x[j] > 0) THEN
-											MarkSector(vol, sub.x[j])
+											sub.x[j] := sub.x[j] DIV SectorFactor;
 										ELSE
 											bad := TRUE
 										END
-									UNTIL j = 0;
+									END;
+									vol.MarkBlocks(sub.x,0,size);
 									INC(i)
 								ELSE bad := TRUE
 								END;
@@ -992,7 +993,7 @@ TYPE
 		END Write;
 
 		PROCEDURE WriteBytes*(VAR r: Files.Rider; CONST x: ARRAY OF CHAR; ofs, len: LONGINT);
-		VAR src, dst: ADDRESS; m: LONGINT; buf: Buffer;
+		VAR dst: ADDRESS; m: LONGINT; buf: Buffer;
 		BEGIN {EXCLUSIVE}
 			IF LEN(x)-ofs < len THEN SYSTEM.HALT(19) END;
 			IF len > 0 THEN

+ 12 - 0
source/Files.Mod

@@ -219,6 +219,18 @@ TYPE
 			INCL(map[adr DIV SetSize], adr MOD SetSize);
 			INC(used)
 		END MarkBlock;
+		
+		PROCEDURE MarkBlocks*(CONST a: ARRAY OF Address; ofs, size: TSize);
+		VAR i: SIZE;  adr: Address;
+		BEGIN {EXCLUSIVE}
+			IF ReadOnly IN flags THEN HALT(ReadOnlyError) END;
+			FOR i := ofs TO ofs + size -1 DO
+				adr := a[i];
+				IF (adr < 1) OR (adr > size) THEN HALT(InvalidAdr) END;
+				INCL(map[adr DIV SetSize], adr MOD SetSize);
+			END;
+			INC(used, size);
+		END MarkBlocks;
 
 		PROCEDURE Marked*(adr: Address): BOOLEAN;
 		BEGIN {EXCLUSIVE}