1
- use crate :: cell:: UnsafeCell ;
1
+ #![ deny( unsafe_op_in_unsafe_fn) ]
2
+
3
+ use crate :: cell:: Cell ;
2
4
3
5
pub struct RWLock {
4
- mode : UnsafeCell < isize > ,
6
+ mode : Cell < isize > ,
5
7
}
6
8
7
9
unsafe impl Send for RWLock { }
8
10
unsafe impl Sync for RWLock { } // no threads on this platform
9
11
10
12
impl RWLock {
11
13
pub const fn new ( ) -> RWLock {
12
- RWLock { mode : UnsafeCell :: new ( 0 ) }
14
+ RWLock { mode : Cell :: new ( 0 ) }
13
15
}
14
16
15
17
#[ inline]
16
18
pub unsafe fn read ( & self ) {
17
- let mode = self . mode . get ( ) ;
18
- if * mode >= 0 {
19
- * mode += 1 ;
19
+ let m = self . mode . get ( ) ;
20
+ if m >= 0 {
21
+ self . mode . set ( m + 1 ) ;
20
22
} else {
21
23
rtabort ! ( "rwlock locked for writing" ) ;
22
24
}
23
25
}
24
26
25
27
#[ inline]
26
28
pub unsafe fn try_read ( & self ) -> bool {
27
- let mode = self . mode . get ( ) ;
28
- if * mode >= 0 {
29
- * mode += 1 ;
29
+ let m = self . mode . get ( ) ;
30
+ if m >= 0 {
31
+ self . mode . set ( m + 1 ) ;
30
32
true
31
33
} else {
32
34
false
@@ -35,19 +37,15 @@ impl RWLock {
35
37
36
38
#[ inline]
37
39
pub unsafe fn write ( & self ) {
38
- let mode = self . mode . get ( ) ;
39
- if * mode == 0 {
40
- * mode = -1 ;
41
- } else {
40
+ if self . mode . replace ( -1 ) != 0 {
42
41
rtabort ! ( "rwlock locked for reading" )
43
42
}
44
43
}
45
44
46
45
#[ inline]
47
46
pub unsafe fn try_write ( & self ) -> bool {
48
- let mode = self . mode . get ( ) ;
49
- if * mode == 0 {
50
- * mode = -1 ;
47
+ if self . mode . get ( ) == 0 {
48
+ self . mode . set ( -1 ) ;
51
49
true
52
50
} else {
53
51
false
@@ -56,12 +54,12 @@ impl RWLock {
56
54
57
55
#[ inline]
58
56
pub unsafe fn read_unlock ( & self ) {
59
- * self . mode . get ( ) -= 1 ;
57
+ self . mode . set ( self . mode . get ( ) - 1 ) ;
60
58
}
61
59
62
60
#[ inline]
63
61
pub unsafe fn write_unlock ( & self ) {
64
- * self . mode . get ( ) += 1 ;
62
+ self . mode . set ( 0 ) ;
65
63
}
66
64
67
65
#[ inline]
0 commit comments