Skip to content

Commit a1c8dc8

Browse files
author
BRUNER Patrick
committed
optimisations
1 parent 6650158 commit a1c8dc8

3 files changed

Lines changed: 72 additions & 83 deletions

File tree

src/LogExpert.Core/Classes/Log/LogBuffer.cs

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -20,24 +20,18 @@ public class LogBuffer
2020
private LogLine[] _lineArray;
2121
private int _lineArrayLength; // capacity of the rented array
2222

23-
//private readonly List<LogLine> _lineList;
24-
2523
private int MAX_LINES = 500;
2624

2725
#endregion
2826

2927
#region cTor
3028

31-
//public LogBuffer() { }
32-
3329
// Don't use a primary constructor here: field initializers (like MAX_LINES) run before primary constructor parameters are assigned,
3430
// so MAX_LINES would always be set to its default value before the constructor body can assign it. Use a regular constructor instead.
3531
public LogBuffer (ILogFileInfo fileInfo, int maxLines)
3632
{
3733
FileInfo = fileInfo;
3834
MAX_LINES = maxLines;
39-
//_lineList = new(MAX_LINES);
40-
4135
_lineArray = ArrayPool<LogLine>.Shared.Rent(maxLines);
4236
_lineArrayLength = _lineArray.Length;
4337
#if DEBUG
@@ -89,8 +83,6 @@ public long Size
8983

9084
public void AddLine (LogLine lineMemory, long filePos)
9185
{
92-
//_lineList.Add(lineMemory);
93-
9486
if (LineCount < _lineArrayLength)
9587
{
9688
_lineArray[LineCount] = lineMemory;
@@ -112,7 +104,6 @@ public void AddLine (LogLine lineMemory, long filePos)
112104
public void ClearLines ()
113105
{
114106
Array.Clear(_lineArray, 0, LineCount);
115-
//_lineList.Clear();
116107
LineCount = 0;
117108
}
118109

@@ -140,8 +131,6 @@ public void Reinitialise (ILogFileInfo fileInfo, int maxLines)
140131

141132
public void DisposeContent ()
142133
{
143-
//_lineList.Clear();
144-
145134
if (_lineArray != null)
146135
{
147136
Array.Clear(_lineArray, 0, LineCount);
@@ -161,9 +150,6 @@ public void DisposeContent ()
161150
return num < LineCount && num >= 0
162151
? _lineArray[num]
163152
: null;
164-
//return num < _lineList.Count && num >= 0
165-
// ? _lineList[num]
166-
// : null;
167153
}
168154

169155
/// <summary>

src/LogExpert.Core/Classes/Log/LogBufferPool.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,13 @@ public LogBuffer Rent (ILogFileInfo fileInfo, int maxLines)
2020
return new LogBuffer(fileInfo, maxLines);
2121
}
2222

23+
/// <summary>
24+
/// Returns a <see cref="LogBuffer"/> to the pool for reuse.
25+
/// </summary>
26+
/// <remarks>
27+
/// Disposing the buffer's content is handled by this method, so callers should not dispose the buffer themselves.
28+
/// </remarks>
29+
/// <param name="buffer">The buffer to return.</param>
2330
public void Return (LogBuffer buffer)
2431
{
2532
ArgumentNullException.ThrowIfNull(buffer);

src/LogExpert.Core/Classes/Log/LogfileReader.cs

Lines changed: 65 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)