Skip to content

Commit bbed28f

Browse files
committed
Fixed issue #12
- Replaced message list by a fixed sized queue to prevent out of memory exceptions.
1 parent b840d31 commit bbed28f

File tree

12 files changed

+131
-38
lines changed

12 files changed

+131
-38
lines changed

src/Couchcoding.Logbert.Gui/Properties/AssemblyInfo.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -31,5 +31,5 @@
3131
// You can specify all the values or you can default the Build and Revision Numbers
3232
// by using the '*' as shown below:
3333
// [assembly: AssemblyVersion("1.0.*")]
34-
[assembly: AssemblyVersion("1.5.6.1")]
35-
[assembly: AssemblyFileVersion("1.5.6.1")]
34+
[assembly: AssemblyVersion("1.5.7.0")]
35+
[assembly: AssemblyFileVersion("1.5.7.0")]

src/Couchcoding.Logbert.Theme/Properties/AssemblyInfo.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -31,5 +31,5 @@
3131
// You can specify all the values or you can default the Build and Revision Numbers
3232
// by using the '*' as shown below:
3333
// [assembly: AssemblyVersion("1.0.*")]
34-
[assembly: AssemblyVersion("1.5.6.1")]
35-
[assembly: AssemblyFileVersion("1.5.6.1")]
34+
[assembly: AssemblyVersion("1.5.7.0")]
35+
[assembly: AssemblyFileVersion("1.5.7.0")]

src/Logbert/Helper/FixedSizedQueue.cs

+97
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
#region Copyright © 2019 Couchcoding
2+
3+
// File: FixedSizedQueue.cs
4+
// Package: Logbert
5+
// Project: Logbert
6+
//
7+
// The MIT License (MIT)
8+
//
9+
// Copyright (c) 2019 Couchcoding
10+
//
11+
// Permission is hereby granted, free of charge, to any person obtaining a copy
12+
// of this software and associated documentation files (the "Software"), to deal
13+
// in the Software without restriction, including without limitation the rights
14+
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
15+
// copies of the Software, and to permit persons to whom the Software is
16+
// furnished to do so, subject to the following conditions:
17+
//
18+
// The above copyright notice and this permission notice shall be included in
19+
// all copies or substantial portions of the Software.
20+
//
21+
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
22+
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23+
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
24+
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
25+
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
26+
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
27+
// THE SOFTWARE.
28+
29+
#endregion
30+
31+
using System.Collections.Concurrent;
32+
33+
namespace Couchcoding.Logbert.Helper
34+
{
35+
/// <summary>
36+
/// Implements a <see cref="ConcurrentQueue{T}"/> of a fixed size.
37+
/// </summary>
38+
internal class FixedSizedQueue<T> : ConcurrentQueue<T>
39+
{
40+
#region Private Fields
41+
42+
/// <summary>
43+
/// Simple object for thread synchronization.
44+
/// </summary>
45+
private readonly object mSyncObject = new object();
46+
47+
#endregion
48+
49+
#region Public Properties
50+
51+
/// <summary>
52+
/// Gets the fixed size of the <see cref="FixedSizedQueue{T}"/>.
53+
/// </summary>
54+
public int Size
55+
{
56+
get;
57+
}
58+
59+
#endregion
60+
61+
#region Public Methods
62+
63+
/// <summary>
64+
/// Adds an object at the end of the <see cref="FixedSizedQueue{T}"/>.
65+
/// </summary>
66+
/// <param name="obj">The object to add at the end of the <see cref="FixedSizedQueue{T}"/></param>
67+
public new void Enqueue(T obj)
68+
{
69+
// Add the object to the queue.
70+
base.Enqueue(obj);
71+
72+
lock (mSyncObject)
73+
{
74+
while (base.Count > Size)
75+
{
76+
// Ensure we don't exceed the maximum size.
77+
TryDequeue(out T outObj);
78+
}
79+
}
80+
}
81+
82+
#endregion
83+
84+
#region Constructor
85+
86+
/// <summary>
87+
/// Creates a new instance of the <see cref="FixedSizedQueue{T}"/> with the specified <paramref name="size"/>.
88+
/// </summary>
89+
/// <param name="size">The maximum size of the <see cref="FixedSizedQueue{T}"/>.</param>
90+
public FixedSizedQueue(int size)
91+
{
92+
Size = size;
93+
}
94+
95+
#endregion
96+
}
97+
}

src/Logbert/Logbert.csproj

