1
+ use crate :: boxed:: Box ;
1
2
use crate :: cell:: RefCell ;
3
+ use crate :: pin:: Pin ;
2
4
use crate :: sync:: Arc ;
3
5
use crate :: sys_common:: remutex:: { ReentrantMutex , ReentrantMutexGuard } ;
4
6
use crate :: thread;
5
7
6
8
#[ test]
7
9
fn smoke ( ) {
8
10
let m = unsafe {
9
- let m = ReentrantMutex :: new ( ( ) ) ;
10
- m. init ( ) ;
11
+ let mut m = Box :: pin ( ReentrantMutex :: new ( ( ) ) ) ;
12
+ m. as_mut ( ) . init ( ) ;
11
13
m
12
14
} ;
15
+ let m = m. as_ref ( ) ;
13
16
{
14
17
let a = m. lock ( ) ;
15
18
{
@@ -27,18 +30,19 @@ fn smoke() {
27
30
#[ test]
28
31
fn is_mutex ( ) {
29
32
let m = unsafe {
30
- let m = Arc :: new ( ReentrantMutex :: new ( RefCell :: new ( 0 ) ) ) ;
31
- m. init ( ) ;
32
- m
33
+ // FIXME: Simplify this if Arc gets a Arc::get_pin_mut.
34
+ let mut m = Arc :: new ( ReentrantMutex :: new ( RefCell :: new ( 0 ) ) ) ;
35
+ Pin :: new_unchecked ( Arc :: get_mut_unchecked ( & mut m) ) . init ( ) ;
36
+ Pin :: new_unchecked ( m)
33
37
} ;
34
38
let m2 = m. clone ( ) ;
35
- let lock = m. lock ( ) ;
39
+ let lock = m. as_ref ( ) . lock ( ) ;
36
40
let child = thread:: spawn ( move || {
37
- let lock = m2. lock ( ) ;
41
+ let lock = m2. as_ref ( ) . lock ( ) ;
38
42
assert_eq ! ( * lock. borrow( ) , 4950 ) ;
39
43
} ) ;
40
44
for i in 0 ..100 {
41
- let lock = m. lock ( ) ;
45
+ let lock = m. as_ref ( ) . lock ( ) ;
42
46
* lock. borrow_mut ( ) += i;
43
47
}
44
48
drop ( lock) ;
@@ -48,20 +52,21 @@ fn is_mutex() {
48
52
#[ test]
49
53
fn trylock_works ( ) {
50
54
let m = unsafe {
51
- let m = Arc :: new ( ReentrantMutex :: new ( ( ) ) ) ;
52
- m. init ( ) ;
53
- m
55
+ // FIXME: Simplify this if Arc gets a Arc::get_pin_mut.
56
+ let mut m = Arc :: new ( ReentrantMutex :: new ( ( ) ) ) ;
57
+ Pin :: new_unchecked ( Arc :: get_mut_unchecked ( & mut m) ) . init ( ) ;
58
+ Pin :: new_unchecked ( m)
54
59
} ;
55
60
let m2 = m. clone ( ) ;
56
- let _lock = m. try_lock ( ) ;
57
- let _lock2 = m. try_lock ( ) ;
61
+ let _lock = m. as_ref ( ) . try_lock ( ) ;
62
+ let _lock2 = m. as_ref ( ) . try_lock ( ) ;
58
63
thread:: spawn ( move || {
59
- let lock = m2. try_lock ( ) ;
64
+ let lock = m2. as_ref ( ) . try_lock ( ) ;
60
65
assert ! ( lock. is_none( ) ) ;
61
66
} )
62
67
. join ( )
63
68
. unwrap ( ) ;
64
- let _lock3 = m. try_lock ( ) ;
69
+ let _lock3 = m. as_ref ( ) . try_lock ( ) ;
65
70
}
66
71
67
72
pub struct Answer < ' a > ( pub ReentrantMutexGuard < ' a , RefCell < u32 > > ) ;
0 commit comments