wasSharp – Diff between revs 40 and 44

Subversion Repositories:
Rev:
Show entire fileIgnore whitespace
Rev 40 Rev 44
Line 19... Line 19...
19 } 19 }
Line 20... Line 20...
20   20  
21 public class ConcurrentList<T> : IList<T> 21 public class ConcurrentList<T> : IList<T>
22 { 22 {
23 private readonly ReaderWriterLockSlim _lock = new ReaderWriterLockSlim(LockRecursionPolicy.SupportsRecursion); 23 private readonly ReaderWriterLockSlim _lock = new ReaderWriterLockSlim(LockRecursionPolicy.SupportsRecursion);
Line 24... Line 24...
24 private readonly List<T> _list = null; 24 private readonly List<T> _list;
25   25  
-   26 public ConcurrentList(IEnumerable<T> v)
26 public ConcurrentList(IEnumerable<T> v) 27 {
27 { 28 _lock.EnterWriteLock();
28 try -  
29 { 29 try
30 _lock.EnterWriteLock(); 30 {
31 _list = new List<T>(); 31 _list = new List<T>();
32 foreach (var i in v) 32 foreach (var i in v)
33 { 33 {
Line 40... Line 40...
40 } 40 }
41 } 41 }
Line 42... Line 42...
42   42  
43 public ConcurrentList() 43 public ConcurrentList()
-   44 {
44 { 45 _lock.EnterWriteLock();
45 try 46 try
46 { -  
47 _lock.EnterWriteLock(); 47 {
48 _list = new List<T>(); 48 _list = new List<T>();
49 } 49 }
50 finally 50 finally
51 { 51 {
Line 56... Line 56...
56 public int Count 56 public int Count
57 { 57 {
58 get 58 get
59 { 59 {
60 _lock.EnterReadLock(); 60 _lock.EnterReadLock();
-   61 try
-   62 {
61 var c = _list.Count; 63 return _list.Count;
-   64 }
-   65 finally
-   66 {
62 _lock.ExitReadLock(); 67 if (_lock.IsReadLockHeld) _lock.ExitReadLock();
63 return c; 68 }
-   69
64 } 70 }
65 } 71 }
Line 66... Line 72...
66   72  
67 public bool IsReadOnly 73 public bool IsReadOnly
68 { 74 {
69 get 75 get
-   76 {
70 { 77 _lock.EnterReadLock();
71 try 78 try
72 { -  
73 _lock.EnterReadLock(); 79 {
74 return ((IList<T>)_list).IsReadOnly; 80 return ((IList<T>)_list).IsReadOnly;
75 } 81 }
76 finally 82 finally
77 { 83 {
Line 82... Line 88...
82   88  
83 public T this[int index] 89 public T this[int index]
84 { 90 {
85 get 91 get
-   92 {
86 { 93 _lock.EnterReadLock();
87 try 94 try
88 { -  
89 _lock.EnterReadLock(); 95 {
90 return _list[index]; 96 return _list[index];
91 } 97 }
92 finally 98 finally
93 { 99 {
94 if (_lock.IsReadLockHeld) _lock.ExitReadLock(); 100 if (_lock.IsReadLockHeld) _lock.ExitReadLock();
95 } 101 }
Line 96... Line 102...
96 } 102 }
97   103  
-   104 set
98 set 105 {
99 { 106 _lock.EnterWriteLock();
100 try -  
101 { 107 try
102 _lock.EnterWriteLock(); 108 {
103 _list[index] = value; 109 _list[index] = value;
104 } 110 }
105 finally 111 finally
Line 109... Line 115...
109 } 115 }
110 } 116 }
Line 111... Line 117...
111   117  
112 public int IndexOf(T item) 118 public int IndexOf(T item)
-   119 {
113 { 120 _lock.EnterReadLock();
114 try 121 try
115 { -  
116 _lock.EnterReadLock(); 122 {
117 return _list.IndexOf(item); 123 return _list.IndexOf(item);
118 } 124 }
119 finally 125 finally
120 { 126 {
121 if (_lock.IsReadLockHeld) _lock.ExitReadLock(); 127 if (_lock.IsReadLockHeld) _lock.ExitReadLock();
122 } 128 }
Line 123... Line 129...
123 } 129 }
124   130  
-   131 public void Insert(int index, T item)
125 public void Insert(int index, T item) 132 {
126 { 133 _lock.EnterWriteLock();
127 try -  
128 { 134 try
129 _lock.EnterWriteLock(); 135 {
130 _list.Insert(index, item); 136 _list.Insert(index, item);
131 } 137 }
132 finally 138 finally
133 { 139 {
134 if (_lock.IsWriteLockHeld) _lock.ExitWriteLock(); 140 if (_lock.IsWriteLockHeld) _lock.ExitWriteLock();
Line 135... Line 141...
135 } 141 }
136 } 142 }
-   143  
137   144 public void RemoveAt(int index)
138 public void RemoveAt(int index) 145 {
139 { -  
140 try 146 _lock.EnterWriteLock();
141 { 147 try
142 _lock.EnterWriteLock(); 148 {
143 _list.RemoveAt(index); 149 _list.RemoveAt(index);
144 } 150 }
145 finally 151 finally
146 { 152 {
Line 147... Line 153...
147 if (_lock.IsWriteLockHeld) _lock.ExitWriteLock(); 153 if (_lock.IsWriteLockHeld) _lock.ExitWriteLock();
148 } 154 }
-   155 }
149 } 156  
150   157 public void Add(T item)
151 public void Add(T item) -  
152 { 158 {
153 try 159 _lock.EnterWriteLock();
154 { 160 try
155 _lock.EnterWriteLock(); 161 {
156 _list.Add(item); 162 _list.Add(item);
157 } 163 }
158 finally 164 finally
Line 159... Line 165...
159 { 165 {
160 if (_lock.IsWriteLockHeld) _lock.ExitWriteLock(); 166 if (_lock.IsWriteLockHeld) _lock.ExitWriteLock();
-   167 }
161 } 168 }
162 } 169  
163   -  
164 public void Clear() 170 public void Clear()
165 { 171 {
166 try 172 _lock.EnterWriteLock();
167 { 173 try
168 _lock.EnterWriteLock(); 174 {
169 _list.Clear(); 175 _list.Clear();
170 } 176 }
Line 171... Line 177...
171 finally 177 finally
172 { 178 {
-   179 if (_lock.IsWriteLockHeld) _lock.ExitWriteLock();
173 if (_lock.IsWriteLockHeld) _lock.ExitWriteLock(); 180 }
174 } 181 }
175 } -  
176   182  
177 public bool Contains(T item) 183 public bool Contains(T item)
178 { 184 {
179 try 185 _lock.EnterReadLock();
180 { 186 try
181 _lock.EnterReadLock(); 187 {
182 return _list.Contains(item); 188 return _list.Contains(item);
Line 183... Line 189...
183 } 189 }
184 finally 190 finally
-   191 {
185 { 192 if (_lock.IsReadLockHeld) _lock.ExitReadLock();
186 if (_lock.IsReadLockHeld) _lock.ExitReadLock(); 193 }
187 } -  
188 } 194 }
189   195  
190 public void CopyTo(T[] array, int arrayIndex) 196 public void CopyTo(T[] array, int arrayIndex)
191 { 197 {
192 try 198 _lock.EnterReadLock();
193 { 199 try
194 _lock.EnterReadLock(); 200 {
Line 195... Line 201...
195 _list.CopyTo(array, arrayIndex); 201 _list.CopyTo(array, arrayIndex);
196 } 202 }
-   203 finally
197 finally 204 {
198 { 205 if (_lock.IsReadLockHeld) _lock.ExitReadLock();
199 if (_lock.IsReadLockHeld) _lock.ExitReadLock(); -  
200 } 206 }
201 } 207 }
202   208  
203 public bool Remove(T item) 209 public bool Remove(T item)
204 { 210 {
205 try 211 _lock.EnterWriteLock();
206 { 212 try
Line 207... Line 213...
207 _lock.EnterWriteLock(); 213 {
208 return _list.Remove(item); 214 return _list.Remove(item);
-   215 }
209 } 216 finally
210 finally 217 {
-   218 if (_lock.IsWriteLockHeld) _lock.ExitWriteLock();
-   219 }
211 { 220 }
212 if (_lock.IsWriteLockHeld) _lock.ExitWriteLock(); 221  
-   222 public IEnumerator<T> GetEnumerator()
213 } 223 {
214 } 224 _lock.EnterReadLock();
215   225 try
216 public IEnumerator<T> GetEnumerator() 226 {
217 { 227 using (var enumerator = _list.GetEnumerator())
218 try 228 {
Line 219... Line 229...
219 { 229 while (enumerator.MoveNext())
220 _lock.EnterReadLock(); 230 yield return enumerator.Current;
-   231 }
221 return ((IList<T>)_list).GetEnumerator(); 232 }
222 } 233 finally
-   234 {
-   235 if (_lock.IsReadLockHeld) _lock.ExitReadLock();
223 finally 236 }
224 { 237 }
-   238  
225 if (_lock.IsReadLockHeld) _lock.ExitReadLock(); 239 IEnumerator IEnumerable.GetEnumerator()
226 } 240 {
227 } 241 _lock.EnterReadLock();
228   242 try
229 IEnumerator IEnumerable.GetEnumerator() 243 {