@@ -17,6 +17,8 @@ namespace Castle.Facilities.WcfIntegration
17
17
using System ;
18
18
using System . Collections . Generic ;
19
19
using System . ServiceModel . Discovery ;
20
+ using System . Threading ;
21
+
20
22
using Castle . Core . Internal ;
21
23
22
24
public delegate bool PolicyMembership ( EndpointDiscoveryMetadata endpoint ) ;
@@ -25,7 +27,7 @@ public abstract class ListBasedLoadBalancePolicy : ILoadBalancePolicy
25
27
{
26
28
private readonly PolicyMembership membership ;
27
29
private readonly List < EndpointDiscoveryMetadata > targets ;
28
- private readonly Lock @lock = Lock . Create ( ) ;
30
+ private readonly ReaderWriterLockSlim @lock = new ReaderWriterLockSlim ( ) ;
29
31
30
32
protected ListBasedLoadBalancePolicy ( PolicyMembership membership )
31
33
{
@@ -50,25 +52,29 @@ public bool RegisterTarget(EndpointDiscoveryMetadata target)
50
52
{
51
53
if ( membership ( target ) == false )
52
54
return false ;
53
-
54
- using ( @lock . ForWriting ( ) )
55
+ @lock . EnterWriteLock ( ) ;
56
+ try
55
57
{
56
58
var index = FindTargetIndex ( target ) ;
57
59
if ( index >= 0 )
58
60
targets [ index ] = target ;
59
61
else
60
62
targets . Add ( target ) ;
61
63
}
62
-
63
- return true ;
64
+ finally
65
+ {
66
+ @lock . ExitWriteLock ( ) ;
67
+ }
68
+ return true ;
64
69
}
65
70
66
71
public bool RemoveTarget ( EndpointDiscoveryMetadata target )
67
72
{
68
73
if ( membership ( target ) == false )
69
74
return false ;
70
75
71
- using ( @lock . ForWriting ( ) )
76
+ @lock . EnterWriteLock ( ) ;
77
+ try
72
78
{
73
79
var index = FindTargetIndex ( target ) ;
74
80
if ( index >= 0 )
@@ -77,16 +83,24 @@ public bool RemoveTarget(EndpointDiscoveryMetadata target)
77
83
return true ;
78
84
}
79
85
}
80
-
86
+ finally
87
+ {
88
+ @lock . ExitWriteLock ( ) ;
89
+ }
81
90
return false ;
82
91
}
83
92
84
93
public void CollectTargets ( ICollection < EndpointDiscoveryMetadata > collected )
85
94
{
86
- using ( @lock . ForReading ( ) )
95
+ @lock . EnterReadLock ( ) ;
96
+ try
87
97
{
88
98
targets . ForEach ( collected . Add ) ;
89
99
}
100
+ finally
101
+ {
102
+ @lock . ExitReadLock ( ) ;
103
+ }
90
104
}
91
105
92
106
private int FindTargetIndex ( EndpointDiscoveryMetadata target )
@@ -128,21 +142,31 @@ public void ReadList(Func<IList<EndpointDiscoveryMetadata>, EndpointDiscoveryMet
128
142
{
129
143
if ( readList != null )
130
144
{
131
- using ( policy . @lock . ForReading ( ) )
145
+ policy . @lock . EnterReadLock ( ) ;
146
+ try
132
147
{
133
148
selectedEndpoint = readList ( policy . targets . AsReadOnly ( ) ) ;
134
149
}
150
+ finally
151
+ {
152
+ policy . @lock . ExitReadLock ( ) ;
153
+ }
135
154
}
136
155
}
137
156
138
157
public void ModifyList ( Func < IList < EndpointDiscoveryMetadata > , EndpointDiscoveryMetadata > modifyList )
139
158
{
140
159
if ( modifyList != null )
141
160
{
142
- using ( policy . @lock . ForWriting ( ) )
161
+ policy . @lock . EnterWriteLock ( ) ;
162
+ try
143
163
{
144
164
selectedEndpoint = modifyList ( policy . targets ) ;
145
165
}
166
+ finally
167
+ {
168
+ policy . @lock . EnterWriteLock ( ) ;
169
+ }
146
170
}
147
171
}
148
172
}
0 commit comments