+1
Original file line numberDiff line numberDiff line change
@@ -266,6 +266,7 @@
266266
</Compile>
267267
<Compile Include="Helper\Browser.cs" />
268268
<Compile Include="Helper\EncodingWrapper.cs" />
269+
<Compile Include="Helper\FixedSizedQueue.cs" />
269270
<Compile Include="Helper\FontCache.cs" />
270271
<Compile Include="Helper\GdiCache.cs" />
271272
<Compile Include="Helper\Extensions.cs" />

src/Logbert/Properties/AssemblyInfo.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,6 @@
2929
// Build Number
3030
// Revision
3131
//
32-
[assembly: AssemblyVersion("1.5.6.1")]
33-
[assembly: AssemblyFileVersion("1.5.6.1")]
32+
[assembly: AssemblyVersion("1.5.7.0")]
33+
[assembly: AssemblyFileVersion("1.5.7.0")]
3434
[assembly: NeutralResourcesLanguageAttribute("")]

src/Logbert/Receiver/CustomReceiver/CustomDirReceiver/CustomDirReceiver.cs

+4-6
Original file line numberDiff line numberDiff line change
@@ -268,7 +268,8 @@ private void ReadNewLogMessagesFromFile()
268268
string currentLine;
269269
string messageLines = string.Empty;
270270

271-
List<LogMessage> messages = new List<LogMessage>();
271+
FixedSizedQueue<LogMessage> messages = new FixedSizedQueue<LogMessage>(
272+
Properties.Settings.Default.MaxLogMessages);
272273

273274
while ((currentLine = mFileReader.ReadLine()) != null)
274275
{
@@ -292,15 +293,12 @@ private void ReadNewLogMessagesFromFile()
292293
messageLines = string.Empty;
293294

294295
mLogNumber++;
295-
messages.Add(cstmLgMsg);
296+
messages.Enqueue(cstmLgMsg);
296297
}
297298

298299
mLastFileOffset = mFileReader.BaseStream.Position;
299300

300-
if (mLogHandler != null)
301-
{
302-
mLogHandler.HandleMessage(messages.ToArray());
303-
}
301+
mLogHandler?.HandleMessage(messages.ToArray());
304302
}
305303

306304
#endregion

src/Logbert/Receiver/CustomReceiver/CustomFileReceiver/CustomFileReceiver.cs

+4-6
Original file line numberDiff line numberDiff line change
@@ -244,7 +244,8 @@ private void ReadNewLogMessagesFromFile()
244244
string currentLine;
245245
string messageLines = string.Empty;
246246

247-
List<LogMessage> messages = new List<LogMessage>();
247+
FixedSizedQueue<LogMessage> messages = new FixedSizedQueue<LogMessage>(
248+
Properties.Settings.Default.MaxLogMessages);
248249

249250
while ((currentLine = mFileReader.ReadLine()) != null)
250251
{
@@ -268,15 +269,12 @@ private void ReadNewLogMessagesFromFile()
268269
messageLines = string.Empty;
269270

270271
mLogNumber++;
271-
messages.Add(cstmLgMsg);
272+
messages.Enqueue(cstmLgMsg);
272273
}
273274

274275
mLastFileOffset = mFileReader.BaseStream.Position;
275276

276-
if (mLogHandler != null)
277-
{
278-
mLogHandler.HandleMessage(messages.ToArray());
279-
}
277+
mLogHandler?.HandleMessage(messages.ToArray());
280278
}
281279

282280
#endregion

src/Logbert/Receiver/Log4NetDirReceiver/Log4NetDirReceiver.cs

+3-2
Original file line numberDiff line numberDiff line change
@@ -258,7 +258,8 @@ private void ReadNewLogMessagesFromFile()
258258
string line;
259259
string dataToParse = string.Empty;
260260

261-
List<LogMessage> messages = new List<LogMessage>();
261+
FixedSizedQueue<LogMessage> messages = new FixedSizedQueue<LogMessage>(
262+
Properties.Settings.Default.MaxLogMessages);
262263

263264
while ((line = mFileReader.ReadLine()) != null)
264265
{
@@ -284,7 +285,7 @@ private void ReadNewLogMessagesFromFile()
284285
continue;
285286
}
286287

287-
messages.Add(newLogMsg);
288+
messages.Enqueue(newLogMsg);
288289

