Auto status change to "Under Review"
| @@ -19,7 +19,9 | |||||
| 19 | </ItemGroup> |
|
19 | </ItemGroup> | |
| 20 |
|
20 | |||
| 21 | <ItemGroup> |
|
21 | <ItemGroup> | |
| 22 |
<PackageReference Include="Unity" Version="5.8. |
|
22 | <PackageReference Include="Unity" Version="5.8.6" /> | |
|
|
23 | <PackageReference Include="System.Reactive" Version="4.0.0" /> | |||
|
|
24 | ||||
| 23 | </ItemGroup> |
|
25 | </ItemGroup> | |
| 24 |
|
26 | |||
| 25 | </Project> |
|
27 | </Project> | |
| @@ -12,6 +12,7 using Unity.Injection; | |||||
| 12 | using Unity.Registration; |
|
12 | using Unity.Registration; | |
| 13 |
|
13 | |||
| 14 | namespace Implab.Playground { |
|
14 | namespace Implab.Playground { | |
|
|
15 | using System.Reactive.Linq; | |||
| 15 | using static Trace<Bar>; |
|
16 | using static Trace<Bar>; | |
| 16 |
|
17 | |||
| 17 | class Foo { |
|
18 | class Foo { | |
| @@ -27,14 +28,10 namespace Implab.Playground { | |||||
| 27 | Trace<Foo>.Log("First!"); |
|
28 | Trace<Foo>.Log("First!"); | |
| 28 | Log("+1!"); |
|
29 | Log("+1!"); | |
| 29 |
|
30 | |||
| 30 |
using(TraceRegistry.Global.Subscribe( |
|
31 | using(TraceRegistry.Global.OfType<TraceSourceChannel>().Subscribe(ch => { | |
| 31 | var ch = x as TraceSourceChannel; |
|
|||
| 32 | if (ch == null) |
|
|||
| 33 | return; |
|
|||
| 34 |
|
||||
| 35 | Console.WriteLine($"{ch.Id}: {ch.Source.Name}"); |
|
32 | Console.WriteLine($"{ch.Id}: {ch.Source.Name}"); | |
| 36 |
|
33 | |||
| 37 |
} |
|
34 | })) { | |
| 38 | Trace<Foo>.Log("Hi!"); |
|
35 | Trace<Foo>.Log("Hi!"); | |
| 39 | Log("Respect!"); |
|
36 | Log("Respect!"); | |
| 40 | } |
|
37 | } | |
| @@ -17,7 +17,7 | |||||
| 17 | </PropertyGroup> |
|
17 | </PropertyGroup> | |
| 18 |
|
18 | |||
| 19 | <ItemGroup> |
|
19 | <ItemGroup> | |
| 20 |
<PackageReference Include="Unity" Version="5.8. |
|
20 | <PackageReference Include="Unity" Version="5.8.6" /> | |
| 21 | </ItemGroup> |
|
21 | </ItemGroup> | |
| 22 |
|
22 | |||
| 23 | <ItemGroup> |
|
23 | <ItemGroup> | |
| @@ -23,14 +23,7 namespace Implab.Test { | |||||
| 23 | TraceRegistry.Global.Subscribe(x => { |
|
23 | TraceRegistry.Global.Subscribe(x => { | |
| 24 | visited++; |
|
24 | visited++; | |
| 25 | found = x as TraceSourceChannel; |
|
25 | found = x as TraceSourceChannel; | |
| 26 |
} |
|
26 | }); | |
| 27 |
|
||||
| 28 | Assert.Equal(0, visited); |
|
|||
| 29 |
|
||||
| 30 | TraceRegistry.Global.Subscribe(x => { |
|
|||
| 31 | visited++; |
|
|||
| 32 | found = x as TraceSourceChannel; |
|
|||
| 33 | }, true); |
|
|||
| 34 |
|
27 | |||
| 35 | Assert.Equal(1,visited); |
|
28 | Assert.Equal(1,visited); | |
| 36 | Assert.Equal(channel, found); |
|
29 | Assert.Equal(channel, found); | |
| @@ -14,6 +14,7 | |||||
| 14 |
|
14 | |||
| 15 | <ItemGroup> |
|
15 | <ItemGroup> | |
| 16 | <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.6.0-preview-20180109-01" /> |
|
16 | <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.6.0-preview-20180109-01" /> | |
|
|
17 | <PackageReference Include="System.Reactive" Version="4.0.0" /> | |||
| 17 | <PackageReference Include="xunit" Version="2.3.1" /> |
|
18 | <PackageReference Include="xunit" Version="2.3.1" /> | |
| 18 | <PackageReference Include="xunit.runner.visualstudio" Version="2.3.1" /> |
|
19 | <PackageReference Include="xunit.runner.visualstudio" Version="2.3.1" /> | |
| 19 | <ProjectReference Include="../Implab/Implab.csproj"/> |
|
20 | <ProjectReference Include="../Implab/Implab.csproj"/> | |
| @@ -4,11 +4,10 using System.Diagnostics; | |||||
| 4 | using Implab.Parallels; |
|
4 | using Implab.Parallels; | |
| 5 |
|
5 | |||
| 6 | namespace Implab.Diagnostics { |
|
6 | namespace Implab.Diagnostics { | |
| 7 | public class TraceRegistry { |
|
7 | public class TraceRegistry: IObservable<TraceChannel> { | |
| 8 |
|
8 | |||
| 9 | class Subscription : IDisposable { |
|
9 | class Subscription : IDisposable { | |
| 10 | readonly WeakReference<TraceRegistry> m_registry; |
|
10 | readonly WeakReference<TraceRegistry> m_registry; | |
| 11 | readonly Action<object> m_unsubscribe; |
|
|||
| 12 |
|
11 | |||
| 13 | public Subscription(TraceRegistry registry) { |
|
12 | public Subscription(TraceRegistry registry) { | |
| 14 | m_registry = new WeakReference<TraceRegistry>(registry); |
|
13 | m_registry = new WeakReference<TraceRegistry>(registry); | |
| @@ -21,28 +20,32 namespace Implab.Diagnostics { | |||||
| 21 | } |
|
20 | } | |
| 22 | } |
|
21 | } | |
| 23 |
|
22 | |||
|
|
23 | /// <summary> | |||
|
|
24 | /// The global collection of available diagnostic channels | |||
|
|
25 | /// </summary> | |||
|
|
26 | /// <returns></returns> | |||
| 24 | public static TraceRegistry Global { get; } = new TraceRegistry(); |
|
27 | public static TraceRegistry Global { get; } = new TraceRegistry(); | |
| 25 |
|
28 | |||
| 26 | readonly object m_lock = new object(); |
|
29 | readonly object m_lock = new object(); | |
| 27 |
|
30 | |||
| 28 |
readonly Dictionary<object, |
|
31 | readonly Dictionary<object, IObserver<TraceChannel>> m_subscriptions = new Dictionary<object, IObserver<TraceChannel>>(); | |
| 29 | readonly SimpleAsyncQueue<TraceChannel> m_channels = new SimpleAsyncQueue<TraceChannel>(); |
|
32 | readonly SimpleAsyncQueue<TraceChannel> m_channels = new SimpleAsyncQueue<TraceChannel>(); | |
| 30 |
|
33 | |||
| 31 |
|
|
34 | public void Register(TraceChannel channel) { | |
| 32 | // notifications can run in parallel |
|
35 | // notifications can run in parallel | |
| 33 |
|
|
36 | IObserver<TraceChannel>[] handlers = null; | |
| 34 |
|
37 | |||
| 35 | lock(m_lock) { |
|
38 | lock(m_lock) { | |
| 36 | m_channels.Enqueue(channel); |
|
39 | m_channels.Enqueue(channel); | |
| 37 | if (m_subscriptions.Count > 0) { |
|
40 | if (m_subscriptions.Count > 0) { | |
| 38 |
handlers = new |
|
41 | handlers = new IObserver<TraceChannel>[m_subscriptions.Count]; | |
| 39 | m_subscriptions.Values.CopyTo(handlers, 0); |
|
42 | m_subscriptions.Values.CopyTo(handlers, 0); | |
| 40 | } |
|
43 | } | |
| 41 | } |
|
44 | } | |
| 42 |
|
45 | |||
| 43 | if (handlers != null) |
|
46 | if (handlers != null) | |
| 44 | foreach(var h in handlers) |
|
47 | foreach(var h in handlers) | |
| 45 | h(channel); |
|
48 | h.OnNext(channel); | |
| 46 | } |
|
49 | } | |
| 47 |
|
50 | |||
| 48 | /// <summary> |
|
51 | /// <summary> | |
| @@ -51,7 +54,7 namespace Implab.Diagnostics { | |||||
| 51 | /// </summary> |
|
54 | /// </summary> | |
| 52 | /// <param name="handler"></param> |
|
55 | /// <param name="handler"></param> | |
| 53 | /// <returns></returns> |
|
56 | /// <returns></returns> | |
| 54 |
public IDisposable Subscribe( |
|
57 | public IDisposable Subscribe(IObserver<TraceChannel> handler) { | |
| 55 | Safe.ArgumentNotNull(handler, nameof(handler)); |
|
58 | Safe.ArgumentNotNull(handler, nameof(handler)); | |
| 56 |
|
59 | |||
| 57 | var cookie = new Subscription(this); |
|
60 | var cookie = new Subscription(this); | |
| @@ -66,9 +69,9 namespace Implab.Diagnostics { | |||||
| 66 | } |
|
69 | } | |
| 67 |
|
70 | |||
| 68 | // announce previously declared channels if required |
|
71 | // announce previously declared channels if required | |
| 69 |
if ( |
|
72 | if (snap != null) { | |
| 70 | foreach(var c in snap) |
|
73 | foreach(var c in snap) | |
| 71 | handler(c); |
|
74 | handler.OnNext(c); | |
| 72 | } |
|
75 | } | |
| 73 |
|
76 | |||
| 74 | // return the subscription |
|
77 | // return the subscription | |
| @@ -8,7 +8,7 | |||||
| 8 | and SharedLock, Trace helpers on top of System.Diagnostics, ObjectPool etc. |
|
8 | and SharedLock, Trace helpers on top of System.Diagnostics, ObjectPool etc. | |
| 9 | </Description> |
|
9 | </Description> | |
| 10 | <Copyright>2012-2018 Sergey Smirnov</Copyright> |
|
10 | <Copyright>2012-2018 Sergey Smirnov</Copyright> | |
| 11 |
<Version>3.0.1 |
|
11 | <Version>3.0.14</Version> | |
| 12 | <PackageLicenseUrl>https://hg.implab.org/pub/ImplabNet/file/tip/Implab/license.txt</PackageLicenseUrl> |
|
12 | <PackageLicenseUrl>https://hg.implab.org/pub/ImplabNet/file/tip/Implab/license.txt</PackageLicenseUrl> | |
| 13 | <PackageProjectUrl>https://implab.org</PackageProjectUrl> |
|
13 | <PackageProjectUrl>https://implab.org</PackageProjectUrl> | |
| 14 | <RepositoryUrl>https://hg.implab.org/pub/ImplabNet/</RepositoryUrl> |
|
14 | <RepositoryUrl>https://hg.implab.org/pub/ImplabNet/</RepositoryUrl> | |
General Comments 3
ok, latest stable version should be in default
You need to be logged in to leave comments.
Login now
