codetools: when a single file is invalidated then invalidate the directory in the directorycacher

git-svn-id: trunk@30883 -
This commit is contained in:
mattias 2011-05-24 09:26:42 +00:00
parent 2946723366
commit c46036889e
3 changed files with 35 additions and 11 deletions

View File

@ -143,6 +143,7 @@ type
procedure SetStrings(const AStringType: TCTDirCacheString;
const AValue: string);
procedure ClearUnitLinks;
procedure ClearListing;
procedure UpdateListing;
function GetUnitSourceCacheValue(const UnitSrc: TCTDirectoryUnitSources;
const Search: string; var Filename: string): boolean;
@ -202,7 +203,8 @@ type
FOnGetUnitFromSet: TCTGetUnitFromSet;
FOnIterateFPCUnitsFromSet: TCTIterateFPCUnitsFromSet;
procedure DoRemove(ACache: TCTDirectoryCache);
procedure OnFileStateCacheChangeTimeStamp(Sender: TObject);
procedure OnFileStateCacheChangeTimeStamp(Sender: TObject;
const AFilename: string);
public
constructor Create;
destructor Destroy; override;
@ -518,6 +520,11 @@ begin
FUnitLinksTree:=nil
end;
procedure TCTDirectoryCache.ClearListing;
begin
FListing.Clear;
end;
procedure TCTDirectoryCache.UpdateListing;
var
WorkingListing: PWorkFileInfo;
@ -534,7 +541,7 @@ begin
if (FListing<>nil) and (FListing.FileTimeStamp=Pool.FileTimeStamp) then exit;
if FListing=nil then
FListing:=TCTDirectoryListing.Create;
FListing.Clear;
ClearListing;
FListing.FileTimeStamp:=Pool.FileTimeStamp;
if Directory='' then exit;// virtual directory
@ -1243,9 +1250,20 @@ begin
FDirectories.Remove(ACache);
end;
procedure TCTDirectoryCachePool.OnFileStateCacheChangeTimeStamp(Sender: TObject);
procedure TCTDirectoryCachePool.OnFileStateCacheChangeTimeStamp(
Sender: TObject; const AFilename: string);
var
Dir: String;
Cache: TCTDirectoryCache;
begin
IncreaseFileTimeStamp;
if AFilename='' then
IncreaseFileTimeStamp
else if FilenameIsAbsolute(AFilename) then begin
Dir:=ExtractFileName(AFilename);
Cache:=GetCache(Dir,false,false);
if Cache=nil then exit;
Cache.ClearListing;
end;
end;
constructor TCTDirectoryCachePool.Create;

View File

@ -201,6 +201,9 @@ type
property Age: longint read FAge;
end;
TOnChangeFileStateTimeStamp = procedure(Sender: TObject;
const AFilename: string) of object;
{ TFileStateCache }
TFileStateCache = class
@ -208,7 +211,7 @@ type
FFiles: TAVLTree; // tree of TFileStateCacheItem
FTimeStamp: int64;
FLockCount: integer;
FChangeTimeStampHandler: array of TNotifyEvent;
FChangeTimeStampHandler: array of TOnChangeFileStateTimeStamp;
procedure SetFlag(AFile: TFileStateCacheItem;
AFlag: TFileStateCacheItemFlag; NewValue: boolean);
public
@ -231,8 +234,8 @@ type
function Check(const Filename: string; AFlag: TFileStateCacheItemFlag;
out AFile: TFileStateCacheItem; var FlagIsSet: boolean): boolean;
procedure WriteDebugReport;
procedure AddChangeTimeStampHandler(const Handler: TNotifyEvent);
procedure RemoveChangeTimeStampHandler(const Handler: TNotifyEvent);
procedure AddChangeTimeStampHandler(const Handler: TOnChangeFileStateTimeStamp);
procedure RemoveChangeTimeStampHandler(const Handler: TOnChangeFileStateTimeStamp);
function CalcMemSize: PtrUint;
public
property TimeStamp: int64 read FTimeStamp;
@ -3246,14 +3249,14 @@ begin
if AFilename='' then begin
// invalidate all
CTIncreaseChangeStamp64(FTimeStamp);
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;
for i:=0 to length(FChangeTimeStampHandler)-1 do
FChangeTimeStampHandler[i](Self,AFilename);
//debugln('TFileStateCache.IncreaseTimeStamp FTimeStamp=',dbgs(FTimeStamp));
end;
@ -3407,14 +3410,15 @@ begin
debugln(FFiles.ReportAsString);
end;
procedure TFileStateCache.AddChangeTimeStampHandler(const Handler: TNotifyEvent);
procedure TFileStateCache.AddChangeTimeStampHandler(
const Handler: TOnChangeFileStateTimeStamp);
begin
SetLength(FChangeTimeStampHandler,length(FChangeTimeStampHandler)+1);
FChangeTimeStampHandler[length(FChangeTimeStampHandler)-1]:=Handler;
end;
procedure TFileStateCache.RemoveChangeTimeStampHandler(
const Handler: TNotifyEvent);
const Handler: TOnChangeFileStateTimeStamp);
var
i: Integer;
begin

View File

@ -34,6 +34,8 @@
- Target implementation
- Target interface
- Target program
- copy to clipboard
- paste from clipboard
}
unit DeclareVarDlg;