Browse Source

Fixed _TCacheMemDataTree_Compare on 64bits overflow bug

PascalCoin 3 years ago
parent
commit
05ea944e44

+ 9 - 0
src/libraries/abstractmem/UAbstractMemBTree.pas

@@ -138,6 +138,7 @@ type
     FIndexes : TList< TAbstractMemBTreeDataIndex<TBTreeData> >;
     {$ENDIF}
   protected
+    procedure DeletedData(const AData: TBTreeData); virtual;
   public
     constructor Create(AAbstractMem : TAbstractMem; const AInitialZone: TAMZone; AAllowDuplicates : Boolean; AOrder : Integer;
       const AOnCompareAbstractMemDataMethod: TComparison<TBTreeData>);
@@ -743,9 +744,17 @@ begin
     Result := True;
     if FLeft_Pos=LAbstractMemPos then FLeft_Pos := 0;
     if FRight_Pos=LAbstractMemPos then FRight_Pos := 0;
+    //
+    DeletedData(AData);
   end else Result := False;
 end;
 
+procedure TAbstractMemBTreeData<TBTreeData>.DeletedData(
+  const AData: TBTreeData);
+begin
+  //
+end;
+
 destructor TAbstractMemBTreeData<TBTreeData>.Destroy;
 var i : Integer;
  LBTreeIndex : TAbstractMemBTreeDataIndex<TBTreeData>;

+ 12 - 5
src/libraries/abstractmem/UCacheMem.pas

@@ -104,6 +104,7 @@ type
     flushElapsedMillis : Int64;
     freememCount : Integer;
     freememSize : Int64;
+    freememBlocksCount : Int64;
     freememElaspedMillis : Int64;
     maxUsedCacheSize : Integer;
     reusedCacheMemDataCount : Integer;
@@ -452,11 +453,12 @@ end;
 
 function TCacheMem.FreeMem(const AMaxMemSize, AMaxBlocks: Int64) : Boolean;
 var
-  i, LPreviousCacheDataSize, LTempCacheDataSize,
+  i, LTempCacheDataSize,
   LFinalMaxMemSize, LMaxPendingRounds : Int64;
   PToRemove, PToNext : PCacheMemData;
   LListToFlush : TOrderedList<PCacheMemData>;
   {$IFDEF ABSTRACTMEM_ENABLE_STATS}
+  LPreviousCacheDataSize, LPreviousCacheDataBlocks : Int64;
   LTickCount : TTickCount;
   {$ENDIF}
 begin
@@ -466,8 +468,9 @@ begin
      ((AMaxBlocks < 0) or (FCacheDataBlocks<=AMaxBlocks)) then Exit(True);
   {$IFDEF ABSTRACTMEM_ENABLE_STATS}
   LTickCount := TPlatform.GetTickCount;
-  {$ENDIF}
   LPreviousCacheDataSize := FCacheDataSize;
+  LPreviousCacheDataBlocks := FCacheDataBlocks;
+  {$ENDIF}
 
   if (AMaxMemSize<0) then LFinalMaxMemSize := FCacheDataSize
   else LFinalMaxMemSize := AMaxMemSize;
@@ -508,6 +511,7 @@ begin
   {$IFDEF ABSTRACTMEM_ENABLE_STATS}
   Inc(FCacheMemStats.freememCount);
   Inc(FCacheMemStats.freememSize,LPreviousCacheDataSize - FCacheDataSize);
+  Inc(FCacheMemStats.freememBlocksCount,LPreviousCacheDataBlocks - FCacheDataBlocks);
   Inc(FCacheMemStats.freememElaspedMillis,TPlatform.GetElapsedMilliseconds(LTickCount));
   {$ENDIF}
 end;
@@ -991,6 +995,7 @@ begin
   flushElapsedMillis := 0;
   freememCount := 0;
   freememSize := 0;
+  freememBlocksCount := 0;
   freememElaspedMillis := 0;
   reusedCacheMemDataCount := 0;
   reusedCacheMemDataBytes := 0;
@@ -1001,11 +1006,11 @@ end;
 
 function TCacheMemStats.ToString: String;
 begin
-  Result := Format('CacheMemStats Reused:%d (%d bytes) - Deleteds:%d (Saved:%d - reused:%d) - Flush:%d (%d bytes) %d millis - FreeMem:%d (%d bytes) %d millis',
+  Result := Format('CacheMemStats Reused:%d (%d bytes) - Deleteds:%d (Saved:%d - reused:%d) - Flush:%d (%d bytes) %d millis - FreeMem:%d (%d bytes %d blocks) %d millis',
      [Self.reusedCacheMemDataCount,Self.reusedCacheMemDataBytes,
       Self.deletedBlocksCount,Self.deletedBlocksSaved,Self.deletedBlocksReused,
       Self.flushCount,Self.flushSize,Self.flushElapsedMillis,
-      Self.freememCount,Self.freememSize,
+      Self.freememCount,Self.freememSize,Self.freememBlocksCount,
       Self.freememElaspedMillis]);
 end;
 {$ENDIF}
@@ -1014,7 +1019,9 @@ end;
 
 function _TCacheMemDataTree_Compare(const Left, Right: PCacheMemData): Integer;
 begin
-  Result := Left^.startPos - Right^.startPos;
+  if Left^.startPos < Right^.startPos then Result := -1
+  else if Left^.startPos > Right^.startPos then Result := 1
+  else Result := 0;
 end;
 
 function TCacheMemDataTree.AreEquals(const ANode1, ANode2: PCacheMemData): Boolean;