亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? myldbmemory.pas

?? 一個本地database引擎,支持中文T_Sql查詢,兼容DELPHI標準數(shù)據(jù)庫控件
?? PAS
字號:
unit MYLDBMemory;

{$I MYLDBVer.inc}
{DEFINE USEDELPHIMM}

interface

uses SysUtils, Classes, windows,
     MYLDBExcept, MYLDBConst;

type

 TMYLDBMemorySize = Int64; // 5.06

////////////////////////////////////////////////////////////////////////////////
//
// TMYLDBMemoryManager
//
////////////////////////////////////////////////////////////////////////////////

 TMYLDBMemoryManager = class (TObject)
  private
   FMaxMemorySize:        TMYLDBMemorySize;  // Max Memory Limit
   FTotalMemAllocated:    TMYLDBMemorySize;  // Total allocated memory
   FFreeSystemMemorySize: TMYLDBMemorySize;  // Free Memory size in system

   FAllocMemCallCount:    Int64;  // count of allocmem calls
   FGetMemCallCount:      Int64;  // count of getmem calls
   FFreeMemCallCount:     Int64;  // count of freemem calls
   FReallocMemCallCount:  Int64;  // count of reallocmem calls

   MMLock: TRTLCriticalSection;
  public
   // Constructor
   constructor Create; overload;
   // Constructor
   constructor Create(MaxMemorySize: TMYLDBMemorySize); overload;
   // Destructor
   destructor Destroy; override;
   // GetMem analog
   function GetMem(BufferSize: TMYLDBMemorySize): Pointer;
   // AllocMem analog
   function AllocMem(BufferSize: TMYLDBMemorySize): Pointer;
   // ReAllocMem analog
   procedure ReallocMem(var Buffer; BufferSize: TMYLDBMemorySize; ClearTail: Boolean = False);
   // ReAllocMem and clear Tail of Buffer
   procedure ReallocMemAndClearTail(var Buffer; BufferSize: TMYLDBMemorySize);
   // FreeMem and set pointer to nil
   procedure FreeAndNillMem(var Buffer);
   // FreeMem
   procedure FreeMem(const Buffer: Pointer);
   // Return buffer size
   function GetMemoryBufferSize(Buffer: Pointer): TMYLDBMemorySize;
   // Get min from free system memory size and (FMaxMemorySize - FTotalMemAllocated)
   function GetFreeMemorySize:  TMYLDBMemorySize;
  public
   property MaxMemorySize:        TMYLDBMemorySize read FMaxMemorySize;
   property TotalMemAllocated:    TMYLDBMemorySize read FTotalMemAllocated;
   // statistics usage
   property AllocMemCallCount:    Int64 read FAllocMemCallCount;
   property GetMemCallCount:      Int64 read FGetMemCallCount;
   property FreeMemCallCount:     Int64 read FFreeMemCallCount;
   property ReallocMemCallCount:  Int64 read FReallocMemCallCount;
 end; // TMYLDBMemoryManager

// Memory Manager variable
var MemoryManager: TMYLDBMemoryManager = nil;

// move memory block
procedure MYLDBMove(const Source; var Dest; count : Integer );

implementation

uses Math;


type
  TGetMemType = (gmtGetMem, gmtVirtualAlloc, gmtGlobalAlloc);

  // Memory Block Header
  PMYLDBMemoryBlockHeader = ^TMYLDBMemoryBlockHeader;
  TMYLDBMemoryBlockHeader = packed record
    Size: Integer;
    GetMemType: TGetMemType;
    Signature: Cardinal;  // Last 4 byte
  end;

  // Memory Block Footer
  PMYLDBMemoryBlockFooter = ^TMYLDBMemoryBlockFooter;
  TMYLDBMemoryBlockFooter = packed record
    Signature: Cardinal;  // = MYLDBMemoryEndSignature
  end;


const  MYLDBMemorySignature:    Cardinal = $ACCACCAC;
       MYLDBMemoryEndSignature: Cardinal = $ACCEACCE;

