1
+ // Copyright 2004-2009 Castle Project - http://www.castleproject.org/
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+
15
+ namespace Castle . Core . Internal . Locking
16
+ {
17
+ using System . Threading ;
18
+
19
+ internal class SlimReadWriteLock : Lock
20
+ {
21
+ private readonly ReaderWriterLockSlim locker = new ReaderWriterLockSlim ( LockRecursionPolicy . NoRecursion ) ;
22
+
23
+ public override IUpgradeableLockHolder ForReadingUpgradeable ( )
24
+ {
25
+ return ForReadingUpgradeable ( true ) ;
26
+ }
27
+
28
+ public override ILockHolder ForReading ( )
29
+ {
30
+ return ForReading ( true ) ;
31
+ }
32
+
33
+ public override ILockHolder ForWriting ( )
34
+ {
35
+ return ForWriting ( true ) ;
36
+ }
37
+
38
+ public override IUpgradeableLockHolder ForReadingUpgradeable ( bool waitForLock )
39
+ {
40
+ return new SlimUpgradeableReadLockHolder ( locker , waitForLock , locker . IsUpgradeableReadLockHeld || locker . IsWriteLockHeld ) ;
41
+ }
42
+
43
+ public override ILockHolder ForReading ( bool waitForLock )
44
+ {
45
+ if ( locker . IsReadLockHeld || locker . IsUpgradeableReadLockHeld || locker . IsWriteLockHeld )
46
+ {
47
+ return NoOpLock . Lock ;
48
+ }
49
+
50
+ return new SlimReadLockHolder ( locker , waitForLock ) ;
51
+ }
52
+
53
+ public override ILockHolder ForWriting ( bool waitForLock )
54
+ {
55
+ if ( locker . IsWriteLockHeld )
56
+ {
57
+ return NoOpLock . Lock ;
58
+ }
59
+
60
+ return new SlimWriteLockHolder ( locker , waitForLock ) ;
61
+ }
62
+
63
+ public bool IsReadLockHeld
64
+ {
65
+ get { return locker . IsReadLockHeld ; }
66
+ }
67
+
68
+ public bool IsUpgradeableReadLockHeld
69
+ {
70
+ get { return locker . IsUpgradeableReadLockHeld ; }
71
+ }
72
+
73
+ public bool IsWriteLockHeld
74
+ {
75
+ get { return locker . IsWriteLockHeld ; }
76
+ }
77
+ }
78
+ }
0 commit comments