64 lines
1.3 KiB
C#
64 lines
1.3 KiB
C#
using System.Diagnostics;
|
|
|
|
namespace Salmon.Core.Depth;
|
|
|
|
public class EventManager
|
|
{
|
|
public long MaxBufferedEvents { get; set; } = 2000;
|
|
Queue<string> _EventIds = new ();
|
|
Dictionary<string, Event> _LastEvents = new ();
|
|
object Mutex = new();
|
|
|
|
public EventManager()
|
|
{
|
|
|
|
}
|
|
|
|
void Trim()
|
|
{
|
|
List<string> toDelete = new();
|
|
|
|
lock(Mutex)
|
|
while(_LastEvents.Count > MaxBufferedEvents)
|
|
_LastEvents.Remove(_EventIds.Dequeue());
|
|
}
|
|
|
|
void Set(Event e)
|
|
{
|
|
ArgumentNullException.ThrowIfNull(e, "e");
|
|
|
|
lock (Mutex)
|
|
{
|
|
Debug.Assert(_LastEvents.ContainsKey(e.UniqueId));
|
|
_LastEvents[e.UniqueId] = e;
|
|
}
|
|
}
|
|
|
|
void Add(Event e)
|
|
{
|
|
ArgumentNullException.ThrowIfNull (e, "e");
|
|
|
|
|
|
lock (Mutex)
|
|
{
|
|
Debug.Assert(!_LastEvents.ContainsKey(e.UniqueId));
|
|
|
|
_EventIds.Enqueue(e.UniqueId);
|
|
_LastEvents.Add(e.UniqueId, e);
|
|
}
|
|
|
|
Trim();
|
|
}
|
|
|
|
public void Push(Event e)
|
|
{
|
|
ArgumentNullException.ThrowIfNull(e, "e");
|
|
|
|
Add(e);
|
|
}
|
|
|
|
public IEnumerable<Event> GetLastEvents(int maxCount = 200)
|
|
{
|
|
return _LastEvents.Values.OrderByDescending(x => x.When).Take(maxCount).ToList();
|
|
}
|
|
} |