@@ -55,7 +55,7 @@ public partial class LogfileReader : IAutoLogLineMemoryColumnizerCallback, IDisp
5555 private bool _disposed ;
5656 private ILogFileInfo _watchedILogFileInfo ;
5757
58- private bool _isLineCountDirty = true ;
58+ private volatile bool _isLineCountDirty = true ;
5959
6060 private volatile bool _isFailModeCheckCallPending ;
6161 private volatile bool _isFastFailOnGetLogLine ;
@@ -183,12 +183,17 @@ public int LineCount
183183 else
184184 {
185185 AcquireBufferListReaderLock ( ) ;
186- foreach ( var buffer in _bufferList . Values )
186+ try
187187 {
188- field += buffer . LineCount ;
188+ foreach ( var buffer in _bufferList . Values )
189+ {
190+ field += buffer . LineCount ;
191+ }
192+ }
193+ finally
194+ {
195+ ReleaseBufferListReaderLock ( ) ;
189196 }
190-
191- ReleaseBufferListReaderLock ( ) ;
192197 }
193198
194199 _isLineCountDirty = false ;
@@ -410,10 +415,10 @@ public int ShiftBuffers ()
410415
411416 foreach ( var logFileInfo in lostILogFileInfoList )
412417 {
413- var lastBuffer = DeleteBuffersForInfo ( logFileInfo , false ) ;
414- if ( lastBuffer != null )
418+ var lastDeletedBufferInfo = DeleteBuffersForInfo ( logFileInfo , false ) ;
419+ if ( lastDeletedBufferInfo != null )
415420 {
416- offset += lastBuffer . StartLine + lastBuffer . LineCount ;
421+ offset += lastDeletedBufferInfo . Value . StartLine + lastDeletedBufferInfo . Value . LineCount ;
417422 }
418423 }
419424
@@ -1061,39 +1066,43 @@ private ValueTask<ILogLineMemory> GetLogLineMemoryInternal (int lineNum)
10611066 }
10621067
10631068 AcquireBufferListReaderLock ( ) ;
1064- var ( logBuffer , _) = GetBufferForLineWithIndex ( lineNum ) ;
1065- if ( logBuffer == null )
1066- {
1067- ReleaseBufferListReaderLock ( ) ;
1068- _logger . Error ( "Cannot find buffer for line {0}, file: {1}{2}" , lineNum , _fileName , IsMultiFile ? " (MultiFile)" : "" ) ;
1069- return default ;
1070- }
1071-
1072- var lockTaken = false ;
10731069 try
10741070 {
1075- logBuffer . AcquireContentLock ( ref lockTaken ) ;
1071+ var ( logBuffer , _) = GetBufferForLineWithIndex ( lineNum ) ;
1072+ if ( logBuffer == null )
1073+ {
1074+ _logger . Error ( "Cannot find buffer for line {0}, file: {1}{2}" , lineNum , _fileName , IsMultiFile ? " (MultiFile)" : "" ) ;
1075+ return default ;
1076+ }
10761077
1077- if ( logBuffer . IsDisposed )
1078+ var lockTaken = false ;
1079+ try
10781080 {
1079- lock ( logBuffer . FileInfo )
1081+ logBuffer . AcquireContentLock ( ref lockTaken ) ;
1082+
1083+ if ( logBuffer . IsDisposed )
10801084 {
1081- ReReadBuffer ( logBuffer ) ;
1085+ lock ( logBuffer . FileInfo )
1086+ {
1087+ ReReadBuffer ( logBuffer ) ;
1088+ }
10821089 }
1083- }
10841090
1085- var line = logBuffer . GetLineMemoryOfBlock ( lineNum - logBuffer . StartLine ) ;
1086- return line . HasValue
1087- ? new ValueTask < ILogLineMemory > ( line . Value )
1088- : default ;
1091+ var line = logBuffer . GetLineMemoryOfBlock ( lineNum - logBuffer . StartLine ) ;
1092+ return line . HasValue
1093+ ? new ValueTask < ILogLineMemory > ( line . Value )
1094+ : default ;
1095+ }
1096+ finally
1097+ {
1098+ if ( lockTaken )
1099+ {
1100+ logBuffer . ReleaseContentLock ( ) ;
1101+ }
1102+ }
10891103 }
10901104 finally
10911105 {
1092- if ( lockTaken )
1093- {
1094- logBuffer . ReleaseContentLock ( ) ;
1095- }
1096-
10971106 ReleaseBufferListReaderLock ( ) ;
10981107 }
10991108 }
@@ -1204,12 +1213,12 @@ private void ReplaceBufferInfos (ILogFileInfo oldLogFileInfo, ILogFileInfo newLo
12041213 /// <param name="matchNamesOnly">
12051214 /// true to match buffers by file name only; false to require an exact object match for the log file information.
12061215 /// </param>
1207- /// <returns>The last LogBuffer instance that was removed; or null if no matching buffers were found. </returns>
1208- private LogBuffer DeleteBuffersForInfo ( ILogFileInfo iLogFileInfo , bool matchNamesOnly )
1216+ /// <returns>The StartLine and LineCount of the Logbuffer that was removed or null</returns>
1217+ private ( int StartLine , int LineCount ) ? DeleteBuffersForInfo ( ILogFileInfo iLogFileInfo , bool matchNamesOnly )
12091218 {
12101219 _logger . Info ( $ "Deleting buffers for file { iLogFileInfo . FullName } ") ;
12111220 ClearBufferState ( ) ;
1212- LogBuffer lastRemovedBuffer = null ;
1221+ ( int StartLine , int LineCount ) ? lastRemovedInfo = null ;
12131222 IList < LogBuffer > deleteList = [ ] ;
12141223
12151224 if ( matchNamesOnly )
@@ -1218,7 +1227,7 @@ private LogBuffer DeleteBuffersForInfo (ILogFileInfo iLogFileInfo, bool matchNam
12181227 {
12191228 if ( buffer . FileInfo . FullName . Equals ( iLogFileInfo . FullName , StringComparison . Ordinal ) )
12201229 {
1221- lastRemovedBuffer = buffer ;
1230+ lastRemovedInfo = ( buffer . StartLine , buffer . LineCount ) ;
12221231 deleteList . Add ( buffer ) ;
12231232 }
12241233 }
@@ -1229,7 +1238,7 @@ private LogBuffer DeleteBuffersForInfo (ILogFileInfo iLogFileInfo, bool matchNam
12291238 {
12301239 if ( buffer . FileInfo == iLogFileInfo )
12311240 {
1232- lastRemovedBuffer = buffer ;
1241+ lastRemovedInfo = ( buffer . StartLine , buffer . LineCount ) ;
12331242 deleteList . Add ( buffer ) ;
12341243 }
12351244 }
@@ -1238,18 +1247,32 @@ private LogBuffer DeleteBuffersForInfo (ILogFileInfo iLogFileInfo, bool matchNam
12381247 foreach ( var buffer in deleteList )
12391248 {
12401249 RemoveFromBufferList ( buffer ) ;
1250+
1251+ var lockTaken = false ;
1252+ try
1253+ {
1254+ buffer . AcquireContentLock ( ref lockTaken ) ;
1255+ _bufferPool . Return ( buffer ) ;
1256+ }
1257+ finally
1258+ {
1259+ if ( lockTaken )
1260+ {
1261+ buffer . ReleaseContentLock ( ) ;
1262+ }
1263+ }
12411264 }
12421265
1243- if ( lastRemovedBuffer == null )
1266+ if ( lastRemovedInfo == null )
12441267 {
12451268 _logger . Info ( CultureInfo . InvariantCulture , "lastRemovedBuffer is null" ) ;
12461269 }
12471270 else
12481271 {
1249- _logger . Info ( CultureInfo . InvariantCulture , "lastRemovedBuffer: startLine={0}" , lastRemovedBuffer . StartLine ) ;
1272+ _logger . Info ( CultureInfo . InvariantCulture , $ "lastRemovedBuffer: startLine={ lastRemovedInfo . Value . StartLine } , lineCount= { lastRemovedInfo . Value . LineCount } " ) ;
12501273 }
12511274
1252- return lastRemovedBuffer ;
1275+ return lastRemovedInfo ;
12531276 }
12541277
12551278 /// <summary>
@@ -1306,12 +1329,6 @@ private void ReadToBufferList (ILogFileInfo logFileInfo, long filePos, int start
13061329 logBuffer = _bufferPool . Rent ( logFileInfo , _maxLinesPerBuffer ) ;
13071330 logBuffer . StartLine = startLine ;
13081331 logBuffer . StartPos = filePos ;
1309- // logBuffer.PrevBuffersDroppedLinesSum = droppedLines;
1310- // logBuffer = new LogBuffer(logFileInfo, _maxLinesPerBuffer)
1311- // {
1312- // StartLine = startLine,
1313- // StartPos = filePos
1314- // };
13151332
13161333 UpgradeBufferlistLockToWriterLock ( ) ;
13171334
@@ -1333,12 +1350,6 @@ private void ReadToBufferList (ILogFileInfo logFileInfo, long filePos, int start
13331350 logBuffer = _bufferPool . Rent ( logFileInfo , _maxLinesPerBuffer ) ;
13341351 logBuffer . StartLine = startLine ;
13351352 logBuffer . StartPos = filePos ;
1336- // logBuffer.PrevBuffersDroppedLinesSum = droppedLines;
1337- // logBuffer = new LogBuffer(logFileInfo, _maxLinesPerBuffer)
1338- // {
1339- // StartLine = startLine,
1340- // StartPos = filePos
1341- // };
13421353
13431354 UpgradeBufferlistLockToWriterLock ( ) ;
13441355
@@ -1424,13 +1435,6 @@ private void ReadToBufferList (ILogFileInfo logFileInfo, long filePos, int start
14241435 newBuffer . StartPos = filePos ;
14251436 newBuffer . PrevBuffersDroppedLinesSum = droppedLines ;
14261437
1427- //var newBuffer = new LogBuffer(logFileInfo, _maxLinesPerBuffer)
1428- //{
1429- // StartLine = lineNum,
1430- // StartPos = filePos,
1431- // PrevBuffersDroppedLinesSum = droppedLines
1432- //};
1433-
14341438 AcquireBufferListWriterLock ( ) ;
14351439
14361440 try
@@ -1580,7 +1584,6 @@ private void GarbageCollectLruCache ()
15801584 try
15811585 {
15821586 removed . LogBuffer . AcquireContentLock ( ref lockTaken ) ;
1583- //removed.LogBuffer.DisposeContent();
15841587 _bufferPool . Return ( removed . LogBuffer ) ;
15851588 }
15861589 finally
@@ -1646,7 +1649,7 @@ private void ClearLru ()
16461649 try
16471650 {
16481651 entry . LogBuffer . AcquireContentLock ( ref lockTaken ) ;
1649- entry . LogBuffer . DisposeContent ( ) ;
1652+ _bufferPool . Return ( entry . LogBuffer ) ;
16501653 }
16511654 finally
16521655 {
@@ -1760,7 +1763,7 @@ private void ReReadBuffer (LogBuffer logBuffer)
17601763#if DEBUG
17611764 Util . AssertTrue (
17621765 _bufferListLock . IsReadLockHeld || _bufferListLock . IsUpgradeableReadLockHeld || _bufferListLock . IsWriteLockHeld ,
1763- "No lock held for buffer list in GetBufferForLineCore " ) ;
1766+ "No lock held for buffer list in GetBufferForLineWithIndex " ) ;
17641767 long startTime = Environment . TickCount ;
17651768#endif
17661769 var arr = _bufferList . Values ;
@@ -1845,7 +1848,7 @@ private void ReReadBuffer (LogBuffer logBuffer)
18451848 }
18461849#if DEBUG
18471850 long endTime = Environment . TickCount ;
1848- _logger . Debug ( $ "getBufferForLine ({ lineNum } ) duration: { endTime - startTime } ms.") ;
1851+ _logger . Debug ( $ "GetBufferForLineWithIndex ({ lineNum } ) duration: { endTime - startTime } ms.") ;
18491852#endif
18501853 return ( null , - 1 ) ;
18511854 }
@@ -1905,11 +1908,8 @@ private void GetLineMemoryFinishedCallback (ILogLineMemory line)
19051908 private LogBuffer GetFirstBufferForFileByLogBuffer ( LogBuffer logBuffer , int index )
19061909 {
19071910 var info = logBuffer . FileInfo ;
1908- AcquireBufferListReaderLock ( ) ;
1909-
19101911 if ( index == - 1 )
19111912 {
1912- ReleaseBufferListReaderLock ( ) ;
19131913 return null ;
19141914 }
19151915
@@ -1925,7 +1925,6 @@ private LogBuffer GetFirstBufferForFileByLogBuffer (LogBuffer logBuffer, int ind
19251925 resultBuffer = _bufferList . Values [ index ] ;
19261926 }
19271927
1928- ReleaseBufferListReaderLock ( ) ;
19291928 return resultBuffer ;
19301929 }
19311930
@@ -1944,14 +1943,12 @@ private async Task MonitorThreadProc ()
19441943 //IFileSystemPlugin fs = PluginRegistry.GetInstance().FindFileSystemForUri(this.watchedILogFileInfo.FullName);
19451944 _logger . Info ( CultureInfo . InvariantCulture , "MonitorThreadProc() for file {0}" , _watchedILogFileInfo . FullName ) ;
19461945
1947- long oldSize ;
19481946 try
19491947 {
19501948 OnLoadingStarted ( new LoadFileEventArgs ( _fileName , 0 , false , 0 , false ) ) ;
19511949 ReadFiles ( ) ;
19521950 if ( ! _isDeleted )
19531951 {
1954- oldSize = _fileLength ;
19551952 OnLoadingFinished ( ) ;
19561953 }
19571954 }
@@ -1988,7 +1985,6 @@ private async Task MonitorThreadProc ()
19881985 }
19891986 else
19901987 {
1991- oldSize = _fileLength ;
19921988 FileChanged ( ) ;
19931989 }
19941990 }
0 commit comments