using System; using System.Threading; using ZeroLevel.Logging; using ZeroLevel.Services.Collections; namespace ZeroLevel.Services.Logging { internal sealed class FixSizeLogMessageBuffer : ILogMessageBuffer { private readonly FixSizeQueue> _queue; private readonly ManualResetEvent _waitItemsFlag = new ManualResetEvent(false); public FixSizeLogMessageBuffer(long backlog) { _queue = new FixSizeQueue>(backlog); } public long Count { get { return _queue.Count; } } public void Dispose() { _waitItemsFlag.Dispose(); } public void Push(LogLevel level, string message) { _queue.Push(new Tuple(level, message)); _waitItemsFlag.Set(); } public Tuple Take() { while (_queue.Count == 0) _waitItemsFlag.WaitOne(110); var t = _queue.Take(); if (_queue.Count == 0) _waitItemsFlag.Reset(); return t; } } }