1
- use crate :: allows:: test_util:: DropCheck ;
2
1
use crate :: Allowed ;
3
2
use core:: marker:: PhantomData ;
4
3
use core:: ptr:: NonNull ;
@@ -32,15 +31,15 @@ use core::ptr::NonNull;
32
31
// interacting with a real Tock kernel.
33
32
//
34
33
// [1] https://plv.mpi-sws.org/rustbelt/stacked-borrows/paper.pdf
35
- struct KernelPtr < ' b , T : ' b > {
34
+ struct KernelPtr < ' b , T : Copy + ' b > {
36
35
ptr : NonNull < T > ,
37
36
38
37
// We need to consume the 'b lifetime. This is very similar to Allowed's
39
38
// implementation.
40
39
_phantom : PhantomData < & ' b mut T > ,
41
40
}
42
41
43
- impl < ' b , T : ' b > KernelPtr < ' b , T > {
42
+ impl < ' b , T : Copy + ' b > KernelPtr < ' b , T > {
44
43
// The constructor for KernelPtr; simulates allow(). Returns both the
45
44
// Allowed instance the Platform would return and a KernelPtr the test can
46
45
// use to simulate a kernel.
@@ -59,126 +58,67 @@ impl<'b, T: 'b> KernelPtr<'b, T> {
59
58
( allowed, kernel_ptr)
60
59
}
61
60
62
- // Replaces the value in the buffer with a new one. Does not drop the
63
- // existing value.
61
+ // Replaces the value in the buffer with a new one.
64
62
pub fn set ( & self , value : T ) {
65
63
unsafe {
66
64
core:: ptr:: write ( self . ptr . as_ptr ( ) , value) ;
67
65
}
68
66
}
69
- }
70
67
71
- impl < ' b , T : Copy + ' b > KernelPtr < ' b , T > {
72
68
// Copies the contained value out of the buffer.
73
69
pub fn get ( & self ) -> T {
74
70
unsafe { core:: ptr:: read ( self . ptr . as_ptr ( ) ) }
75
71
}
76
72
}
77
73
78
- impl < ' b , ' f : ' b > KernelPtr < ' b , DropCheck < ' f > > {
79
- // Retrieves the value of the contained DropCheck.
80
- pub fn value ( & self ) -> usize {
81
- let drop_check = unsafe { core:: ptr:: read ( self . ptr . as_ptr ( ) ) } ;
82
- let value = drop_check. value ;
83
- core:: mem:: forget ( drop_check) ;
84
- value
85
- }
86
- }
87
-
88
74
#[ test]
89
75
fn set ( ) {
90
- let dropped1 = core:: cell:: Cell :: new ( false ) ;
91
- let dropped2 = core:: cell:: Cell :: new ( false ) ;
92
- let dropped3 = core:: cell:: Cell :: new ( false ) ;
93
- let mut buffer = DropCheck {
94
- flag : Some ( & dropped1) ,
95
- value : 1 ,
96
- } ;
76
+ let mut buffer = 1 ;
97
77
let ( allowed, kernel_ptr) = KernelPtr :: allow ( & mut buffer) ;
98
- assert_eq ! ( kernel_ptr. value( ) , 1 ) ;
99
- assert_eq ! ( dropped1. get( ) , false ) ;
78
+ assert_eq ! ( kernel_ptr. get( ) , 1 ) ;
100
79
101
- // Simulate the kernel replacing the value in buffer. We don't drop the
102
- // existing value.
103
- kernel_ptr. set ( DropCheck {
104
- flag : Some ( & dropped2) ,
105
- value : 2 ,
106
- } ) ;
107
- allowed. set ( DropCheck {
108
- flag : Some ( & dropped3) ,
109
- value : 3 ,
110
- } ) ;
111
- assert_eq ! ( kernel_ptr. value( ) , 3 ) ;
112
- assert_eq ! ( dropped1. get( ) , false ) ;
113
- assert_eq ! ( dropped2. get( ) , false ) ;
114
- assert_eq ! ( dropped3. get( ) , false ) ;
80
+ // Simulate the kernel replacing the value in buffer.
81
+ kernel_ptr. set ( 2 ) ;
82
+ allowed. set ( 3 ) ;
83
+ assert_eq ! ( kernel_ptr. get( ) , 3 ) ;
115
84
}
116
85
117
86
#[ test]
118
87
fn replace ( ) {
119
- let dropped1 = core:: cell:: Cell :: new ( false ) ;
120
- let dropped2 = core:: cell:: Cell :: new ( false ) ;
121
- let dropped3 = core:: cell:: Cell :: new ( false ) ;
122
- let mut buffer = DropCheck {
123
- flag : Some ( & dropped1) ,
124
- value : 1 ,
125
- } ;
88
+ let mut buffer = 1 ;
126
89
let ( allowed, kernel_ptr) = KernelPtr :: allow ( & mut buffer) ;
127
- assert_eq ! ( kernel_ptr. value( ) , 1 ) ;
128
- assert_eq ! ( dropped1. get( ) , false ) ;
90
+ assert_eq ! ( kernel_ptr. get( ) , 1 ) ;
129
91
130
- // Simulate the kernel replacing the value in buffer. We don't drop the
131
- // existing value.
132
- kernel_ptr. set ( DropCheck {
133
- flag : Some ( & dropped2) ,
134
- value : 2 ,
135
- } ) ;
136
- let returned = allowed. replace ( DropCheck {
137
- flag : Some ( & dropped3) ,
138
- value : 3 ,
139
- } ) ;
140
- assert_eq ! ( returned. value, 2 ) ;
141
- assert_eq ! ( kernel_ptr. value( ) , 3 ) ;
142
- assert_eq ! ( dropped1. get( ) , false ) ;
143
- assert_eq ! ( dropped2. get( ) , false ) ;
144
- assert_eq ! ( dropped3. get( ) , false ) ;
92
+ // Simulate the kernel replacing the value in buffer.
93
+ kernel_ptr. set ( 2 ) ;
94
+ let returned = allowed. replace ( 3 ) ;
95
+ assert_eq ! ( returned, 2 ) ;
96
+ assert_eq ! ( kernel_ptr. get( ) , 3 ) ;
145
97
}
146
98
147
99
#[ test]
148
100
fn get ( ) {
149
- // We can't use DropCheck because Drop and Copy cannot both be implemented
150
- // on a single type.
151
101
let mut buffer = 1 ;
152
102
let ( allowed, kernel_ptr) = KernelPtr :: allow ( & mut buffer) ;
153
103
assert_eq ! ( kernel_ptr. get( ) , 1 ) ;
104
+
105
+ assert_eq ! ( allowed. get( ) , 1 ) ;
106
+ assert_eq ! ( kernel_ptr. get( ) , 1 ) ;
107
+
154
108
kernel_ptr. set ( 2 ) ;
155
109
assert_eq ! ( allowed. get( ) , 2 ) ;
156
110
assert_eq ! ( kernel_ptr. get( ) , 2 ) ;
157
111
}
158
112
159
113
#[ test]
160
114
fn take ( ) {
161
- let dropped1 = core:: cell:: Cell :: new ( false ) ;
162
- let dropped2 = core:: cell:: Cell :: new ( false ) ;
163
- let dropped3 = core:: cell:: Cell :: new ( false ) ;
164
- let mut buffer = DropCheck {
165
- flag : Some ( & dropped1) ,
166
- value : 1 ,
167
- } ;
115
+ let mut buffer = 1 ;
168
116
let ( allowed, kernel_ptr) = KernelPtr :: allow ( & mut buffer) ;
169
- assert_eq ! ( kernel_ptr. value( ) , 1 ) ;
170
- assert_eq ! ( dropped1. get( ) , false ) ;
117
+ assert_eq ! ( kernel_ptr. get( ) , 1 ) ;
171
118
172
- // Simulate the kernel replacing the value in buffer. We don't drop the
173
- // existing value.
174
- kernel_ptr. set ( DropCheck {
175
- flag : Some ( & dropped2) ,
176
- value : 2 ,
177
- } ) ;
119
+ // Simulate the kernel replacing the value in buffer.
120
+ kernel_ptr. set ( 2 ) ;
178
121
let returned = allowed. take ( ) ;
179
- assert_eq ! ( returned. value, 2 ) ;
180
- assert_eq ! ( kernel_ptr. value( ) , 0 ) ;
181
- assert_eq ! ( dropped1. get( ) , false ) ;
182
- assert_eq ! ( dropped2. get( ) , false ) ;
183
- assert_eq ! ( dropped3. get( ) , false ) ;
122
+ assert_eq ! ( returned, 2 ) ;
123
+ assert_eq ! ( kernel_ptr. get( ) , 0 ) ;
184
124
}
0 commit comments