Skip to content

Commit e9de148

Browse files
committed
Remove Lock from InMemoryServiceCatalog in benefit of ReaderWriterLockSlim
castleproject#565
1 parent 2f16ab6 commit e9de148

File tree

1 file changed

+95
-45
lines changed

1 file changed

+95
-45
lines changed

src/Castle.Facilities.WcfIntegration/Service/Discovery/ServiceCatalog/InMemoryServiceCatalog.cs

+95-45
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,14 @@ namespace Castle.Facilities.WcfIntegration
2222
using Castle.Core;
2323
using Castle.Core.Internal;
2424
using System;
25+
using System.Threading;
2526

26-
public class InMemoryServiceCatalog : IServiceCatalogImplementation
27+
public class InMemoryServiceCatalog : IServiceCatalogImplementation
2728
{
2829
private readonly List<ILoadBalancePolicy> policies;
2930
private readonly ILoadBalancePolicyFactory policyFactory;
3031
private readonly Dictionary<EndpointAddress, EndpointDiscoveryMetadata> endpoints;
31-
private readonly Lock @lock = Lock.Create();
32+
private readonly ReaderWriterLockSlim @lock = new ReaderWriterLockSlim();
3233

3334
public InMemoryServiceCatalog()
3435
: this(new ContractLoadBalancePolicyFactory<RoundRobinPolicy>())
@@ -44,84 +45,133 @@ public InMemoryServiceCatalog(ILoadBalancePolicyFactory policyFactory)
4445

4546
public virtual EndpointDiscoveryMetadata[] ListEndpoints()
4647
{
47-
using (@lock.ForReading())
48+
@lock.EnterReadLock();
49+
try
4850
{
4951
return endpoints.Values.ToArray<EndpointDiscoveryMetadata>();
5052
}
53+
finally
54+
{
55+
@lock.ExitReadLock();
56+
}
5157
}
5258

5359
public virtual void FindEndpoints(FindRequestContext findRequestContext)
5460
{
55-
using (@lock.ForReading())
56-
{
57-
foreach (var endpoint in MatchTargets(findRequestContext.Criteria))
58-
{
59-
findRequestContext.AddMatchingEndpoint(endpoint);
60-
}
61-
}
61+
@lock.EnterReadLock();
62+
try
63+
{
64+
foreach (var endpoint in MatchTargets(findRequestContext.Criteria))
65+
{
66+
findRequestContext.AddMatchingEndpoint(endpoint);
67+
}
68+
}
69+
finally
70+
{
71+
@lock.ExitReadLock();
72+
}
6273
}
6374

6475
public virtual EndpointDiscoveryMetadata[] FindEndpoints(FindCriteria criteria)
6576
{
66-
using (@lock.ForReading())
67-
{
68-
return MatchTargets(criteria).ToArray();
69-
}
77+
@lock.EnterReadLock();
78+
try
79+
{
80+
return MatchTargets(criteria).ToArray();
81+
}
82+
finally
83+
{
84+
@lock.ExitReadLock();
85+
}
7086
}
7187

7288
public virtual bool RegisterEndpoint(EndpointDiscoveryMetadata endpoint)
7389
{
7490
var registered = false;
7591
if (AcceptEndpoint(endpoint))
7692
{
77-
using (var locker = @lock.ForReadingUpgradeable())
78-
{
79-
policies.ForEach(policy => registered = registered | policy.RegisterTarget(endpoint));
80-
81-
locker.Upgrade();
82-
83-
if (registered == false)
84-
{
85-
var newPolicies = policyFactory.CreatePolicies(endpoint);
86-
Array.ForEach(newPolicies, newPolicy =>
87-
{
88-
registered = registered | newPolicy.RegisterTarget(endpoint);
89-
policies.Add(newPolicy);
90-
});
91-
}
92-
93-
if (registered)
94-
endpoints[endpoint.Address] = endpoint;
95-
}
93+
@lock.EnterUpgradeableReadLock();
94+
try
95+
{
96+
policies.ForEach(policy => registered = registered | policy.RegisterTarget(endpoint));
97+
@lock.EnterWriteLock();
98+
try
99+
{
100+
if (registered == false)
101+
{
102+
var newPolicies = policyFactory.CreatePolicies(endpoint);
103+
Array.ForEach(newPolicies, newPolicy =>
104+
{
105+
registered = registered | newPolicy.RegisterTarget(endpoint);
106+
policies.Add(newPolicy);
107+
});
108+
}
109+
110+
if (registered)
111+
{
112+
endpoints[endpoint.Address] = endpoint;
113+
}
114+
}
115+
finally
116+
{
117+
@lock.ExitWriteLock();
118+
}
119+
}
120+
finally
121+
{
122+
@lock.ExitUpgradeableReadLock();
123+
}
96124
}
97-
return registered;
125+
return registered;
98126
}
99127

100128
public virtual bool RemoveEndpoint(EndpointDiscoveryMetadata endpoint)
101129
{
102130
var removed = false;
103-
using (var locker = @lock.ForReadingUpgradeable())
131+
132+
@lock.EnterUpgradeableReadLock();
133+
try
104134
{
105135
policies.ForEach(policy => removed = removed | policy.RemoveTarget(endpoint));
106-
107136
if (removed)
108137
{
109-
locker.Upgrade();
110-
endpoints.Remove(endpoint.Address);
138+
@lock.EnterWriteLock();
139+
try
140+
{
141+
endpoints.Remove(endpoint.Address);
142+
}
143+
finally
144+
{
145+
@lock.ExitWriteLock();
146+
}
111147
}
148+
}
149+
finally
150+
{
151+
@lock.ExitUpgradeableReadLock();
152+
}
153+
154+
using (var locker = Lock.Create().ForReadingUpgradeable())
155+
{
156+
112157
}
113158
return removed;
114159
}
115160

116161
public virtual EndpointDiscoveryMetadata ResolveEndpoint(ResolveCriteria resolveCriteria)
117162
{
118-
using (@lock.ForReading())
119-
{
120-
EndpointDiscoveryMetadata endpoint;
121-
return endpoints.TryGetValue(resolveCriteria.Address, out endpoint)
122-
? endpoint
123-
: null;
124-
}
163+
@lock.EnterReadLock();
164+
try
165+
{
166+
EndpointDiscoveryMetadata endpoint;
167+
return endpoints.TryGetValue(resolveCriteria.Address, out endpoint)
168+
? endpoint
169+
: null;
170+
}
171+
finally
172+
{
173+
@lock.ExitReadLock();
174+
}
125175
}
126176

127177
protected virtual bool AcceptEndpoint(EndpointDiscoveryMetadata endpointDiscoveryMetadata)

0 commit comments

Comments
 (0)