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

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? myldbgetmem.inc

?? 一個(gè)本地database引擎,支持中文T_Sql查詢,兼容DELPHI標(biāo)準(zhǔn)數(shù)據(jù)庫(kù)控件
?? INC
?? 第 1 頁(yè) / 共 3 頁(yè)
字號(hào):


//
// Suballocator (what the user program actually calls)
//

type
  PFree = ^TFree;
  TFree = packed record
    prev: PFree;
    next: PFree;
    size: Integer;
  end;
  PUsed = ^TUsed;
  TUsed = packed record
    sizeFlags: Integer;
  end;

const
  cAlign        = 4;
  cThisUsedFlag = 2;
  cPrevFreeFlag = 1;
  cFillerFlag   = Integer($80000000);
  cFlags        = cThisUsedFlag or cPrevFreeFlag or cFillerFlag;
  cSmallSize    = 4*1024;
  cDecommitMin  = 15*1024;

type
  TSmallTab    = array [sizeof(TFree) div cAlign .. cSmallSize div cAlign] of PFree;

VAR
  avail        : TFree;
  rover        : PFree;
  remBytes     : Integer;
  curAlloc     : PChar;
  smallTab     : ^TSmallTab;
  committedRoot: TBlockDesc;


function InitAllocator: Boolean;
// Initialize. No other calls legal before that.
var
  i: Integer;
  a: PFree;
begin
  try
    InitializeCriticalSection(heapLock);
    if IsMultiThread then EnterCriticalSection(heapLock);

    MakeEmpty(@spaceRoot);
    MakeEmpty(@decommittedRoot);
    MakeEmpty(@committedRoot);

    smallTab := LocalAlloc(LMEM_FIXED, sizeof(smallTab^));
    if smallTab <> nil then begin
      for i:= low(smallTab^) to high(smallTab^) do
        smallTab[i] := nil;

      a := @avail;
      a.next := a;
      a.prev := a;
      rover := a;

      initialized := True;
    end;
  finally
    if IsMultiThread then LeaveCriticalSection(heapLock);
  end;
  result := initialized;
end;


procedure UninitAllocator;
// Shutdown.
var
  bdb: PBlockDescBlock;
  bd : PBlockDesc;
begin
  if initialized then begin
    try
      if IsMultiThread then EnterCriticalSection(heapLock);

      initialized := False;

      LocalFree(smallTab);
      smallTab := nil;

      bd := spaceRoot.next;
      while bd <> @spaceRoot do begin
        VirtualFree(bd.addr, 0, MEM_RELEASE);
        bd := bd.next;
      end;

      MakeEmpty(@spaceRoot);
      MakeEmpty(@decommittedRoot);
      MakeEmpty(@committedRoot);

      bdb := blockDescBlockList;
      while bdb <> nil do begin
        blockDescBlockList := bdb^.next;
        LocalFree(bdb);
        bdb := blockDescBlockList;
      end;
    finally
      if IsMultiThread then LeaveCriticalSection(heapLock);
      DeleteCriticalSection(heapLock);
    end;
  end;
end;


procedure DeleteFree(f: PFree);
var
  n, p: PFree;
  size: Integer;
begin
  if rover = f then
    rover := f.next;
  n := f.next;
  size := f.size;
  if size <= cSmallSize then begin
    if n = f then
      smallTab[size div cAlign] := nil
    else begin
      smallTab[size div cAlign] := n;
      p := f.prev;
      n.prev := p;
      p.next := n;
    end;
  end else begin
    p := f.prev;
    n.prev := p;
    p.next := n;
  end;
end;


procedure InsertFree(a: Pointer; size: Integer); forward;


function FindCommitted(addr: PChar): PBlockDesc;
begin
  result := committedRoot.next;
  while result <> @committedRoot do begin
    if (addr >= result.addr) and (addr < result.addr + result.size) then
      exit;
    result := result.next;
  end;
  heapErrorCode := cBadCommittedList;
  result := nil;
end;


procedure FillBeforeGap(a: PChar; size: Integer);
var
  rest: Integer;
  e: PUsed;
