codetools: when writing to an existing file: invalidate file cache only for that file

git-svn-id: trunk@24347 -
This commit is contained in:
mattias 2010-04-01 12:04:21 +00:00
parent 0060d87d21
commit cc85994222
3 changed files with 29 additions and 19 deletions

View File

@ -196,9 +196,9 @@ type
procedure Lock;
procedure Unlock;
function Locked: boolean;
procedure IncreaseTimeStamp;
function FileExistsCached(const Filename: string): boolean;
function DirPathExistsCached(const Filename: string): boolean;
procedure IncreaseTimeStamp(const AFilename: string);
function FileExistsCached(const AFilename: string): boolean;
function DirPathExistsCached(const AFilename: string): boolean;
function DirectoryIsWritableCached(const DirectoryName: string): boolean;
function FileIsExecutableCached(const AFilename: string): boolean;
function FileIsReadableCached(const AFilename: string): boolean;
@ -229,7 +229,7 @@ function FileIsWritableCached(const AFilename: string): boolean;
function FileIsTextCached(const AFilename: string): boolean;
function FileAgeCached(const AFileName: string): Longint;
procedure InvalidateFileStateCache;
procedure InvalidateFileStateCache(const Filename: string = '');
function CompareFileStateItems(Data1, Data2: Pointer): integer;
function CompareFilenameWithFileStateCacheItem(Key, Data: Pointer): integer;
@ -621,7 +621,7 @@ var
begin
if FileExistsUTF8(Filename) then begin
try
InvalidateFileStateCache;
InvalidateFileStateCache(Filename);
fs:=TFileStream.Create(UTF8ToSys(Filename),fmOpenWrite);
fs.Size:=0;
fs.Free;
@ -650,7 +650,7 @@ begin
fs.Write(s[1],length(s));
fs.Free;
if not DeleteFileUTF8(TempFilename) then
InvalidateFileStateCache;
InvalidateFileStateCache(TempFilename);
Result:=true;
except
end;
@ -2829,9 +2829,9 @@ begin
Result:=FileStateCache.FileAgeCached(AFilename);
end;
procedure InvalidateFileStateCache;
procedure InvalidateFileStateCache(const Filename: string);
begin
FileStateCache.IncreaseTimeStamp;
FileStateCache.IncreaseTimeStamp(Filename);
end;
function CompareFileStateItems(Data1, Data2: Pointer): integer;
@ -2925,27 +2925,35 @@ begin
Result:=FLockCount>0;
end;
procedure TFileStateCache.IncreaseTimeStamp;
procedure TFileStateCache.IncreaseTimeStamp(const AFilename: string);
var
i: Integer;
AFile: TFileStateCacheItem;
begin
if Self<>nil then begin
if Self=nil then exit;
if AFilename='' then begin
// invalidate all
if FTimeStamp<maxLongint then
inc(FTimeStamp)
else
FTimeStamp:=-maxLongint;
for i:=0 to length(FChangeTimeStampHandler)-1 do
FChangeTimeStampHandler[i](Self);
end else begin
// invalidate single file
AFile:=FindFile(AFilename,false);
if AFile<>nil then
AFile.FTestedFlags:=[];
end;
//debugln('TFileStateCache.IncreaseTimeStamp FTimeStamp=',dbgs(FTimeStamp));
end;
function TFileStateCache.FileExistsCached(const Filename: string): boolean;
function TFileStateCache.FileExistsCached(const AFilename: string): boolean;
var
AFile: TFileStateCacheItem;
begin
Result := False;
if Check(Filename,fsciExists,AFile,Result) then exit;
if Check(AFilename,fsciExists,AFile,Result) then exit;
Result:=FileExistsUTF8(AFile.Filename);
SetFlag(AFile,fsciExists,Result);
{if not Check(Filename,fsciExists,AFile,Result) then begin
@ -2954,12 +2962,12 @@ begin
end;}
end;
function TFileStateCache.DirPathExistsCached(const Filename: string): boolean;
function TFileStateCache.DirPathExistsCached(const AFilename: string): boolean;
var
AFile: TFileStateCacheItem;
begin
Result := False;
if Check(Filename,fsciDirectory,AFile,Result) then exit;
if Check(AFilename,fsciDirectory,AFile,Result) then exit;
Result:=DirPathExists(AFile.Filename);
SetFlag(AFile,fsciDirectory,Result);
end;

View File

@ -824,16 +824,18 @@ begin
{$ENDIF}
Result := True;
try
InvalidateFileStateCache;
// keep filename case on disk
TheFilename := FindDiskFilename(Filename);
if FileExistsUTF8(TheFilename) then
begin
InvalidateFileStateCache(TheFilename);
fs := TFileStream.Create(UTF8ToSys(TheFilename), fmOpenWrite or fmShareDenyNone);
fs.Size := 0;
end
else
else begin
InvalidateFileStateCache; // invalidate all (samba shares)
fs := TFileStream.Create(UTF8ToSys(TheFilename), fmCreate);
end;
try
s := Source;
EncodeSaving(Filename, s);

View File

@ -108,7 +108,7 @@ function CheckPathDelim(const OldPathDelim: string; out Changed: boolean): TPath
function ChompEndNumber(const s: string): string;
// file stats
procedure InvalidateFileStateCache;
procedure InvalidateFileStateCache(const AFilename: string = '');
function FileExistsCached(const Filename: string): boolean;
function DirPathExistsCached(const Filename: string): boolean;
function DirectoryIsWritableCached(const DirectoryName: string): boolean;
@ -1035,9 +1035,9 @@ begin
Result:=FileProcs.FilenameIsMatching(Mask,Filename,MatchExactly);
end;
procedure InvalidateFileStateCache;
procedure InvalidateFileStateCache(const AFilename: string);
begin
FileStateCache.IncreaseTimeStamp;
FileProcs.InvalidateFileStateCache(AFilename);
end;
function FileExistsCached(const Filename: string): boolean;