Difference between revisions of "TCache"
From Ultibo.org
(Created page with "Return to Unit Filesystem __TOC__ === Description === ---- ''To be documented'' === Class definitions === ---- <div class="toccolours mw-collapsible...") |
(No difference)
|
Latest revision as of 04:36, 17 May 2018
Return to Unit Filesystem
Description
To be documented
Class definitions
TCache = class(TObject)
Note: A simple block cache with Read Only/Read Write modes and Free/Clean/Dirty page tracking. (No longer used) | |
constructor Create(ADriver:TFileSysDriver);
|
|
destructor Destroy; override;
|
|
private
| |
FDriver:TFileSysDriver;
|
|
FLock:TCriticalSectionHandle;
|
|
FBuffer:Pointer;
|
|
FPageSize:LongWord;
|
|
FPageCount:LongWord;
|
|
FCacheSize:LongWord;
|
|
FCacheMode:TCacheMode;
|
|
FCacheState:TCacheState;
|
|
FCacheTimeout:LongWord;
|
|
FReadCached:Int64;
|
|
FReadDirect:Int64;
|
|
FWriteBack:Int64;
|
|
FWriteThrough:Int64;
|
|
FWriteDirect:Int64;
|
|
FHitCount:Int64;
|
|
FMissCount:Int64;
|
|
FFailCount:Int64;
|
|
FSuccessCount:Int64;
|
|
FFlushCount:Int64;
|
|
FDiscardCount:Int64;
|
|
FUnknownCount:Int64;
|
|
FFirstPage:TCachePage;
|
First Cache Page (Any State) |
FLastPage:TCachePage;
|
Last Cache Page (Any State) |
FFirstEmpty:TCachePage;
|
First Free Page |
FLastEmpty:TCachePage;
|
Last Free Page |
FFirstClean:TCachePage;
|
First Clean Page (Used with no Write pending) |
FLastClean:TCachePage;
|
Last Clean Page (Used with no Write pending) |
FFirstDirty:TCachePage;
|
First Dirty Page (Used with Write pending) |
FLastDirty:TCachePage;
|
Last Dirty Page (Used with Write pending) |
FTimer:TCacheTimer;
|
|
FThread:TCacheThread;
|
|
function AcquireLock:Boolean;
|
|
function ReleaseLock:Boolean;
|
|
function AddPage(APage:TCachePage):Boolean;
|
|
function RemovePage(APage:TCachePage):Boolean;
|
|
function AddEmpty(APage:TCachePage):Boolean;
|
|
function AddClean(APage:TCachePage):Boolean;
|
|
function AddDirty(APage:TCachePage):Boolean;
|
|
function AddUnknown(APage:TCachePage):Boolean;
|
|
function UpdateClean(APage:TCachePage):Boolean;
|
|
function UpdateDirty(APage:TCachePage):Boolean;
|
|
function RoundPageSize(APageSize:LongWord):LongWord;
|
|
function RoundCacheSize(ACacheSize,APageSize:LongWord):LongWord;
|
|
function LinkPage(APage:TCachePage):Boolean;
|
|
function UnlinkPage(APage:TCachePage):Boolean;
|
|
function LinkEmpty(APage:TCachePage):Boolean;
|
|
function UnlinkEmpty(APage:TCachePage):Boolean;
|
|
function LinkClean(APage:TCachePage):Boolean;
|
|
function UnlinkClean(APage:TCachePage):Boolean;
|
|
function LinkDirty(APage:TCachePage):Boolean;
|
|
function UnlinkDirty(APage:TCachePage):Boolean;
|
|
public
| |
property PageSize:LongWord read FPageSize;
|
|
property PageCount:LongWord read FPageCount;
|
|
property CacheSize:LongWord read FCacheSize;
|
|
property CacheMode:TCacheMode read FCacheMode;
|
|
property CacheState:TCacheState read FCacheState;
|
|
property CacheTimeout:LongWord read FCacheTimeout;
|
|
property ReadCached:Int64 read FReadCached;
|
|
property ReadDirect:Int64 read FReadDirect;
|
|
property WriteBack:Int64 read FWriteBack;
|
|
property WriteThrough:Int64 read FWriteThrough;
|
|
property WriteDirect:Int64 read FWriteDirect;
|
|
property HitCount:Int64 read FHitCount;
|
|
property MissCount:Int64 read FMissCount;
|
|
property FailCount:Int64 read FFailCount;
|
|
property SuccessCount:Int64 read FSuccessCount;
|
|
property FlushCount:Int64 read FFlushCount;
|
|
property DiscardCount:Int64 read FDiscardCount;
|
|
property UnknownCount:Int64 read FUnknownCount;
|
|
function OpenCache(ACacheSize,APageSize:LongWord; ACacheMode:TCacheMode):Boolean;
|
|
function CloseCache:Boolean;
|
|
function DeviceRead(ADevice:TDiskDevice; ASector:LongWord; ACount:Word; var ABuffer):Boolean;
|
|
function DeviceErase(ADevice:TDiskDevice; ASector:LongWord; ACount:Word):Boolean;
|
|
function GetDevicePage(ADevice:TDiskDevice; ASector:LongWord):TCachePage; virtual;
|
|
function GetEmptyPage:TCachePage;
|
|
function AllocDevicePage(ADevice:TDiskDevice; ASector:LongWord; AWrite:Boolean):TCachePage; virtual;
|
|
function DiscardPage(APage:TCachePage):Boolean;
|
|
function DiscardCache(AFirst,AAll:Boolean):Boolean;
|
|
function ReleaseDevicePages(ADevice:TDiskDevice):Boolean;
|
|
function FlushPage(APage:TCachePage):Boolean;
|
|
function FlushPageEx(APage:TCachePage):Boolean;
|
|
function FlushCache(AFirst,AAll:Boolean):Boolean;
|
|
function CheckTimer:Boolean;
|
|
function ProcessTimer:Boolean;
|
|
function SchedulePage(APage:TCachePage; ATimeout:LongWord):Boolean;
|
|
function UnschedulePage(APage:TCachePage):Boolean;
|
Function declarations
constructor TCache.Create(ADriver:TFileSysDriver);
Description: To be documented
Note | None documented |
---|
destructor TCache.Destroy;
Description: To be documented
Note | None documented |
---|
function TCache.AcquireLock:Boolean;
Description: To be documented
Note | None documented |
---|
function TCache.ReleaseLock:Boolean;
Description: To be documented
Note | None documented |
---|
function TCache.AddPage(APage:TCachePage):Boolean;
Description: Add a new page to the Page list and the Empty list
Note | None documented |
---|
function TCache.RemovePage(APage:TCachePage):Boolean;
Description: Remove a Page from the Page list and any other lists then Free the Page
Note | None documented |
---|
function TCache.AddEmpty(APage:TCachePage):Boolean;
Description: Add a Page to the Empty list, removing from other lists if needed
Note | None documented |
---|
function TCache.AddClean(APage:TCachePage):Boolean;
Description: Add a Page to the Clean list, removing from other lists if needed
Note | None documented |
---|
function TCache.AddDirty(APage:TCachePage):Boolean;
Description: Add a Page to the Dirty list, removing from other lists if needed
Note | None documented |
---|
function TCache.AddUnknown(APage:TCachePage):Boolean;
Description: Make a Page Unknown by removing from any other lists if needed
Note | None documented |
---|
function TCache.UpdateClean(APage:TCachePage):Boolean;
Description: Move a Page to the end of the Clean list
Note | None documented |
---|
function TCache.UpdateDirty(APage:TCachePage):Boolean;
Description: Move a Page to the end of the Dirty list
Note | None documented |
---|
function TCache.RoundPageSize(APageSize:LongWord):LongWord;
Description: Round Page Size to the power of 2 of Sector Size
Note | Caller must hold the lock |
---|
function TCache.RoundCacheSize(ACacheSize,APageSize:LongWord):LongWord;
Description: Round Cache Size to the next multiple of Page Size
Note | Caller must hold the lock |
---|
function TCache.LinkPage(APage:TCachePage):Boolean;
Description: Link APage to PrevPage,NextPage siblings and Adjust FirstPage/LastPage
Note | Caller must hold the lock |
---|
function TCache.UnlinkPage(APage:TCachePage):Boolean;
Description: Unlink APage from PrevPage,NextPage Siblings and Adjust FirstPage/LastPage
Note | Caller must hold the lock |
---|
function TCache.LinkEmpty(APage:TCachePage):Boolean;
Description: Link APage to PrevLink,NextLink siblings and Adjust FirstEmpty/LastEmpty
Note | Caller must hold the lock |
---|
function TCache.UnlinkEmpty(APage:TCachePage):Boolean;
Description: Unlink APage from PrevLink,NextLink Siblings and Adjust FirstEmpty/LastEmpty
Note | Caller must hold the lock |
---|
function TCache.LinkClean(APage:TCachePage):Boolean;
Description: Link APage to PrevLink,NextLink siblings and Adjust FirstClean/LastClean
Note | Caller must hold the lock |
---|
function TCache.UnlinkClean(APage:TCachePage):Boolean;
Description: Unlink APage from PrevLink,NextLink Siblings and Adjust FirstClean/LastClean
Note | Caller must hold the lock |
---|
function TCache.LinkDirty(APage:TCachePage):Boolean;
Description: Link APage to PrevLink,NextLink siblings and Adjust FirstDirty/LastDirty
Note | Caller must hold the lock |
---|
function TCache.UnlinkDirty(APage:TCachePage):Boolean;
Description: Unlink APage from PrevLink,NextLink Siblings and Adjust FirstDirty/LastDirty
Note | None documented |
---|
function TCache.PrepareDeviceWrite(ADevice:TDiskDevice; APage:TCachePage; ASector,ACount:LongWord):Boolean;
Description: Prepare a Cache Page for Write by ensuring that required sectors are cached
Sector | Passed Sector will be the starting sector for the write to this Page |
---|---|
Count | Passed Count will be the write count to this Page (Calculated by caller) |
Note | Only called internally by DeviceWrite
Caller must hold the lock |
function TCache.CalculateDevicePage(ADevice:TDiskDevice; ASector:LongWord; var ACount:LongWord):Boolean;
Description: Calculate the number of sectors remaining in a page given the starting sector
Note | Only called internally by DeviceRead/DeviceWrite/DeviceErase
Caller must hold the lock |
---|
function TCache.OpenCache(ACacheSize,APageSize:LongWord; ACacheMode:TCacheMode):Boolean;
Description: Allocate the Memory, Create the Empty Pages and Open Cache
Note | None documented |
---|
function TCache.CloseCache:Boolean;
Description: Flush all Dirty Pages, Release the Memory and Close the Cache
Note | None documented |
---|
function TCache.DeviceRead(ADevice:TDiskDevice; ASector,ACount:LongWord; var ABuffer):Boolean;
Description: Read Data from the Physical Device using either Cached or Direct access
Note | AllocDevicePage does all checks for Size, Sector and Count. |
---|
function TCache.DeviceWrite(ADevice:TDiskDevice; ASector,ACount:LongWord; const ABuffer):Boolean;
Description: Write Data to the Physical Device using either Cached or Direct access
Note | AllocDevicePage does all checks for Size, Sector and Count. |
---|
function TCache.DeviceErase(ADevice:TDiskDevice; ASector,ACount:LongWord):Boolean;
Description: Erase Data from the Physical Device and update cached pages accordingly
Note | None documented |
---|
function TCache.GetDevicePage(ADevice:TDiskDevice; ASector:LongWord):TCachePage;
Description: Get the Clean or Dirty Page that contains this Sector on this Device
Note | None documented |
---|
function TCache.GetEmptyPage:TCachePage;
Description: Get the First Empty Page, Discard First Clean Page if none Empty
Note | None documented |
---|
function TCache.AllocDevicePage(ADevice:TDiskDevice; ASector:LongWord; AWrite:Boolean):TCachePage;
Description: Allocate an Empty Page to the Device and mark as Clean or Dirty
Note | None documented |
---|
function TCache.DiscardPage(APage:TCachePage):Boolean;
Description: Return a Clean Page to Empty
Note | None documented |
---|
function TCache.DiscardCache(AFirst,AAll:Boolean):Boolean;
Description: Find any Clean Pages older than CacheTimeout and Discard them
Note | None documented |
---|
function TCache.ReleaseDevicePages(ADevice:TDiskDevice):Boolean;
Description: Return all Clean or Dirty Pages on the Device to Empty
Note | None documented |
---|
function TCache.FlushPage(APage:TCachePage):Boolean;
Description: Return a Dirty Page to Clean
Note | None documented |
---|
function TCache.FlushPageEx(APage:TCachePage):Boolean;
Description: Return a Dirty Page to Clean if it is older than CacheTimeout
Note | Only called by CacheThread with page scheduled from CacheTimer |
---|
function TCache.FlushCache(AFirst,AAll:Boolean):Boolean;
Description: Find any Dirty Pages older than CacheTimeout and Flush them
Note | None documented |
---|
function TCache.CheckTimer:Boolean;
Description: To be documented
Note | None documented |
---|
function TCache.ProcessTimer:Boolean;
Description: To be documented
Note | None documented |
---|
function TCache.SchedulePage(APage:TCachePage; ATimeout:LongWord):Boolean;
Description: To be documented
Note | None documented |
---|
function TCache.UnschedulePage(APage:TCachePage):Boolean;
Description: To be documented
Note | None documented |
---|
Return to Unit Reference