begin
  rest := size - sizeof(TUsed);
  e := PUsed(a + rest);
  if size >= sizeof(TFree) + sizeof(TUsed) then begin
    e.sizeFlags := sizeof(TUsed) or cThisUsedFlag or cPrevFreeFlag or cFillerFlag;
    InsertFree(a, rest);
  end else if size >= sizeof(TUsed) then begin
    PUsed(a).sizeFlags := size or (cThisUsedFlag or cFillerFlag);
    e.sizeFlags := size or (cThisUsedFlag or cFillerFlag);
  end;
end;


procedure InternalFreeMem(a: PChar);
begin
  Inc(AllocMemCount);
  Inc(AllocMemSize,PUsed(a-sizeof(TUsed)).sizeFlags and not cFlags - sizeof(TUsed));
  SysFreeMem(a);
end;


procedure FillAfterGap(a: PChar; size: Integer);
begin
  if size >= sizeof(TFree) then begin
    PUsed(a).sizeFlags := size or cThisUsedFlag;
    InternalFreeMem(a + sizeof(TUsed));
  end else begin
    if size >= sizeof(TUsed) then
      PUsed(a).sizeFlags := size or (cThisUsedFlag or cFillerFlag);
    Inc(a,size);
    PUsed(a).sizeFlags := PUsed(a).sizeFlags and not cPrevFreeFlag;
  end;
end;


function FillerSizeBeforeGap(a: PChar): Integer;
var
  sizeFlags : Integer;
  freeSize  : Integer;
  f : PFree;
begin
  sizeFlags := PUsed(a - sizeof(TUsed)).sizeFlags;
  if (sizeFlags and (cThisUsedFlag or cFillerFlag)) <> (cThisUsedFlag or cFillerFlag) then
    heapErrorCode := cBadFiller1;
  result := sizeFlags and not cFlags;
  Dec(a, result);
  if ((PUsed(a).sizeFlags xor sizeFlags) and not cPrevFreeFlag) <> 0 then
    HeapErrorCode := cBadFiller2;
  if (PUsed(a).sizeFlags and cPrevFreeFlag) <> 0 then begin
    freeSize := PFree(a - sizeof(TFree)).size;
    f := PFree(a - freeSize);
    if f.size <> freeSize then
      heapErrorCode := cBadFiller3;
    DeleteFree(f);
    Inc(result, freeSize);
  end;
end;


function FillerSizeAfterGap(a: PChar): Integer;
var
  sizeFlags: Integer;
  f : PFree;
begin
  result := 0;
  sizeFlags := PUsed(a).sizeFlags;
  if (sizeFlags and cFillerFlag) <> 0 then begin
    sizeFlags := sizeFlags and not cFlags;
    Inc(result,sizeFlags);
    Inc(a, sizeFlags);
    sizeFlags := PUsed(a).sizeFlags;
  end;
  if (sizeFlags and cThisUsedFlag) = 0 then begin
    f := PFree(a);
    DeleteFree(f);
    Inc(result, f.size);
    Inc(a, f.size);
    PUsed(a).sizeFlags := PUsed(a).sizeFlags and not cPrevFreeFlag;
  end;
end;


function DecommitFree(a: PChar; size: Integer): Boolean;
var
  b: TBlock;
  bd: PBlockDesc;
begin
  bd := FindCommitted(a);
  if bd.addr + bd.size - (a + size) <= sizeof(TFree) then
    size := bd.addr + bd.size - a;

  if a - bd.addr < sizeof(TFree) then
    b := FreeCommitted(bd.addr, size + (a - bd.addr))
  else
    b := FreeCommitted(a + sizeof(TUsed), size - sizeof(TUsed));

  if b.addr = nil then
    result := False
  else begin
    FillBeforeGap(a, b.addr - a);
    if bd.addr + bd.size > b.addr + b.size then
      FillAfterGap(b.addr + b.size, a + size - (b.addr + b.size));
    RemoveBlock(bd,b);
    result := True;
  end;
end;


procedure InsertFree(a: Pointer; size: Integer);
var
  f, n, p: PFree;
