@@ -18,14 +18,15 @@ namespace Castle.MicroKernel.SubSystems.Naming
18
18
using System . Collections . Generic ;
19
19
using System . Linq ;
20
20
using System . Reflection ;
21
+ using System . Threading ;
21
22
22
23
using Castle . Core . Internal ;
23
24
using Castle . MicroKernel . Util ;
24
25
25
26
[ Serializable ]
26
27
public class DefaultNamingSubSystem : AbstractSubSystem , INamingSubSystem
27
28
{
28
- protected readonly Lock @lock = Lock . Create ( ) ;
29
+ private readonly ReaderWriterLockSlim @lock = new ReaderWriterLockSlim ( ) ;
29
30
30
31
/// <summary>
31
32
/// Map(String, IHandler) to map component names to <see cref="IHandler" /> Items in this dictionary are sorted in insertion order.
@@ -65,12 +66,17 @@ protected IDictionary<string, IHandler> HandlerByNameCache
65
66
{
66
67
return cache ;
67
68
}
68
- using ( @lock . ForWriting ( ) )
69
+ @lock . EnterWriteLock ( ) ;
70
+ try
69
71
{
70
72
cache = new Dictionary < string , IHandler > ( name2Handler , name2Handler . Comparer ) ;
71
73
handlerByNameCache = cache ;
72
74
return cache ;
73
75
}
76
+ finally
77
+ {
78
+ @lock . ExitWriteLock ( ) ;
79
+ }
74
80
}
75
81
}
76
82
@@ -83,7 +89,8 @@ protected IDictionary<Type, IHandler> HandlerByServiceCache
83
89
{
84
90
return cache ;
85
91
}
86
- using ( @lock . ForWriting ( ) )
92
+ @lock . EnterWriteLock ( ) ;
93
+ try
87
94
{
88
95
cache = new Dictionary < Type , IHandler > ( service2Handler . Count , service2Handler . Comparer ) ;
89
96
foreach ( var item in service2Handler )
@@ -93,6 +100,10 @@ protected IDictionary<Type, IHandler> HandlerByServiceCache
93
100
handlerByServiceCache = cache ;
94
101
return cache ;
95
102
}
103
+ finally
104
+ {
105
+ @lock . ExitWriteLock ( ) ;
106
+ }
96
107
}
97
108
}
98
109
@@ -223,17 +234,30 @@ public virtual IHandler[] GetHandlers(Type service)
223
234
}
224
235
225
236
IHandler [ ] result ;
226
- using ( var locker = @lock . ForReadingUpgradeable ( ) )
237
+ @lock . EnterUpgradeableReadLock ( ) ;
238
+ try
227
239
{
228
240
if ( handlerListsByTypeCache . TryGetValue ( service , out result ) )
229
241
{
230
242
return result ;
231
243
}
232
244
result = GetHandlersNoLock ( service ) ;
233
-
234
- locker . Upgrade ( ) ;
235
- handlerListsByTypeCache [ service ] = result ;
245
+ @lock . EnterWriteLock ( ) ;
246
+ try
247
+ {
248
+ handlerListsByTypeCache [ service ] = result ;
249
+ }
250
+ finally
251
+ {
252
+ @lock . ExitWriteLock ( ) ;
253
+ }
254
+
236
255
}
256
+ finally
257
+ {
258
+ @lock . ExitUpgradeableReadLock ( ) ;
259
+ }
260
+
237
261
238
262
return result ;
239
263
}
@@ -242,7 +266,8 @@ public virtual IHandler[] GetHandlers(Type service)
242
266
public virtual void Register ( IHandler handler )
243
267
{
244
268
var name = handler . ComponentModel . Name ;
245
- using ( @lock . ForWriting ( ) )
269
+ @lock . EnterReadLock ( ) ;
270
+ try
246
271
{
247
272
try
248
273
{
@@ -255,6 +280,7 @@ public virtual void Register(IHandler handler)
255
280
"Component {0} could not be registered. There is already a component with that name. Did you want to modify the existing component instead? If not, make sure you specify a unique name." ,
256
281
name ) ) ;
257
282
}
283
+
258
284
var serviceSelector = GetServiceSelector ( handler ) ;
259
285
foreach ( var service in handler . ComponentModel . Services )
260
286
{
@@ -265,29 +291,47 @@ public virtual void Register(IHandler handler)
265
291
service2Handler [ service ] = handlerForService ;
266
292
}
267
293
}
294
+
268
295
InvalidateCache ( ) ;
269
296
}
297
+ finally
298
+ {
299
+ @lock . ExitReadLock ( ) ;
300
+ }
270
301
}
271
302
272
303
protected IHandler [ ] GetAssignableHandlersNoFiltering ( Type service )
273
304
{
274
305
IHandler [ ] result ;
275
- using ( var locker = @lock . ForReadingUpgradeable ( ) )
306
+ @lock . EnterUpgradeableReadLock ( ) ;
307
+ try
276
308
{
277
309
if ( assignableHandlerListsByTypeCache . TryGetValue ( service , out result ) )
278
310
{
279
311
return result ;
280
312
}
281
313
282
- locker . Upgrade ( ) ;
283
- if ( assignableHandlerListsByTypeCache . TryGetValue ( service , out result ) )
314
+ @lock . EnterWriteLock ( ) ;
315
+ try
284
316
{
285
- return result ;
317
+ if ( assignableHandlerListsByTypeCache . TryGetValue ( service , out result ) )
318
+ {
319
+ return result ;
320
+ }
321
+
322
+ result = name2Handler . Values . Where ( h => h . SupportsAssignable ( service ) ) . ToArray ( ) ;
323
+ assignableHandlerListsByTypeCache [ service ] = result ;
324
+ }
325
+ finally
326
+ {
327
+ @lock . ExitWriteLock ( ) ;
286
328
}
287
- result = name2Handler . Values . Where ( h => h . SupportsAssignable ( service ) ) . ToArray ( ) ;
288
- assignableHandlerListsByTypeCache [ service ] = result ;
329
+
330
+ }
331
+ finally
332
+ {
333
+ @lock . ExitUpgradeableReadLock ( ) ;
289
334
}
290
-
291
335
return result ;
292
336
}
293
337
0 commit comments