289290
dataToParse = dataToParse.Substring(
290291
log4NetEndTag

src/Logbert/Receiver/Log4NetFileReceiver/Log4NetFileReceiver.cs

+3-2
Original file line numberDiff line numberDiff line change
@@ -265,7 +265,8 @@ private void ReadNewLogMessagesFromFile()
265265
string line;
266266
string dataToParse = string.Empty;
267267

268-
List<LogMessage> messages = new List<LogMessage>();
268+
FixedSizedQueue<LogMessage> messages = new FixedSizedQueue<LogMessage>(
269+
Properties.Settings.Default.MaxLogMessages);
269270

270271
while ((line = mFileReader.ReadLine()) != null)
271272
{
@@ -291,7 +292,7 @@ private void ReadNewLogMessagesFromFile()
291292
continue;
292293
}
293294

294-
messages.Add(newLogMsg);
295+
messages.Enqueue(newLogMsg);
295296

296297
dataToParse = dataToParse.Substring(
297298
log4NetEndTag

src/Logbert/Receiver/NLogDirReceiver/NLogDirReceiver.cs

+3-2
Original file line numberDiff line numberDiff line change
@@ -258,7 +258,8 @@ private void ReadNewLogMessagesFromFile()
258258
string line;
259259
string dataToParse = string.Empty;
260260

261-
List<LogMessage> messages = new List<LogMessage>();
261+
FixedSizedQueue<LogMessage> messages = new FixedSizedQueue<LogMessage>(
262+
Properties.Settings.Default.MaxLogMessages);
262263

263264
while ((line = mFileReader.ReadLine()) != null)
264265
{
@@ -284,7 +285,7 @@ private void ReadNewLogMessagesFromFile()
284285
continue;
285286
}
286287

287-
messages.Add(newLogMsg);
288+
messages.Enqueue(newLogMsg);
288289

289290
dataToParse = dataToParse.Substring(
290291
nLogEndTag

src/Logbert/Receiver/NLogFileReceiver/NLogFileReceiver.cs

+4-6
Original file line numberDiff line numberDiff line change
@@ -266,7 +266,8 @@ private void ReadNewLogMessagesFromFile()
266266
string line;
267267
string dataToParse = string.Empty;
268268

269-
List<LogMessage> messages = new List<LogMessage>();
269+
FixedSizedQueue<LogMessage> messages = new FixedSizedQueue<LogMessage>(
270+
Properties.Settings.Default.MaxLogMessages);
270271

271272
while ((line = mFileReader.ReadLine()) != null)
272273
{
@@ -292,7 +293,7 @@ private void ReadNewLogMessagesFromFile()
292293
continue;
293294
}
294295

295-
messages.Add(newLogMsg);
296+
messages.Enqueue(newLogMsg);
296297

297298
dataToParse = dataToParse.Substring(
298299
log4NetEndTag
@@ -302,10 +303,7 @@ private void ReadNewLogMessagesFromFile()
302303

303304
mLastFileOffset = mFileReader.BaseStream.Position;
304305

305-
if (mLogHandler != null)
306-
{
307-
mLogHandler.HandleMessage(messages.ToArray());
308-
}
306+
mLogHandler?.HandleMessage(messages.ToArray());
309307
}
310308

311309
#endregion

src/Logbert/Receiver/SyslogFileReceiver/SyslogFileReceiver.cs

+6-8
Original file line numberDiff line numberDiff line change
@@ -277,12 +277,13 @@ private void ReadNewLogMessagesFromFile()
277277
}
278278

279279
mFileReader.BaseStream.Seek(
280-
mLastFileOffset
280+
mLastFileOffset
281281
, SeekOrigin.Begin);
282282

283283
string line;
284284

285-
List<LogMessage> messages = new List<LogMessage>();
285+
FixedSizedQueue<LogMessage> messages = new FixedSizedQueue<LogMessage>(
286+
Properties.Settings.Default.MaxLogMessages);
286287

287288
while ((line = mFileReader.ReadLine()) != null)
288289
{
@@ -293,23 +294,20 @@ private void ReadNewLogMessagesFromFile()
293294

294295
try
295296
{
296-
messages.Add(new LogMessageSyslog(
297+
messages.Enqueue(new LogMessageSyslog(
297298
line
298299
, ++mLogNumber
299300
, mTimestampFormat));
300301
}
301302
catch (Exception ex)
302303
{
303304
Logger.Warn(ex.Message);
305+
}
304306
}
305-
}
306307

307308
mLastFileOffset = mFileReader.BaseStream.Position;
308309

309-
if (mLogHandler != null)
310-
{
311-
mLogHandler.HandleMessage(messages.ToArray());
312-
}
310+
mLogHandler?.HandleMessage(messages.ToArray());
313311
}
314312

315313
#endregion

0 commit comments

Comments
 (0)