begin
  f := PFree(a);
  f.size := size;
  PFree(PChar(f) + size - sizeof(TFree)).size := size;
  if size <= cSmallSize then begin
    n := smallTab[size div cAlign];
    if n = nil then begin
      smallTab[size div cAlign] := f;
      f.next := f;
      f.prev := f;
    end else begin
      p := n.prev;
      f.next := n;
      f.prev := p;
      n.prev := f;
      p.next := f;
    end;
  end else if (size < cDecommitMin) or not DecommitFree(a, size) then begin
    n := rover;
    rover := f;
    p := n.prev;
    f.next := n;
    f.prev := p;
    n.prev := f;
    p.next := f;
  end;
end;


procedure FreeCurAlloc;
begin
  if remBytes > 0 then begin
    if remBytes < sizeof(TFree) then
      heapErrorCode := cBadCurAlloc
    else begin
      PUsed(curAlloc).sizeFlags := remBytes or cThisUsedFlag;
      InternalFreeMem(curAlloc + sizeof(TUsed));
      curAlloc := nil;
      remBytes := 0;
    end;
  end;
end;


function MergeCommit(b: TBlock): Boolean;
var
  merged: TBlock;
  fSize: Integer;
begin
  FreeCurAlloc;
  merged := MergeBlockAfter(@committedRoot, b);
  if merged.addr = nil then begin
    result := False;
    exit;
  end;

  if merged.addr < b.addr then begin
    fSize := FillerSizeBeforeGap(b.addr);
    Dec(b.addr, fSize);
    Inc(b.size, fSize);
  end;

  if merged.addr + merged.size > b.addr + b.size then begin
    fSize := FillerSizeAfterGap(b.addr + b.size);
    Inc(b.size, fSize);
  end;

  if merged.addr + merged.size = b.addr + b.size then begin
    FillBeforeGap(b.addr + b.size - sizeof(TUsed), sizeof(TUsed));
    Dec(b.size, sizeof(TUsed));
  end;

  curAlloc := b.addr;
  remBytes := b.size;

  result := True;
end;


function NewCommit(minSize: Integer): Boolean;
var
  b: TBlock;
begin
  b := GetCommitted(minSize+sizeof(TUsed));
  result := (b.addr <> nil) and MergeCommit(b);
end;


function NewCommitAt(addr: Pointer; minSize: Integer): Boolean;
var
  b: TBlock;
begin
  b := GetCommittedAt(addr, minSize+sizeof(TUsed));
  result := (b.addr <> nil) and MergeCommit(b);
end;


function SearchSmallBlocks(size: Integer): PFree;
var
  i: Integer;
begin
  result := nil;
  for i := size div cAlign to High(smallTab^) do begin
    result := smallTab[i];
    if result <> nil then
      exit;
  end;
end;


function TryHarder(size: Integer): Pointer;
var
  u: PUsed; f:PFree; saveSize, rest: Integer;
begin

  repeat

    f := avail.next;
    if (size <= f.size) then
      break;

    f := rover;
    if f.size >= size then
      break;

    saveSize := f.size;
    f.size := size;
    repeat
      f := f.next
    until f.size >= size;
    rover.size := saveSize;
    if f <> rover then begin
      rover := f;
      break;
    end;

    if size <= cSmallSize then begin
      f := SearchSmallBlocks(size);
      if f <> nil then
        break;
    end;

    if not NewCommit(size) then begin
      result := nil;
      exit;
    end;

    if remBytes >= size then begin
      Dec(remBytes, size);
      if remBytes < sizeof(TFree) then begin
        Inc(size, remBytes);
        remBytes := 0;
      end;
      u := PUsed(curAlloc);
      Inc(curAlloc, size);
      u.sizeFlags := size or cThisUsedFlag;
      result := PChar(u) + sizeof(TUsed);
      Inc(AllocMemCount);
      Inc(AllocMemSize,size - sizeof(TUsed));
      exit;
    end;

  until False;

  DeleteFree(f);

  rest := f.size - size;
  if rest >= sizeof(TFree) then begin
    InsertFree(PChar(f) + size, rest);
  end else begin
    size := f.size;
    if f = rover then
      rover := f.next;
    u := PUsed(PChar(f) + size);
    u.sizeFlags := u.sizeFlags and not cPrevFreeFlag;
  end;

  u := PUsed(f);
  u.sizeFlags := size or cThisUsedFlag;

  result := PChar(u) + sizeof(TUsed);
  Inc(AllocMemCount);
  Inc(AllocMemSize,size - sizeof(TUsed));

