Changeset 11821 for stable/HeuristicLab.Core/3.3/ThreadSafeLog.cs
- Timestamp:
- 01/26/15 09:29:05 (10 years ago)
- Location:
- stable
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
stable
- Property svn:mergeinfo changed
/trunk/sources merged: 11596-11597,11600
- Property svn:mergeinfo changed
-
stable/HeuristicLab.Core/3.3/ThreadSafeLog.cs
r11170 r11821 21 21 22 22 using System; 23 using System.Collections.Concurrent; 23 24 using System.Collections.Generic; 24 using System.Linq;25 using System.Threading;26 25 using HeuristicLab.Common; 27 26 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable; … … 30 29 [Item("ThreadSafeLog", "A thread-safe log for logging string messages.")] 31 30 [StorableClass] 32 public sealed class ThreadSafeLog : Log { 33 private ReaderWriterLockSlim locker = new ReaderWriterLockSlim(); 31 public sealed class ThreadSafeLog : Item, ILog, IStorableContent { 32 public string Filename { get; set; } 33 private ConcurrentQueue<string> messages; 34 34 35 public override IEnumerable<string> Messages { 36 get { 37 locker.EnterReadLock(); 38 try { 39 return messages.ToArray(); // return copy of messages 40 } finally { locker.ExitReadLock(); } 41 } 35 public IEnumerable<string> Messages { 36 get { return messages.ToArray(); } 37 } 38 39 [Storable(Name = "messages")] 40 private IEnumerable<string> StorableMessages { 41 get { return Messages; } 42 set { messages = new ConcurrentQueue<string>(value); } 43 } 44 45 [Storable] 46 private long maxMessageCount; 47 public long MaxMessageCount { 48 get { return maxMessageCount; } 42 49 } 43 50 44 51 [StorableConstructor] 45 52 private ThreadSafeLog(bool deserializing) : base(deserializing) { } 46 public ThreadSafeLog(long maxMessageCount = -1) 47 : base(maxMessageCount) { 53 private ThreadSafeLog(ThreadSafeLog original, Cloner cloner) 54 : base(original, cloner) { 55 this.messages = new ConcurrentQueue<string>(original.messages); 56 this.maxMessageCount = original.maxMessageCount; 57 } 58 public ThreadSafeLog(long maxMessageCount = int.MaxValue) { 59 this.messages = new ConcurrentQueue<string>(); 60 this.maxMessageCount = maxMessageCount; 48 61 } 49 62 50 private ThreadSafeLog(ThreadSafeLog original, Cloner cloner)51 : base(original, cloner) { }52 53 63 public override IDeepCloneable Clone(Cloner cloner) { 54 locker.EnterReadLock(); 55 try { 56 return new ThreadSafeLog(this, cloner); 57 } finally { locker.ExitReadLock(); } 64 return new ThreadSafeLog(this, cloner); 58 65 } 59 66 60 public override void Clear() { 61 locker.EnterWriteLock(); 62 try { 63 messages.Clear(); 64 } finally { locker.ExitWriteLock(); } 67 public void Clear() { 68 messages = new ConcurrentQueue<string>(); 65 69 OnCleared(); 66 70 } 67 71 68 public override void LogMessage(string message) { 69 string s = FormatLogMessage(message); 70 locker.EnterWriteLock(); 71 try { 72 messages.Add(s); 73 CapMessages(); 74 } finally { locker.ExitWriteLock(); } 72 public void LogMessage(string message) { 73 var s = Log.FormatLogMessage(message); 74 messages.Enqueue(s); 75 CapMessages(); 75 76 OnMessageAdded(s); 76 77 } 77 78 78 public override void LogException(Exception ex) { 79 string s = FormatException(ex); 80 locker.EnterWriteLock(); 81 try { 82 messages.Add(s); 83 CapMessages(); 84 } finally { locker.ExitWriteLock(); } 79 public void LogException(Exception ex) { 80 var s = Log.FormatException(ex); 81 messages.Enqueue(s); 82 CapMessages(); 85 83 OnMessageAdded(s); 84 } 85 86 private readonly object capLock = new object(); 87 private void CapMessages() { 88 lock (capLock) { 89 string s; 90 while (messages.Count > maxMessageCount) 91 if (!messages.TryDequeue(out s)) break; 92 } 93 } 94 95 public event EventHandler<EventArgs<string>> MessageAdded; 96 private void OnMessageAdded(string message) { 97 var handler = MessageAdded; 98 if (handler != null) handler(this, new EventArgs<string>(message)); 99 } 100 101 public event EventHandler Cleared; 102 private void OnCleared() { 103 var handler = Cleared; 104 if (handler != null) handler(this, EventArgs.Empty); 86 105 } 87 106 }
Note: See TracChangeset
for help on using the changeset viewer.