type
   TGetMemFunction = packed record
     Size: Integer;
     GetMemType: TGetMemType;
   end;

const

// If Enable MemChecker then use only GetMem function
{$IFDEF DEBUG_MEMCHECK}
   GetMemTypes: array[1..1] of TGetMemFunction =
      (
        (Size: MaxInt;  GetMemType: gmtGetMem)
      );
{$ELSE}
   GetMemTypes: array[1..4] of TGetMemFunction =
      (
        (Size: 726;   GetMemType: gmtGetMem),          // 0     - 1024  ==> GetMem
        (Size: 64500;  GetMemType: gmtGlobalAlloc),    // 1025  - 64500 ==> GlobalAlloc
        (Size: 1048576;  GetMemType: gmtGetMem),       // 64500 - 1 MB ...  ==> GetMem
        (Size: MaxInt;  GetMemType: gmtGlobalAlloc)    // 1 MB -  ...  ==> GlobalAlloc
      );
{$ENDIF}

function GetMemFunctionType(MemSize: Integer): TGetMemType;
var i: Integer;
begin
  // Set GetMem Function for Maximum Size
  Result := GetMemTypes[High(GetMemTypes)].GetMemType;
  // Find lower diapason
  for i:= High(GetMemTypes) downto Low(GetMemTypes)  do
    if (MemSize <= GetMemTypes[i].Size) then
     begin
      Result := GetMemTypes[i].GetMemType;
      Break;
     end;
end;

////////////////////////////////////////////////////////////////////////////////
//
// TMYLDBMemoryManager
//
////////////////////////////////////////////////////////////////////////////////


//------------------------------------------------------------------------------
// Constructor
//------------------------------------------------------------------------------
constructor TMYLDBMemoryManager.Create;
begin
 FMaxMemorySize := 0;
 InitializeCriticalSection(MMLock);
end;//Create

//------------------------------------------------------------------------------
// Constructor
//------------------------------------------------------------------------------
constructor TMYLDBMemoryManager.Create(MaxMemorySize: TMYLDBMemorySize);
begin
 Create;
 FMaxMemorySize := MaxMemorySize;
end;//Create


//------------------------------------------------------------------------------
// Destructor
//------------------------------------------------------------------------------
destructor TMYLDBMemoryManager.Destroy;
begin
 DeleteCriticalSection(MMLock);
{$IFNDEF DEBUG_MEMCHECK}
 {$IFDEF DEBUG_MEMLEAKS}
 if FTotalMemAllocated <> 0 then
   raise EMYLDBException.Create(30003, ErrorGMemoryLeakFound, [FTotalMemAllocated]);
 {$ENDIF}
{$ENDIF}
end;//Destructor


//------------------------------------------------------------------------------
// GetMemoryBufferSize
//------------------------------------------------------------------------------
function TMYLDBMemoryManager.GetMemoryBufferSize(Buffer: Pointer): TMYLDBMemorySize;
var
  Block: PMYLDBMemoryBlockHeader;
begin
  {$IFDEF USEDELPHIMM}
  Result := 0;
  Exit;
  {$ENDIF}
  if Buffer = nil then
    Result := 0
  else
    begin
  Block := PMYLDBMemoryBlockHeader(PChar(Buffer) - SizeOf(TMYLDBMemoryBlockHeader));
  if (Block.Signature = MYLDBMemorySignature) then
    Result := Block.Size
  else
    raise EMYLDBException.Create(30005, ErrorGInvalidPointer);
    end;
end;
//GetMemoryBufferSize


//------------------------------------------------------------------------------
// GetMem
//------------------------------------------------------------------------------
function TMYLDBMemoryManager.GetMem(BufferSize: TMYLDBMemorySize): Pointer;
var
  NewSize: TMYLDBMemorySize;
  BlockHeader: PMYLDBMemoryBlockHeader;
  BlockFooter: PMYLDBMemoryBlockFooter;
  GetMemType: TGetMemType;
