anchor.diff:  
     TKMSavePointCollection = class
     private
  -    fCriticalSection: TCriticalSection;
  +    fAsyncSaveThreadsCnt: Byte; //Number of threads doing save atm. Usually should be not more then 1
  +    fWaitCS: TCriticalSection;
  +    fSaveCS: TCriticalSection;
       fSavePoints: TDictionary<Cardinal, TKMSavePoint>;
       //Properties to restore after load saved replay
       fLastTick: Cardinal;
  
positive.code: begin
    if Self = nil then Exit;
  
    fCriticalSection.Leave;
  end;
  
  
  
negative.code: 
  destructor TKMSavePointCollection.Destroy();
  begin
    {$IFDEF WDC}
    // Wait till all threads release waitLock
    while True do
    begin
      fWaitCS.Enter;
      try
        if fAsyncSaveThreadsCnt = 0 then
          Break;
      finally
        fWaitCS.Leave;
      end;
      Sleep(100);
    end;
    {$ENDIF}
  
    Lock; // Lock even in destructor
    try
      Clear;
      fSavePoints.Free; // TKMList will free all objects of the list
    finally
      Unlock;
    end;
    fSaveCS.Free;
    fWaitCS.Free;
  
    inherited;
  end;
  