changeset 199:43b1017ce100 v2

Слияние с default
author cin
date Fri, 14 Oct 2016 03:33:17 +0300
parents ea485487a424 (diff) b305c678923a (current diff)
children 71e543dbe65a
files
diffstat 12 files changed, 89 insertions(+), 58 deletions(-) [+]
line wrap: on
line diff
--- a/Implab/Diagnostics/EventText.cs	Mon Oct 10 03:14:00 2016 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,12 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-
-namespace Implab.Diagnostics {
-    public struct EventText {
-        public int indent;
-
-        public string content;
-    }
-}
--- a/Implab/Diagnostics/ListenerBase.cs	Mon Oct 10 03:14:00 2016 +0300
+++ b/Implab/Diagnostics/ListenerBase.cs	Fri Oct 14 03:33:17 2016 +0300
@@ -59,8 +59,8 @@
 
         public void UnsubscribeAll() {
             lock (m_subscriptions) {
-                foreach (var subscription in m_subscriptions.Values)
-                    subscription();
+                foreach (var remove in m_subscriptions.Values)
+                    remove();
                 m_subscriptions.Clear();
             }
         }
--- a/Implab/Diagnostics/LogChannel.cs	Mon Oct 10 03:14:00 2016 +0300
+++ b/Implab/Diagnostics/LogChannel.cs	Fri Oct 14 03:33:17 2016 +0300
@@ -69,7 +69,7 @@
                     this,
                     new LogEventArgs<TEvent>(
                         data,
-                        Name,
+                        this,
                         traceContext.ThreadId,
                         traceContext.CurrentOperation,
                         traceContext.CurrentOperation.Duration
@@ -77,5 +77,9 @@
                 );
             }
         }
+
+        public override string ToString() {
+            return Name;
+        }
     }
 }
--- a/Implab/Diagnostics/LogEventArgs.cs	Mon Oct 10 03:14:00 2016 +0300
+++ b/Implab/Diagnostics/LogEventArgs.cs	Fri Oct 14 03:33:17 2016 +0300
@@ -2,7 +2,7 @@
 
 namespace Implab.Diagnostics {
     public class LogEventArgs : EventArgs {
-        public string ChannelName {
+        public object Channel {
             get;
             private set;
         }
@@ -18,8 +18,8 @@
             get;
             private set;
         }
-        public LogEventArgs(string channelName, int threadId, LogicalOperation operation, int timeOffset) {
-            ChannelName = channelName;
+        public LogEventArgs(object channel, int threadId, LogicalOperation operation, int timeOffset) {
+            Channel = channel;
             ThreadId = threadId;
             Operation = operation;
             OperationTimeOffset = timeOffset;
--- a/Implab/Diagnostics/LogEventArgsT.cs	Mon Oct 10 03:14:00 2016 +0300
+++ b/Implab/Diagnostics/LogEventArgsT.cs	Fri Oct 14 03:33:17 2016 +0300
@@ -5,7 +5,7 @@
             private set;
         }
 
-        public LogEventArgs(TEvent value,string channelName, int threadId, LogicalOperation operation, int timeOffset) : base(channelName, threadId, operation, timeOffset) {
+        public LogEventArgs(TEvent value,object channel, int threadId, LogicalOperation operation, int timeOffset) : base(channel, threadId, operation, timeOffset) {
             Value = value;
         }
     }
--- a/Implab/Diagnostics/OperationContext.cs	Mon Oct 10 03:14:00 2016 +0300
+++ b/Implab/Diagnostics/OperationContext.cs	Fri Oct 14 03:33:17 2016 +0300
@@ -30,11 +30,11 @@
                 else if (m_ownership)
                     m_current = LogicalOperation.EMPTY;
                 else {
-                    TraceLog.TraceWarning("DetachLogicalOperation can't be applied in the current context");
+                    TraceLog.TraceWarning("DetachLogicalOperation can't be performed in the current context");
                     detached = LogicalOperation.EMPTY;
                 }
             } else {
-                TraceLog.TraceWarning("DetachLogicalOperation can't be applied in the current context");
+                TraceLog.TraceWarning("DetachLogicalOperation can't be performed in the current context");
             }
 
             return detached;
@@ -50,7 +50,7 @@
                     m_ownership = false;
                 }
             } else {
-                TraceLog.TraceWarning("EndLogicalOperation can't be applied in the current context");
+                TraceLog.TraceWarning("EndLogicalOperation can't be performed in the current context");
             }
             return current;
         }