begin
  {$IFDEF USEDELPHIMM}
  System.GetMem(Result, BufferSize);
  Exit;
  {$ENDIF}
  // Increment Counter
  {$IFDEF MEMDEBUG}
  Inc(FGetMemCallCount);
  {$ENDIF}

  // Allocate 0 bytes ?
  if (BufferSize = 0) then
    raise EMYLDBException.Create(30286, ErrorGCannotAllocateZeroBytes);

  // Mem Limit ?
  if ((FMaxMemorySize <> 0) and
      (BufferSize + FTotalMemAllocated > FMaxMemorySize)) then
    raise EMYLDBException.Create(30004, ErrorGMemoryLimitExceeded, [FMaxMemorySize]);

  try
    // Calculate New Size of Buffer
    NewSize := BufferSize + SizeOf(TMYLDBMemoryBlockHeader) + SizeOf(TMYLDBMemoryBlockFooter);

    // GetMem
    GetMemType := GetMemFunctionType(NewSize);
    case GetMemType of
      gmtGetMem:
          System.GetMem(BlockHeader, NewSize);
      gmtVirtualAlloc:
          BlockHeader := VirtualAlloc(nil, NewSize, MEM_COMMIT, PAGE_READWRITE);
      gmtGlobalAlloc:
          BlockHeader := Pointer(GlobalAlloc(GMEM_FIXED, NewSize))
      else
          raise EMYLDBException.Create(30340, ErrorGUnknownGetMemType, [Integer(GetMemType)]);
    end;
    // Fill Block Header
    BlockHeader.GetMemType := GetMemType;
    BlockHeader.Signature := MYLDBMemorySignature;
    BlockHeader.Size := BufferSize;
    // Fill Block Footer
    BlockFooter := Pointer(PChar(BlockHeader) + SizeOf(TMYLDBMemoryBlockHeader) + BufferSize);
    BlockFooter.Signature := MYLDBMemoryEndSignature;


    Result := Pointer(Cardinal(BlockHeader) + SizeOf(TMYLDBMemoryBlockHeader));
    EnterCriticalSection(MMLock);
    Inc(FTotalMemAllocated, BufferSize);
    LeaveCriticalSection(MMLock);
  except
    on e: Exception do
      raise EMYLDBException.Create(30015, ErrorGGetMemError, [e.Message]);
  end;
end;//GetMem


//------------------------------------------------------------------------------
// AllocMem
//------------------------------------------------------------------------------
function TMYLDBMemoryManager.AllocMem(BufferSize:TMYLDBMemorySize):Pointer;
begin
  {$IFDEF USEDELPHIMM}
  Result := Sysutils.AllocMem(BufferSize);
  Exit;
  {$ENDIF}

  {$IFDEF MEMDEBUG}
  Inc(FAllocMemCallCount);
  {$ENDIF}
  try
    Result := self.GetMem(BufferSize);
    FillChar(Result^, BufferSize, 0);
  finally
    //Dec(FGetMemCallCount);
  end;
end;//AllocMem


//------------------------------------------------------------------------------
// FreeMem and set Pointer to nil
//------------------------------------------------------------------------------
procedure TMYLDBMemoryManager.FreeAndNillMem(var Buffer);
var
  BlockHeader: PMYLDBMemoryBlockHeader;
  BlockFooter: PMYLDBMemoryBlockFooter;
  FooterIncorrect: Boolean;
