mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-12-03 11:37:21 +01:00
codetools: when writing to an existing file: invalidate file cache only for that file
git-svn-id: trunk@24347 -
This commit is contained in:
parent
0060d87d21
commit
cc85994222
@ -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;
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user