--- a/Implab/Diagnostics/TextFileListener.cs	Mon Oct 10 03:14:00 2016 +0300
+++ b/Implab/Diagnostics/TextFileListener.cs	Fri Oct 14 03:33:17 2016 +0300
@@ -18,7 +18,7 @@
             var msg = new StringBuilder();
             for (int i = 0; i < args.Operation.Level; i++)
                 msg.Append("  ");
-            msg.AppendFormat("[{0}]:{1}: {2}", args.ThreadId, args.ChannelName, entry);
+            msg.AppendFormat("[{0}]:{1}: {2}", args.ThreadId, args.Channel, entry);
 
             lock (m_textWriter) {
                 if (!IsDisposed) {
--- a/Implab/Diagnostics/TraceContext.cs	Mon Oct 10 03:14:00 2016 +0300
+++ b/Implab/Diagnostics/TraceContext.cs	Fri Oct 14 03:33:17 2016 +0300
@@ -56,9 +56,8 @@
             StartLogicalOperation(String.Empty);
         }
 
-        public void EndLogicalOperation() {
-            var op = m_current.EndLogicalOperation();
-            LogChannel<TraceEvent>.Default.LogEvent(new TraceEvent(TraceEventType.OperationCompleted, String.Format("-{0} : {1}ms",op.Name, op.Duration)));
+        public LogicalOperation EndLogicalOperation() {
+            return m_current.EndLogicalOperation();
         }
 
         public LogicalOperation DetachLogicalOperation() {
--- a/Implab/Diagnostics/TraceEvent.cs	Mon Oct 10 03:14:00 2016 +0300
+++ b/Implab/Diagnostics/TraceEvent.cs	Fri Oct 14 03:33:17 2016 +0300
@@ -12,18 +12,36 @@
             private set;
         }
 
-        public TraceEvent(TraceEventType type, string message) {
+        /// <summary>
+        /// The logical operation this event belongs to.
+        /// </summary>
+        public LogicalOperation Operation {
+            get;
+            private set;
+        }
+
+        /// <summary>
+        /// Gets the time offset in milliseconds from the start of the operation, if the operation is not specified the value is zero.
+        /// </summary>
+        public int OperationTime {
+            get;
+            private set;
+        }
+
+        public TraceEvent(LogicalOperation operation, TraceEventType type, string message) {
             EventType = type;
             Message = message;
+            Operation = operation;
+            if (operation != null)
+                OperationTime = operation.Duration;
         }
 
         public override string ToString() {
-            /*return EventType == TraceEventType.Information ? Message : String.Format("{0}: {1}", EventType, Message);*/
             return Message;
         }
 
-        public static TraceEvent Create(TraceEventType type, string format, params object[] args) {
-            return new TraceEvent(type, format == null ? String.Empty : String.Format(format, args));
+        public static TraceEvent Create(LogicalOperation operation, TraceEventType type, string format, params object[] args) {
+            return new TraceEvent(operation, type, format == null ? String.Empty : String.Format(format, args));
         }
     }
 }
--- a/Implab/Diagnostics/TraceLog.cs	Mon Oct 10 03:14:00 2016 +0300
+++ b/Implab/Diagnostics/TraceLog.cs	Fri Oct 14 03:33:17 2016 +0300
@@ -7,31 +7,51 @@
 
 namespace Implab.Diagnostics {
     /// <summary>
-    /// Класс для публикации событий выполнения программы, события публикуются через <see cref="LogChannel{TraceEvent}"/>.
-    /// Журнал трассировки отражает логический ход выполнения программы и существует всегда, поскольку тесно связан с 
-    /// контекстом трассировки.
+    /// This class is used to trace a logical flow of the application, it publishes events to the default <see cref="TraceEvent"/> channel.
     /// </summary>
     public static class TraceLog {
+        /// <summary>
+        /// Starts the logical operation nested to the current operation nested to the current one.
+        /// </summary>
         [Conditional("TRACE")]
         public static void StartLogicalOperation() {
             TraceContext.Instance.StartLogicalOperation();
+
         }
 
+        /// <summary>
+        /// Starts the logical operation with the specified name, this name is usefull in logs.
+        /// </summary>
+        /// <param name="name">Name.</param>
         [Conditional("TRACE")]
         public static void StartLogicalOperation(string name) {
             TraceContext.Instance.StartLogicalOperation(name);
         }
 
+        /// <summary>
+        /// Ends the logical operation and restores the previous one.
+        /// </summary>
         [Conditional("TRACE")]
         public static void EndLogicalOperation() {
-            TraceContext.Instance.EndLogicalOperation();
+            var op = TraceContext.Instance.EndLogicalOperation();
+            LogChannel<TraceEvent>.Default.LogEvent(new TraceEvent(TraceEventType.OperationCompleted, String.Format("-{0} : {1}ms",op.Name, op.Duration)));
         }
 
+        /// <summary>
+        /// Writes an informational message.
+        /// </summary>
+        /// <param name="format">Format.</param>
+        /// <param name="arguments">Arguments.</param>
         [Conditional("TRACE")]
         public static void TraceInformation(string format, params object[] arguments) {
             LogChannel<TraceEvent>.Default.LogEvent(TraceEvent.Create(TraceEventType.Information, format, arguments));
         }
 
+        /// <summary>
+        /// Writes a warning message.
+        /// </summary>
+        /// <param name="format">Format.</param>
+        /// <param name="arguments">Arguments.</param>
         [Conditional("TRACE")]
         public static void TraceWarning(string format, params object[] arguments) {
             LogChannel<TraceEvent>.Default.LogEvent(TraceEvent.Create(TraceEventType.Warning, format, arguments));
--- a/Implab/Implab.csproj	Mon Oct 10 03:14:00 2016 +0300
+++ b/Implab/Implab.csproj	Fri Oct 14 03:33:17 2016 +0300
@@ -77,7 +77,6 @@
   <ItemGroup>
     <Compile Include="CustomEqualityComparer.cs" />
     <Compile Include="Diagnostics\ConsoleTraceListener.cs" />
-    <Compile Include="Diagnostics\EventText.cs" />
     <Compile Include="Diagnostics\LogChannel.cs" />
     <Compile Include="Diagnostics\LogicalOperation.cs" />
     <Compile Include="Diagnostics\TextFileListener.cs" />
--- a/MonoPlay/Program.cs	Mon Oct 10 03:14:00 2016 +0300
+++ b/MonoPlay/Program.cs	Fri Oct 14 03:33:17 2016 +0300
@@ -4,39 +4,42 @@
 using Implab.Formats.JSON;
 using System.IO;
 using System.Text.Json;
+using System.Diagnostics;
+using Implab.Parallels;
+using System.Threading;
 
 namespace MonoPlay {
     class MainClass {
 
 
         public static void Main(string[] args) {
-            if (args == null)
-                throw new ArgumentNullException("args");
-            int t1, t2;
+            var pool = new WorkerPool(10);
 
-            for (int i = 0; i < 2; i++) {
-                t1 = Environment.TickCount;
-                int elements =0;
-                using (var reader = new JSONParser(File.OpenText("/home/sergey/temp/citylots.json"))) {
-                    while (reader.Read())
-                        elements++;
-                }
+            var listerner = new ConsoleTraceListener();
+            listerner.TraceOutputOptions = TraceOptions.LogicalOperationStack;
+            Trace.Listeners.Add(listerner);
+
+            Trace.CorrelationManager.StartLogicalOperation("Main");
 
-                t2 = Environment.TickCount;
-                Console.WriteLine("attempt {0} done: {1} ms, {2:.00} Mb, {3} GC, Elements: {4}",i+1, t2 - t1, GC.GetTotalMemory(false) / (1024*1024), GC.CollectionCount(0), elements );
-            }
+            var d = pool.Invoke(() => {
+                Trace.CorrelationManager.StartLogicalOperation("Worker");
+                Thread.Sleep(100);
+                Trace.TraceInformation("worker done");
+                Trace.CorrelationManager.StopLogicalOperation();
+            });
 
-            Console.WriteLine("Syste.Text.Json");
-            var paraser = new JsonParser();
-            for (int i = 0; i < 2; i++) {
-                t1 = Environment.TickCount;
-                using (var reader = File.OpenText("/home/sergey/temp/citylots.json")) {
-                    paraser.Parse(reader);
-                }
+            ThreadPool.QueueUserWorkItem((o) => {
+                Trace.CorrelationManager.StartLogicalOperation("Thread");
+                Thread.Sleep(100);
+                Trace.TraceInformation("thread done");
+                Trace.CorrelationManager.StopLogicalOperation();
+            });
 
-                t2 = Environment.TickCount;
-                Console.WriteLine("attempt {0} done: {1} ms, {2:.00} Mb, {3} GC, ",i+1, t2 - t1, GC.GetTotalMemory(false) / (1024*1024), GC.CollectionCount(0));
-            }
+            Trace.TraceInformation("main done");
+            Trace.CorrelationManager.StopLogicalOperation();
+
+            d.Join();
+
 
 
         }