begin
  {$IFDEF USEDELPHIMM}
  System.FreeMemory(Pointer(Buffer));
  Pointer(Buffer) := nil;
  Exit;
  {$ENDIF}

  // Increment Counter
  {$IFDEF MEMDEBUG}
  Inc(FFreeMemCallCount);
  {$ENDIF}
  try
    // Check Header Signature
    BlockHeader := PMYLDBMemoryBlockHeader(PChar(Buffer) - SizeOf(TMYLDBMemoryBlockHeader));
    if (BlockHeader.Signature <> MYLDBMemorySignature) then
      raise EMYLDBException.Create(30001, ErrorGInvalidPointer);

    // Check Footer Signature
    BlockFooter := Pointer(PChar(Buffer) + BlockHeader.Size);
    FooterIncorrect := (BlockFooter.Signature <> MYLDBMemoryEndSignature);

    // Calculate TotalMemAllocated
    EnterCriticalSection(MMLock);
    Dec(FTotalMemAllocated, BlockHeader.Size);
    LeaveCriticalSection(MMLock);

    // FreeMem
    case BlockHeader.GetMemType of
      gmtGetMem:
          System.FreeMem(BlockHeader);
      gmtVirtualAlloc:
          VirtualFree(BlockHeader, 0, MEM_RELEASE);
      gmtGlobalAlloc:
          GlobalFree(Cardinal(Pointer(BlockHeader)));
    end;

    // Clear Buffer Pointer
    Pointer(Buffer) := nil;

    // if Footer Signature incorrect then raise
    if (FooterIncorrect) then
      raise EMYLDBException.Create(30137, ErrorGMemoryOverrunDetected);

  except
    on EMYLDBException do raise;
    on e: Exception do
      raise EMYLDBException.Create(30138, ErrorGFreeMemError, [e.Message]);
  end;
end;//FreeAndNillMem


//------------------------------------------------------------------------------
// FreeMem
//------------------------------------------------------------------------------
procedure TMYLDBMemoryManager.FreeMem(const Buffer: Pointer);
var Buffer1: Pointer;
begin
  Buffer1 := Buffer;
  FreeAndNillMem(Buffer1);
end;// FreeMem


//------------------------------------------------------------------------------
// ReallocMem
//------------------------------------------------------------------------------
procedure TMYLDBMemoryManager.ReallocMem(var Buffer; BufferSize: TMYLDBMemorySize; ClearTail: Boolean);
var
  BlockHeader: PMYLDBMemoryBlockHeader;
  NewBuffer: Pointer;
begin
  {$IFDEF USEDELPHIMM}
  System.ReallocMem(Pointer(Buffer), BufferSize);
  Exit;
  {$ENDIF}
  // Increment Counter
  {$IFDEF MEMDEBUG}
  Inc(FReallocMemCallCount);
  {$ENDIF}
  try
    // Check Header Signature
    BlockHeader := PMYLDBMemoryBlockHeader(PChar(Buffer) - SizeOf(TMYLDBMemoryBlockHeader));
    if (BlockHeader.Signature <> MYLDBMemorySignature) then
      raise EMYLDBException.Create(30002, ErrorGInvalidPointer);

    // GetMem
    NewBuffer := Self.GetMem(BufferSize);
    // Copy OldBuffer to NewBuffer
    Move(PChar(Buffer)^, NewBuffer^,
       min(BufferSize, BlockHeader.Size));
    // Clear Tail
    if (ClearTail) then
      if (BufferSize > BlockHeader.Size) then
        FillChar(PChar(PChar(NewBuffer) + BlockHeader.Size)^, BufferSize-BlockHeader.Size, 0);

    // Free old buffer
    Self.FreeAndNillMem(PChar(Buffer));
    // Set Buffer to NewBuffer
    Pointer(Buffer) := NewBuffer;

    // Correct call counters
    {$IFDEF MEMDEBUG}
    Dec(FGetMemCallCount);
    Dec(FFreeMemCallCount);
    {$ENDIF}
  except
    on e: Exception do
      raise EMYLDBException.Create(30014, ErrorGReallocMemError, [e.Message]);
  end;
end;//ReallocMem


//------------------------------------------------------------------------------
// ReAllocMem and clear Tail of Buffer
//------------------------------------------------------------------------------
procedure TMYLDBMemoryManager.ReallocMemAndClearTail(var Buffer; BufferSize: TMYLDBMemorySize);
begin
  ReallocMem(Buffer, BufferSize, True);
end;//ReallocMemAndClearTail


//------------------------------------------------------------------------------
// GetFreeMemorySize
//------------------------------------------------------------------------------
function TMYLDBMemoryManager.GetFreeMemorySize: TMYLDBMemorySize;
var
  Status: TMemoryStatus;
