Changeset 12694 for branches/HeuristicLab.Problems.Orienteering/HeuristicLab.Core/3.3/ThreadSafeLog.cs
- Timestamp:
- 07/09/15 13:07:30 (9 years ago)
- Location:
- branches/HeuristicLab.Problems.Orienteering
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/HeuristicLab.Problems.Orienteering
- Property svn:mergeinfo changed
-
Property
svn:global-ignores
set to
*.nuget
packages
-
branches/HeuristicLab.Problems.Orienteering/HeuristicLab.Core
-
Property
svn:mergeinfo
set to
(toggle deleted branches)
/branches/HLScript/HeuristicLab.Core merged eligible /stable/HeuristicLab.Core merged eligible /trunk/sources/HeuristicLab.Core merged eligible /branches/1721-RandomForestPersistence/HeuristicLab.Core 10321-10322 /branches/Algorithms.GradientDescent/HeuristicLab.Core 5516-5520 /branches/Benchmarking/sources/HeuristicLab.Core 6917-7005 /branches/CloningRefactoring/HeuristicLab.Core 4656-4721 /branches/CodeEditor/HeuristicLab.Core 11700-11806 /branches/DataAnalysis Refactoring/HeuristicLab.Core 5471-5808 /branches/DataAnalysis SolutionEnsembles/HeuristicLab.Core 5815-6180 /branches/DataAnalysis/HeuristicLab.Core 4458-4459,4462,4464 /branches/DataPreprocessing/HeuristicLab.Core 10085-11101 /branches/GP.Grammar.Editor/HeuristicLab.Core 6284-6795 /branches/GP.Symbols (TimeLag, Diff, Integral)/HeuristicLab.Core 5060 /branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Core 11570-12508 /branches/HeuristicLab.Problems.DataAnalysis.Trading/HeuristicLab.Core 6123-9799 /branches/LogResidualEvaluator/HeuristicLab.Core 10202-10483 /branches/NET40/sources/HeuristicLab.Core 5138-5162 /branches/NSGA-II Changes/HeuristicLab.Core 12033-12122 /branches/NewItemDialog/HeuristicLab.Core 12240,12246 /branches/ParallelEngine/HeuristicLab.Core 5175-5192 /branches/ProblemInstancesRegressionAndClassification/HeuristicLab.Core 7568-7810 /branches/QAPAlgorithms/HeuristicLab.Core 6350-6627 /branches/Restructure trunk solution/HeuristicLab.Core 6828 /branches/RuntimeOptimizer/HeuristicLab.Core 8943-9078 /branches/ScatterSearch (trunk integration)/HeuristicLab.Core 7787-8333 /branches/SlaveShutdown/HeuristicLab.Core 8944-8956 /branches/SpectralKernelForGaussianProcesses/HeuristicLab.Core 10204-10479 /branches/SuccessProgressAnalysis/HeuristicLab.Core 5370-5682 /branches/Trunk/HeuristicLab.Core 6829-6865 /branches/UnloadJobs/HeuristicLab.Core 9168-9215 /branches/VNS/HeuristicLab.Core 5594-5752 /branches/histogram/HeuristicLab.Core 5959-6341
-
Property
svn:mergeinfo
set to
(toggle deleted branches)
-
branches/HeuristicLab.Problems.Orienteering/HeuristicLab.Core/3.3/ThreadSafeLog.cs
r11185 r12694 1 1 #region License Information 2 2 /* HeuristicLab 3 * Copyright (C) 2002-201 4Heuristic and Evolutionary Algorithms Laboratory (HEAL)3 * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL) 4 4 * 5 5 * This file is part of HeuristicLab. … … 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.