Skip to content

Commit 43e4c6a

Browse files
committed
Remove Lock from ListBasedLoadBalancePolicy in benefit of ReaderWriterLockSlim
castleproject#565
1 parent 63f8ce0 commit 43e4c6a

File tree

1 file changed

+34
-10
lines changed

1 file changed

+34
-10
lines changed

src/Castle.Facilities.WcfIntegration/Service/Discovery/LoadBalance/ListBasedLoadBalancePolicy.cs

+34-10
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ namespace Castle.Facilities.WcfIntegration
1717
using System;
1818
using System.Collections.Generic;
1919
using System.ServiceModel.Discovery;
20+
using System.Threading;
21+
2022
using Castle.Core.Internal;
2123

2224
public delegate bool PolicyMembership(EndpointDiscoveryMetadata endpoint);
@@ -25,7 +27,7 @@ public abstract class ListBasedLoadBalancePolicy : ILoadBalancePolicy
2527
{
2628
private readonly PolicyMembership membership;
2729
private readonly List<EndpointDiscoveryMetadata> targets;
28-
private readonly Lock @lock = Lock.Create();
30+
private readonly ReaderWriterLockSlim @lock = new ReaderWriterLockSlim();
2931

3032
protected ListBasedLoadBalancePolicy(PolicyMembership membership)
3133
{
@@ -50,25 +52,29 @@ public bool RegisterTarget(EndpointDiscoveryMetadata target)
5052
{
5153
if (membership(target) == false)
5254
return false;
53-
54-
using (@lock.ForWriting())
55+
@lock.EnterWriteLock();
56+
try
5557
{
5658
var index = FindTargetIndex(target);
5759
if (index >= 0)
5860
targets[index] = target;
5961
else
6062
targets.Add(target);
6163
}
62-
63-
return true;
64+
finally
65+
{
66+
@lock.ExitWriteLock();
67+
}
68+
return true;
6469
}
6570

6671
public bool RemoveTarget(EndpointDiscoveryMetadata target)
6772
{
6873
if (membership(target) == false)
6974
return false;
7075

71-
using (@lock.ForWriting())
76+
@lock.EnterWriteLock();
77+
try
7278
{
7379
var index = FindTargetIndex(target);
7480
if (index >= 0)
@@ -77,16 +83,24 @@ public bool RemoveTarget(EndpointDiscoveryMetadata target)
7783
return true;
7884
}
7985
}
80-
86+
finally
87+
{
88+
@lock.ExitWriteLock();
89+
}
8190
return false;
8291
}
8392

8493
public void CollectTargets(ICollection<EndpointDiscoveryMetadata> collected)
8594
{
86-
using (@lock.ForReading())
95+
@lock.EnterReadLock();
96+
try
8797
{
8898
targets.ForEach(collected.Add);
8999
}
100+
finally
101+
{
102+
@lock.ExitReadLock();
103+
}
90104
}
91105

92106
private int FindTargetIndex(EndpointDiscoveryMetadata target)
@@ -128,21 +142,31 @@ public void ReadList(Func<IList<EndpointDiscoveryMetadata>, EndpointDiscoveryMet
128142
{
129143
if (readList != null)
130144
{
131-
using (policy.@lock.ForReading())
145+
policy.@lock.EnterReadLock();
146+
try
132147
{
133148
selectedEndpoint = readList(policy.targets.AsReadOnly());
134149
}
150+
finally
151+
{
152+
policy.@lock.ExitReadLock();
153+
}
135154
}
136155
}
137156

138157
public void ModifyList(Func<IList<EndpointDiscoveryMetadata>, EndpointDiscoveryMetadata> modifyList)
139158
{
140159
if (modifyList != null)
141160
{
142-
using (policy.@lock.ForWriting())
161+
policy.@lock.EnterWriteLock();
162+
try
143163
{
144164
selectedEndpoint = modifyList(policy.targets);
145165
}
166+
finally
167+
{
168+
policy.@lock.EnterWriteLock();
169+
}
146170
}
147171
}
148172
}

0 commit comments

Comments
 (0)