end;


function SysGetMem(size: Integer): Pointer;
// Allocate memory block.
var
  f, prev, next: PFree;
  u: PUsed;
begin

  if not initialized and not InitAllocator then begin
    result := nil;
    exit;
  end;

  try
    if IsMultiThread then EnterCriticalSection(heapLock);

    Inc(size, sizeof(TUsed) + (cAlign-1));
    size := size and not (cAlign-1);
    if size < sizeof(TFree) then
      size := sizeof(TFree);

    if size <= cSmallSize then begin
      f := smallTab[size div cAlign];
      if f <> nil then begin
        u := PUsed(PChar(f) + size);
        u.sizeFlags := u.sizeFlags and not cPrevFreeFlag;
        next := f.next;
        if next = f then
          smallTab[size div cAlign] := nil
        else begin
          smallTab[size div cAlign] := next;
          prev := f.prev;
          prev.next := next;
          next.prev := prev;
        end;
        u := PUsed(f);
        u.sizeFlags := f.size or cThisUsedFlag;
        result := PChar(u) + sizeof(TUsed);
        Inc(AllocMemCount);
        Inc(AllocMemSize,size - sizeof(TUsed));
        exit;
      end;
    end;

    if size <= remBytes then begin
      Dec(remBytes, size);
      if remBytes < sizeof(TFree) then begin
        Inc(size, remBytes);
        remBytes := 0;
      end;
      u := PUsed(curAlloc);
      Inc(curAlloc, size);
      u.sizeFlags := size or cThisUsedFlag;
      result := PChar(u) + sizeof(TUsed);
      Inc(AllocMemCount);

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日本不卡中文字幕| 亚洲成人综合视频| 老司机一区二区| 91免费视频大全| 久久久久久一二三区| 亚洲第一综合色| 成人激情综合网站| 精品久久人人做人人爱| 亚洲va国产天堂va久久en| caoporm超碰国产精品| 久久久久9999亚洲精品| 五月天久久比比资源色| 色婷婷综合久久久久中文一区二区 | 成人小视频在线观看| 日韩视频免费直播| 亚洲成人免费在线观看| 一本久久精品一区二区| 国产精品网站在线观看| 国产一区二区三区在线观看免费| 欧美日韩国产综合久久| 玉足女爽爽91| 色综合久久久久综合99| 国产精品久久777777| 国产福利一区在线| 亚洲精品在线免费播放| 蜜桃久久久久久| 欧美一区二区日韩| 日韩国产在线观看| 4438x亚洲最大成人网| 亚洲主播在线播放| 在线观看一区不卡| 亚洲一区二区三区不卡国产欧美 | 久久精品国产77777蜜臀| 欧美日韩mp4| 亚洲国产成人精品视频| 欧美在线|欧美| 亚洲已满18点击进入久久| 日本韩国一区二区| 一区二区三区视频在线观看| 在线观看国产91| 亚洲一区在线观看视频| 欧美日韩国产综合一区二区三区 | 亚洲色图在线播放| aaa欧美日韩| 亚洲三级久久久| 欧美中文字幕一区二区三区| 亚洲电影一级片| 欧美夫妻性生活| 久久精品国产免费看久久精品| 精品国产不卡一区二区三区| 国产在线国偷精品产拍免费yy| 26uuu精品一区二区| 国产精品综合在线视频| 国产精品区一区二区三| 91美女在线看| 首页综合国产亚洲丝袜| 91精品国产综合久久精品麻豆 | 亚洲午夜精品网| 欧美人妇做爰xxxⅹ性高电影| 日韩电影一区二区三区四区| 精品美女在线观看| 成人免费视频app| 亚洲欧美电影院| 制服丝袜av成人在线看| 国产综合色视频| 国产精品欧美经典| 在线亚洲人成电影网站色www| 亚洲成人精品影院| 亚洲精品一区二区三区在线观看 | 国产精品系列在线播放| 国产精品色在线观看| 99久久久精品| 亚洲chinese男男1069| 3atv一区二区三区| 国产一区二区三区久久久| 国产精品青草久久| 欧美亚洲国产一区二区三区va| 人人精品人人爱| 国产视频一区二区三区在线观看| 97久久精品人人爽人人爽蜜臀| 亚洲成人精品一区二区| 久久影院午夜论| 91麻豆产精品久久久久久| 日韩综合一区二区| 国产欧美日韩久久| 在线观看免费视频综合| 国内精品写真在线观看| 亚洲欧美另类图片小说| 日韩欧美一级二级三级| 国产mv日韩mv欧美| 天天综合色天天综合色h| 久久欧美一区二区| 99视频一区二区| 奇米综合一区二区三区精品视频| 国产欧美日韩综合| 欧美日韩一区国产| 东方欧美亚洲色图在线| 亚瑟在线精品视频| 国产欧美日韩另类视频免费观看| 欧美日韩国产一级二级| 国产成人高清视频| 亚洲va欧美va人人爽午夜| 国产婷婷色一区二区三区在线| 欧美特级限制片免费在线观看| 九色porny丨国产精品| 伊人色综合久久天天| 26uuu亚洲婷婷狠狠天堂| 欧美亚洲综合久久| 丁香激情综合国产| 日韩专区欧美专区| 亚洲视频在线观看一区| 久久综合久久综合亚洲| 欧洲色大大久久| 国产成人亚洲精品青草天美| 日韩电影在线免费观看| 亚洲品质自拍视频| 久久久久久久久伊人| 精品视频在线免费| 成人av资源在线| 蜜桃视频在线一区| 亚洲国产精品久久久男人的天堂| 国产精品人妖ts系列视频| 日韩精品一区二区三区在线播放| 色吊一区二区三区| 国产成人精品影视| 麻豆成人免费电影| 一区二区成人在线| 国产精品九色蝌蚪自拍| 337p粉嫩大胆色噜噜噜噜亚洲| 欧美日韩精品欧美日韩精品 | 精品一区二区日韩| 亚洲超丰满肉感bbw| 成人免费在线视频| 国产日韩欧美a| 精品美女在线观看| 欧美一区二区视频在线观看 | 成人免费高清视频| 极品少妇xxxx精品少妇偷拍| 天天做天天摸天天爽国产一区 | 精品久久久久久久人人人人传媒 | 成人黄色片在线观看| 国产精品99久久久久久有的能看| 免费欧美在线视频| 图片区小说区国产精品视频| 一区二区三区 在线观看视频| 国产精品久久久久久久久果冻传媒| 精品99久久久久久| 欧美大片日本大片免费观看| 欧美夫妻性生活| 欧美老年两性高潮| 欧美日韩精品久久久| 欧美情侣在线播放| 欧美日韩精品免费观看视频| 欧美日韩国产一级二级| 欧美日韩一二区| 欧美丰满嫩嫩电影| 91麻豆精品91久久久久久清纯 | 欧洲av一区二区嗯嗯嗯啊| 91小视频免费看| 色综合久久88色综合天天| 91在线免费播放| 色婷婷亚洲婷婷| 在线亚洲高清视频| 欧美日韩国产高清一区二区三区 | 成人久久视频在线观看| 成人sese在线| 色综合咪咪久久| 在线观看91视频| 51精品秘密在线观看| 欧美一级片在线观看| 日韩午夜精品电影| 久久新电视剧免费观看| 欧美激情综合网| 成人欧美一区二区三区1314| 亚洲最快最全在线视频| 亚欧色一区w666天堂| 美国av一区二区| 国产不卡视频一区二区三区| 成人91在线观看| 91黄色小视频| 91精品国产色综合久久久蜜香臀| 日韩亚洲欧美综合| 久久嫩草精品久久久精品| 国产精品嫩草影院com| 亚洲美女偷拍久久| 日韩福利电影在线| 国产乱一区二区| 99久久精品99国产精品| 欧美日韩国产色站一区二区三区| 日韩久久久久久| 国产欧美一区在线| 中文字幕一区二区三| 亚洲午夜电影在线| 精品系列免费在线观看| 岛国一区二区三区| 精品视频全国免费看| 久久午夜电影网| 亚洲色欲色欲www在线观看| 爽好多水快深点欧美视频| 国产成人av资源|