##// END OF EJS Templates
fixed JSONXmlReader disposing under ugly mono...
cin -
r85:abe260860bd6 v2
parent child
Show More
@@ -17,7 +17,7 namespace Implab.Diagnostics.Interactive
17 17 readonly Promise<object> m_guiStarted = new Promise<object>();
18 18
19 19 readonly IPromise m_guiFinished;
20 readonly IPromise m_workerFinished = new Promise<object>();
20 // readonly IPromise m_workerFinished = new Promise<object>();
21 21
22 22 readonly MTQueue<TraceViewItem> m_queue = new MTQueue<TraceViewItem>();
23 23 readonly AutoResetEvent m_queueEvent = new AutoResetEvent(false);
@@ -31,7 +31,7 namespace Implab.Diagnostics.Interactive
31 31
32 32 public InteractiveListener(bool global) : base(global) {
33 33 m_guiFinished = AsyncPool.InvokeNewThread(GuiThread);
34 m_workerFinished = AsyncPool.InvokeNewThread(QueueThread);
34 /*m_workerFinished = */AsyncPool.InvokeNewThread(QueueThread);
35 35
36 36 m_guiStarted.Join();
37 37 }
@@ -46,6 +46,25
46 46 <ConsolePause>false</ConsolePause>
47 47 <DefineConstants>NET_4_5</DefineConstants>
48 48 </PropertyGroup>
49 <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'DebugMono|AnyCPU' ">
50 <DebugSymbols>true</DebugSymbols>
51 <DebugType>full</DebugType>
52 <Optimize>false</Optimize>
53 <OutputPath>bin\Debug</OutputPath>
54 <DefineConstants>TRACE;DEBUG;NET_4_5;MONO</DefineConstants>
55 <ErrorReport>prompt</ErrorReport>
56 <WarningLevel>4</WarningLevel>
57 <RunCodeAnalysis>true</RunCodeAnalysis>
58 <ConsolePause>false</ConsolePause>
59 </PropertyGroup>
60 <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'ReleaseMono|AnyCPU' ">
61 <Optimize>true</Optimize>
62 <OutputPath>bin\Release</OutputPath>
63 <DefineConstants>NET_4_5;MONO;</DefineConstants>
64 <ErrorReport>prompt</ErrorReport>
65 <WarningLevel>4</WarningLevel>
66 <ConsolePause>false</ConsolePause>
67 </PropertyGroup>
49 68 <ItemGroup>
50 69 <Reference Include="System" />
51 70 <Reference Include="System.Xml" />
@@ -301,6 +301,9 namespace Implab.JSON {
301 301 }
302 302
303 303 protected override void Dispose(bool disposing) {
304 #if MONO
305 disposing = true;
306 #endif
304 307 if (disposing) {
305 308 m_parser.Dispose();
306 309 }
@@ -1,31 +1,26
1 1 using System;
2 2 using Implab.Parallels;
3 3 using System.Threading;
4 using System.Diagnostics;
5 using System.Diagnostics.CodeAnalysis;
4 6
5 7 namespace Implab {
6 public class ObjectPool<T> : IDisposable {
7 readonly Func<T> m_factory;
8 readonly Action<T> m_cleanup;
8 public abstract class ObjectPool<T> : IDisposable {
9 9 readonly int m_size;
10 10 readonly MTQueue<T> m_queue = new MTQueue<T>();
11 11
12 [SuppressMessage("Microsoft.Design", "CA1000:DoNotDeclareStaticMembersOnGenericTypes")]
13 static readonly bool _isValueType = typeof(T).IsValueType;
14
12 15 bool m_disposed;
13 16
14 17 int m_count;
15 18
16 public ObjectPool(Func<T> factory, Action<T> cleanup, int size) {
17 Safe.ArgumentNotNull(factory, "factory");
18 Safe.ArgumentInRange(size, 1, size, "size");
19
20 m_factory = factory;
21 m_cleanup = cleanup;
19 protected ObjectPool(int size) {
22 20 m_size = size;
23 21 }
24 22
25 public ObjectPool(Func<T> factory, Action<T> cleanup) : this(factory,cleanup,Environment.ProcessorCount+1) {
26 }
27
28 public ObjectPool(Func<T> factory) : this(factory,null,Environment.ProcessorCount+1) {
23 protected ObjectPool() : this(Environment.ProcessorCount+1) {
29 24 }
30 25
31 26 public ObjectPoolWrapper<T> AllocateAuto() {
@@ -35,24 +30,32 namespace Implab {
35 30
36 31 public T Allocate() {
37 32 if (m_disposed)
38 throw new ObjectDisposedException(this.ToString());
33 throw new ObjectDisposedException(ToString());
39 34
40 35 T instance;
41 36 if (m_queue.TryDequeue(out instance)) {
42 37 Interlocked.Decrement(ref m_count);
43 38 } else {
44 instance = m_factory();
39 instance = CreateInstance();
40 Debug.Assert(!Object.Equals(instance, default(T)) || _isValueType);
45 41 }
46 42 return instance;
47 43 }
48 44
45 protected abstract T CreateInstance();
46
47 protected virtual void CleanupInstance(T instance) {
48 }
49
49 50 public void Release(T instance) {
51 if ( Object.Equals(instance,default(T)) && !_isValueType)
52 return;
53
50 54 Thread.MemoryBarrier();
51 55 if (m_count < m_size && !m_disposed) {
52 56 Interlocked.Increment(ref m_count);
53 57
54 if (m_cleanup != null)
55 m_cleanup(instance);
58 CleanupInstance(instance);
56 59
57 60 m_queue.Enqueue(instance);
58 61
General Comments 0
You need to be logged in to leave comments. Login now