begin
  GlobalMemoryStatus(Status);
  FFreeSystemMemorySize := Status.dwAvailPhys;
  if (FMaxMemorySize = 0) then
    Result := FFreeSystemMemorySize
  else
    Result := Min(FFreeSystemMemorySize, FMaxMemorySize);
end;//GetFreeMemorySize


//------------------------------------------------------------------------------
// move memory block
//------------------------------------------------------------------------------
procedure MYLDBMove(const Source; var Dest; Count : Integer );
var
  S, D: PChar;
  I, Offset: Integer;
begin
  S := PChar(@Source);
  D := PChar(@Dest);
  Offset := D - S;
  if ((Offset > 0) and (Offset < 4)) then
    for i := Count-1 downto 0 do
      (D+i)^ := (S+i)^
  else
  if ((Offset > -4) and (Offset < 0)) then
    for i := 0 to Count-1 do
      (D+i)^ := (S+i)^
  else
    Move(Source, Dest, Count);
end;


initialization

 MemoryManager := TMYLDBMemoryManager.Create;

finalization

 MemoryManager.Free;
 MemoryManager := nil;

end.

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美电影免费观看高清完整版在线| 欧美日韩黄视频| 久久综合中文字幕| 国产一区999| 中文字幕免费不卡| eeuss鲁片一区二区三区在线观看 eeuss鲁片一区二区三区在线看 | 欧美日韩精品一二三区| 亚洲小说春色综合另类电影| 欧美日韩激情在线| 极品少妇一区二区| 欧美激情资源网| 欧美亚洲图片小说| 蜜臀av性久久久久蜜臀aⅴ流畅| 精品粉嫩aⅴ一区二区三区四区| 国产精品911| 亚洲柠檬福利资源导航| 欧美高清视频不卡网| 久久99久久久久| 国产精品国产精品国产专区不片| 欧美日韩一区三区| 国产永久精品大片wwwapp| 国产精品视频麻豆| 欧美日韩在线播放一区| 国内精品伊人久久久久av影院 | 日韩美女视频在线| 99久久婷婷国产| 久久精品国产澳门| 国产精品久久久久久久岛一牛影视| 日本丰满少妇一区二区三区| 久久99久久99| 亚洲天堂av一区| 日韩欧美中文字幕一区| 成人高清视频免费观看| 婷婷开心激情综合| 亚洲国产高清在线| 欧美一级爆毛片| 91麻豆国产福利在线观看| 蜜桃一区二区三区在线观看| 亚洲欧美日韩中文播放| 精品国产乱码久久久久久浪潮 | 欧美日韩一卡二卡三卡 | 日韩视频在线永久播放| 一本色道久久加勒比精品| 国产在线看一区| 亚洲国产中文字幕在线视频综合| 久久久久久久网| 日韩一区二区电影网| 91精品1区2区| 99riav一区二区三区| 成人爽a毛片一区二区免费| 中文字幕av一区二区三区免费看| aaa国产一区| 欧美三级日本三级少妇99| 国产精品99久| 蜜桃视频免费观看一区| 亚洲精品日韩一| 国产精品美女一区二区在线观看| 欧美成人乱码一区二区三区| 欧美日韩三级在线| 一本久久a久久免费精品不卡| 国产成人av电影免费在线观看| 日本系列欧美系列| 亚洲妇熟xx妇色黄| 亚洲综合激情网| 中文字幕一区不卡| 亚洲国产精品99久久久久久久久| 精品粉嫩超白一线天av| 91精品国产91久久综合桃花| 欧美视频中文一区二区三区在线观看| 91麻豆视频网站| 99在线精品视频| 99在线精品免费| 一本色道久久综合狠狠躁的推荐 | 日韩电影在线一区二区| 一区二区三区高清不卡| 亚洲三级电影网站| 亚洲色图制服诱惑 | 亚洲小说欧美激情另类| 亚洲免费观看高清完整版在线观看熊 | 欧美日韩精品一区二区天天拍小说 | 欧美成人一级视频| 精品国产凹凸成av人导航| 日韩视频免费观看高清完整版在线观看 | 日本一道高清亚洲日美韩| 婷婷亚洲久悠悠色悠在线播放 | 精品99一区二区| 久久亚洲精精品中文字幕早川悠里 | 成人欧美一区二区三区白人| 国产精品女主播在线观看| 国产精品久久久久国产精品日日| 中文字幕成人网| 亚洲欧美日韩中文播放| 亚洲国产aⅴ成人精品无吗| 视频一区二区不卡| 久久99最新地址| 成人av在线资源网站| 91视频在线观看| 精品视频1区2区| 欧美一二三区在线| 国产日产欧产精品推荐色 | 国产精品影音先锋| 成人黄色大片在线观看| 在线观看日韩毛片| 欧美成人精品1314www| 国产亚洲一区二区三区四区| 国产精品美女久久久久久久| 亚洲午夜av在线| 国产原创一区二区| 91一区二区三区在线观看| 欧洲一区在线观看| 欧美tickling网站挠脚心| 中文字幕在线不卡国产视频| 亚洲第一会所有码转帖| 国产精品一级片在线观看| 91理论电影在线观看| 欧美一区二区视频免费观看| 欧美极品美女视频| 午夜精品久久久久久久久久久 | 91麻豆国产精品久久| 亚洲va欧美va人人爽| 97精品国产97久久久久久久久久久久| 99精品桃花视频在线观看| 日韩精品影音先锋| 日韩主播视频在线| 99久久99久久精品免费看蜜桃| 久久网站热最新地址| 久久99热这里只有精品| 久久综合狠狠综合久久综合88| 另类中文字幕网| 色综合天天综合狠狠| 久久99久久久欧美国产| 欧美日韩中文字幕一区| 日韩一区二区三区在线| 久久色在线视频| 午夜视频在线观看一区二区 | 91在线观看下载| 日韩视频中午一区| 亚洲福利一区二区三区| 一区二区三区日韩欧美| 欧美精品丝袜久久久中文字幕| 裸体在线国模精品偷拍| 波多野结衣在线一区| 欧美一区二区三区视频免费| 亚洲伦理在线免费看| 成人综合在线网站| 精品日韩在线一区| 亚洲国产人成综合网站| 91日韩在线专区| 国产精品乱码妇女bbbb| 看国产成人h片视频| 欧美精品色一区二区三区| 一区二区高清视频在线观看| 99久精品国产| 亚洲天堂a在线| 成人网在线免费视频| 日韩免费在线观看| 亚洲午夜电影在线观看| 色婷婷综合久久久久中文一区二区 | 欧美电视剧免费全集观看| 亚洲午夜私人影院| 成人av网站在线观看免费| 日韩欧美精品三级| 日韩精彩视频在线观看| 91一区一区三区| 亚洲国产精品成人久久综合一区| 亚洲午夜精品17c| 精品视频在线视频| 亚洲精品成人a在线观看| 成人黄色一级视频| 亚洲精品一区二区在线观看| 午夜精品久久久久久| 色欧美片视频在线观看在线视频| 中国av一区二区三区| 99在线热播精品免费| 国产精品高潮久久久久无| 国产一区二区在线看| 欧美日韩国产高清一区二区| 亚洲成av人影院| 欧日韩精品视频| 亚洲一区二区在线免费观看视频| 99久久综合色| 亚洲丝袜制服诱惑| 成人国产精品免费观看| 中文字幕免费在线观看视频一区| 国产成人午夜电影网| 日本一区二区免费在线| 国产成人精品网址| 久久久久九九视频| 蜜臀a∨国产成人精品| 欧美电影免费观看完整版| 国产激情一区二区三区桃花岛亚洲| 久久精品视频在线免费观看| 国产在线一区二区| 中文字幕一区二区三区av| 91麻豆免费观看| 亚洲地区一二三色| 91精品国产综合久久蜜臀| 全国精品久久少妇| 精品久久国产老人久久综合| 蜜臀久久久99精品久久久久久|