mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-30 21:50:18 +02:00
codetools: directory cacher: using integer stamps, fixed invalidate for single directories
git-svn-id: trunk@30884 -
This commit is contained in:
parent
c46036889e
commit
fbe7f6e288
@ -1066,6 +1066,7 @@ begin
|
|||||||
Modified:=false;
|
Modified:=false;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
//debugln(['TCodeBuffer.SaveToFile FileOnDiskHasChanged=',FileOnDiskHasChanged,' LoadDate=',LoadDate,' FileAgeCached=',FileAgeCached(Filename)]);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TCodeBuffer.Reload: boolean;
|
function TCodeBuffer.Reload: boolean;
|
||||||
|
@ -62,7 +62,7 @@ type
|
|||||||
|
|
||||||
TCTDirCacheStringRecord = record
|
TCTDirCacheStringRecord = record
|
||||||
Value: string;
|
Value: string;
|
||||||
ConfigTimeStamp: cardinal;
|
ConfigTimeStamp: integer;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
TCTDirectoryUnitSources = (
|
TCTDirectoryUnitSources = (
|
||||||
@ -99,8 +99,8 @@ type
|
|||||||
|
|
||||||
TCTDirCacheUnitSrcRecord = record
|
TCTDirCacheUnitSrcRecord = record
|
||||||
Files: TStringToStringTree;
|
Files: TStringToStringTree;
|
||||||
ConfigTimeStamp: Cardinal;
|
ConfigTimeStamp: integer;
|
||||||
FileTimeStamp: cardinal;
|
FileTimeStamp: integer;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
TCTDirectoryListingTime = longint;
|
TCTDirectoryListingTime = longint;
|
||||||
@ -110,7 +110,7 @@ type
|
|||||||
|
|
||||||
TCTDirectoryListing = class
|
TCTDirectoryListing = class
|
||||||
public
|
public
|
||||||
FileTimeStamp: cardinal;
|
FileTimeStamp: integer;
|
||||||
Files: PChar; { all filenames: each: time:TCTDirectoryListingTime+filename+#0
|
Files: PChar; { all filenames: each: time:TCTDirectoryListingTime+filename+#0
|
||||||
sorted: first case insensitive then sensitive }
|
sorted: first case insensitive then sensitive }
|
||||||
Count: integer; // number of filenames
|
Count: integer; // number of filenames
|
||||||
@ -136,14 +136,13 @@ type
|
|||||||
FRefCount: integer;
|
FRefCount: integer;
|
||||||
FStrings: array[TCTDirCacheString] of TCTDirCacheStringRecord;
|
FStrings: array[TCTDirCacheString] of TCTDirCacheStringRecord;
|
||||||
FUnitLinksTree: TAVLTree; // tree of TUnitFileNameLink
|
FUnitLinksTree: TAVLTree; // tree of TUnitFileNameLink
|
||||||
FUnitLinksTreeTimeStamp: cardinal;
|
FUnitLinksTreeTimeStamp: integer;
|
||||||
FListing: TCTDirectoryListing;
|
FListing: TCTDirectoryListing;
|
||||||
FUnitSources: array[TCTDirectoryUnitSources] of TCTDirCacheUnitSrcRecord;
|
FUnitSources: array[TCTDirectoryUnitSources] of TCTDirCacheUnitSrcRecord;
|
||||||
function GetStrings(const AStringType: TCTDirCacheString): string;
|
function GetStrings(const AStringType: TCTDirCacheString): string;
|
||||||
procedure SetStrings(const AStringType: TCTDirCacheString;
|
procedure SetStrings(const AStringType: TCTDirCacheString;
|
||||||
const AValue: string);
|
const AValue: string);
|
||||||
procedure ClearUnitLinks;
|
procedure ClearUnitLinks;
|
||||||
procedure ClearListing;
|
|
||||||
procedure UpdateListing;
|
procedure UpdateListing;
|
||||||
function GetUnitSourceCacheValue(const UnitSrc: TCTDirectoryUnitSources;
|
function GetUnitSourceCacheValue(const UnitSrc: TCTDirectoryUnitSources;
|
||||||
const Search: string; var Filename: string): boolean;
|
const Search: string; var Filename: string): boolean;
|
||||||
@ -173,6 +172,7 @@ type
|
|||||||
AnyCase: boolean): string;
|
AnyCase: boolean): string;
|
||||||
procedure IterateFPCUnitsInSet(const Iterate: TCTOnIterateFile);
|
procedure IterateFPCUnitsInSet(const Iterate: TCTOnIterateFile);
|
||||||
procedure WriteListing;
|
procedure WriteListing;
|
||||||
|
procedure Invalidate; inline;
|
||||||
public
|
public
|
||||||
property Directory: string read FDirectory;
|
property Directory: string read FDirectory;
|
||||||
property RefCount: integer read FRefCount;
|
property RefCount: integer read FRefCount;
|
||||||
@ -194,8 +194,8 @@ type
|
|||||||
|
|
||||||
TCTDirectoryCachePool = class
|
TCTDirectoryCachePool = class
|
||||||
private
|
private
|
||||||
FConfigTimeStamp: cardinal;
|
FConfigTimeStamp: integer;
|
||||||
FFileTimeStamp: cardinal;
|
FFileTimeStamp: integer;
|
||||||
FDirectories: TAVLTree;// tree of TCTDirectoryCache
|
FDirectories: TAVLTree;// tree of TCTDirectoryCache
|
||||||
FOnFindVirtualFile: TCTDirCacheFindVirtualFile;
|
FOnFindVirtualFile: TCTDirCacheFindVirtualFile;
|
||||||
FOnGetCompiledUnitFromSet: TCTGetCompiledUnitFromSet;
|
FOnGetCompiledUnitFromSet: TCTGetCompiledUnitFromSet;
|
||||||
@ -214,8 +214,8 @@ type
|
|||||||
DoReference: boolean = true): TCTDirectoryCache;
|
DoReference: boolean = true): TCTDirectoryCache;
|
||||||
function GetString(const Directory: string; AStringType: TCTDirCacheString;
|
function GetString(const Directory: string; AStringType: TCTDirCacheString;
|
||||||
UseCache: boolean = true): string;
|
UseCache: boolean = true): string;
|
||||||
procedure IncreaseFileTimeStamp;
|
procedure IncreaseFileTimeStamp; inline;
|
||||||
procedure IncreaseConfigTimeStamp;
|
procedure IncreaseConfigTimeStamp; inline;
|
||||||
function FileExists(Filename: string): boolean;
|
function FileExists(Filename: string): boolean;
|
||||||
function FileAge(Filename: string): TCTDirectoryListingTime;
|
function FileAge(Filename: string): TCTDirectoryListingTime;
|
||||||
function FindUnitInUnitLinks(const Directory, AUnitName: string): string;
|
function FindUnitInUnitLinks(const Directory, AUnitName: string): string;
|
||||||
@ -236,8 +236,8 @@ type
|
|||||||
AnyCase: boolean = false): string;
|
AnyCase: boolean = false): string;
|
||||||
function FindCompiledUnitInPath(const BaseDirectory, UnitPath, AnUnitname: string;
|
function FindCompiledUnitInPath(const BaseDirectory, UnitPath, AnUnitname: string;
|
||||||
AnyCase: boolean = false): string; // result is not cached!
|
AnyCase: boolean = false): string; // result is not cached!
|
||||||
property FileTimeStamp: cardinal read FFileTimeStamp;
|
property FileTimeStamp: integer read FFileTimeStamp;
|
||||||
property ConfigTimeStamp: cardinal read FConfigTimeStamp;
|
property ConfigTimeStamp: integer read FConfigTimeStamp;
|
||||||
property OnGetString: TCTDirCacheGetString read FOnGetString write FOnGetString;
|
property OnGetString: TCTDirCacheGetString read FOnGetString write FOnGetString;
|
||||||
property OnFindVirtualFile: TCTDirCacheFindVirtualFile read FOnFindVirtualFile
|
property OnFindVirtualFile: TCTDirCacheFindVirtualFile read FOnFindVirtualFile
|
||||||
write FOnFindVirtualFile;
|
write FOnFindVirtualFile;
|
||||||
@ -520,11 +520,6 @@ begin
|
|||||||
FUnitLinksTree:=nil
|
FUnitLinksTree:=nil
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TCTDirectoryCache.ClearListing;
|
|
||||||
begin
|
|
||||||
FListing.Clear;
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure TCTDirectoryCache.UpdateListing;
|
procedure TCTDirectoryCache.UpdateListing;
|
||||||
var
|
var
|
||||||
WorkingListing: PWorkFileInfo;
|
WorkingListing: PWorkFileInfo;
|
||||||
@ -541,7 +536,7 @@ begin
|
|||||||
if (FListing<>nil) and (FListing.FileTimeStamp=Pool.FileTimeStamp) then exit;
|
if (FListing<>nil) and (FListing.FileTimeStamp=Pool.FileTimeStamp) then exit;
|
||||||
if FListing=nil then
|
if FListing=nil then
|
||||||
FListing:=TCTDirectoryListing.Create;
|
FListing:=TCTDirectoryListing.Create;
|
||||||
ClearListing;
|
FListing.Clear;
|
||||||
FListing.FileTimeStamp:=Pool.FileTimeStamp;
|
FListing.FileTimeStamp:=Pool.FileTimeStamp;
|
||||||
if Directory='' then exit;// virtual directory
|
if Directory='' then exit;// virtual directory
|
||||||
|
|
||||||
@ -1243,6 +1238,11 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TCTDirectoryCache.Invalidate;
|
||||||
|
begin
|
||||||
|
FListing.FileTimeStamp:=CTInvalidChangeStamp;
|
||||||
|
end;
|
||||||
|
|
||||||
{ TCTDirectoryCachePool }
|
{ TCTDirectoryCachePool }
|
||||||
|
|
||||||
procedure TCTDirectoryCachePool.DoRemove(ACache: TCTDirectoryCache);
|
procedure TCTDirectoryCachePool.DoRemove(ACache: TCTDirectoryCache);
|
||||||
@ -1259,18 +1259,19 @@ begin
|
|||||||
if AFilename='' then
|
if AFilename='' then
|
||||||
IncreaseFileTimeStamp
|
IncreaseFileTimeStamp
|
||||||
else if FilenameIsAbsolute(AFilename) then begin
|
else if FilenameIsAbsolute(AFilename) then begin
|
||||||
Dir:=ExtractFileName(AFilename);
|
Dir:=ExtractFilePath(AFilename);
|
||||||
Cache:=GetCache(Dir,false,false);
|
Cache:=GetCache(Dir,false,false);
|
||||||
|
//debugln(['TCTDirectoryCachePool.OnFileStateCacheChangeTimeStamp Dir="',Dir,'" Cache=',Cache<>nil]);
|
||||||
if Cache=nil then exit;
|
if Cache=nil then exit;
|
||||||
Cache.ClearListing;
|
Cache.Invalidate;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
constructor TCTDirectoryCachePool.Create;
|
constructor TCTDirectoryCachePool.Create;
|
||||||
begin
|
begin
|
||||||
FDirectories:=TAVLTree.Create(@CompareCTDirectoryCaches);
|
FDirectories:=TAVLTree.Create(@CompareCTDirectoryCaches);
|
||||||
FFileTimeStamp:=1;
|
FFileTimeStamp:=CTInvalidChangeStamp;
|
||||||
FConfigTimeStamp:=1;
|
FConfigTimeStamp:=CTInvalidChangeStamp;
|
||||||
if FileStateCache<>nil then
|
if FileStateCache<>nil then
|
||||||
FileStateCache.AddChangeTimeStampHandler(@OnFileStateCacheChangeTimeStamp);
|
FileStateCache.AddChangeTimeStampHandler(@OnFileStateCacheChangeTimeStamp);
|
||||||
end;
|
end;
|
||||||
@ -1344,19 +1345,13 @@ end;
|
|||||||
procedure TCTDirectoryCachePool.IncreaseFileTimeStamp;
|
procedure TCTDirectoryCachePool.IncreaseFileTimeStamp;
|
||||||
begin
|
begin
|
||||||
//DebugLn(['TCTDirectoryCachePool.IncreaseTimeStamp ']);
|
//DebugLn(['TCTDirectoryCachePool.IncreaseTimeStamp ']);
|
||||||
if FFileTimeStamp<>High(FFileTimeStamp) then
|
CTIncreaseChangeStamp(FFileTimeStamp);
|
||||||
inc(FFileTimeStamp)
|
|
||||||
else
|
|
||||||
FFileTimeStamp:=Low(FFileTimeStamp);
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TCTDirectoryCachePool.IncreaseConfigTimeStamp;
|
procedure TCTDirectoryCachePool.IncreaseConfigTimeStamp;
|
||||||
begin
|
begin
|
||||||
//DebugLn(['TCTDirectoryCachePool.IncreaseConfigTimeStamp ']);
|
//DebugLn(['TCTDirectoryCachePool.IncreaseConfigTimeStamp ']);
|
||||||
if FConfigTimeStamp<>High(FConfigTimeStamp) then
|
CTIncreaseChangeStamp(FConfigTimeStamp);
|
||||||
inc(FConfigTimeStamp)
|
|
||||||
else
|
|
||||||
FConfigTimeStamp:=Low(FConfigTimeStamp);
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TCTDirectoryCachePool.FileExists(Filename: string): boolean;
|
function TCTDirectoryCachePool.FileExists(Filename: string): boolean;
|
||||||
|
@ -2020,13 +2020,14 @@ end;
|
|||||||
|
|
||||||
function TUnitInfo.ChangedOnDisk(CompareOnlyLoadSaveTime: boolean): boolean;
|
function TUnitInfo.ChangedOnDisk(CompareOnlyLoadSaveTime: boolean): boolean;
|
||||||
begin
|
begin
|
||||||
Result:=(Source<>nil) and (Source.FileOnDiskHasChanged);
|
Result:=(Source<>nil) and Source.FileOnDiskHasChanged;
|
||||||
|
//if Result then debugln(['TUnitInfo.ChangedOnDisk ',Filename,' FileAgeCached=',FileAgeCached(Source.Filename)]);
|
||||||
if Result
|
if Result
|
||||||
and (not CompareOnlyLoadSaveTime)
|
and (not CompareOnlyLoadSaveTime)
|
||||||
and FIgnoreFileDateOnDiskValid
|
and FIgnoreFileDateOnDiskValid
|
||||||
and (FIgnoreFileDateOnDisk=Source.FileDateOnDisk) then
|
and (FIgnoreFileDateOnDisk=Source.FileDateOnDisk) then
|
||||||
Result:=false;
|
Result:=false;
|
||||||
if (not IsVirtual) and FileExistsUTF8(Filename) then
|
if (not IsVirtual) and FileExistsCached(Filename) then
|
||||||
FileReadOnly:=not FileIsWritableCached(Filename)
|
FileReadOnly:=not FileIsWritableCached(Filename)
|
||||||
else
|
else
|
||||||
FileReadOnly:=false;
|
FileReadOnly:=false;
|
||||||
|
Loading…
Reference in New Issue
Block a user