1
1
use std:: prelude:: v1:: * ;
2
2
use std:: mem:: { size_of, align_of} ;
3
+ use alloc:: allocator:: Layout ;
3
4
use super :: * ;
4
5
5
6
fn new_heap ( ) -> Heap {
@@ -26,23 +27,25 @@ fn new_max_heap() -> Heap {
26
27
#[ test]
27
28
fn empty ( ) {
28
29
let mut heap = Heap :: empty ( ) ;
29
- assert ! ( heap. allocate_first_fit( 1 , 1 ) . is_none( ) ) ;
30
+ let layout = Layout :: from_size_align ( 1 , 1 ) . unwrap ( ) ;
31
+ assert ! ( heap. allocate_first_fit( layout. clone( ) ) . is_err( ) ) ;
30
32
}
31
33
32
34
#[ test]
33
35
fn oom ( ) {
34
36
let mut heap = new_heap ( ) ;
35
- let size = heap. size ( ) + 1 ;
36
- let addr = heap. allocate_first_fit ( size , align_of :: < usize > ( ) ) ;
37
- assert ! ( addr. is_none ( ) ) ;
37
+ let layout = Layout :: from_size_align ( heap. size ( ) + 1 , align_of :: < usize > ( ) ) ;
38
+ let addr = heap. allocate_first_fit ( layout . unwrap ( ) ) ;
39
+ assert ! ( addr. is_err ( ) ) ;
38
40
}
39
41
40
42
#[ test]
41
43
fn allocate_double_usize ( ) {
42
44
let mut heap = new_heap ( ) ;
43
45
let size = size_of :: < usize > ( ) * 2 ;
44
- let addr = heap. allocate_first_fit ( size, align_of :: < usize > ( ) ) ;
45
- assert ! ( addr. is_some( ) ) ;
46
+ let layout = Layout :: from_size_align ( size, align_of :: < usize > ( ) ) ;
47
+ let addr = heap. allocate_first_fit ( layout. unwrap ( ) ) ;
48
+ assert ! ( addr. is_ok( ) ) ;
46
49
let addr = addr. unwrap ( ) as usize ;
47
50
assert ! ( addr == heap. bottom) ;
48
51
let ( hole_addr, hole_size) = heap. holes . first_hole ( ) . expect ( "ERROR: no hole left" ) ;
@@ -58,11 +61,12 @@ fn allocate_double_usize() {
58
61
fn allocate_and_free_double_usize ( ) {
59
62
let mut heap = new_heap ( ) ;
60
63
61
- let x = heap. allocate_first_fit ( size_of :: < usize > ( ) * 2 , align_of :: < usize > ( ) ) . unwrap ( ) ;
64
+ let layout = Layout :: from_size_align ( size_of :: < usize > ( ) * 2 , align_of :: < usize > ( ) ) . unwrap ( ) ;
65
+ let x = heap. allocate_first_fit ( layout. clone ( ) ) . unwrap ( ) ;
62
66
unsafe {
63
67
* ( x as * mut ( usize , usize ) ) = ( 0xdeafdeadbeafbabe , 0xdeafdeadbeafbabe ) ;
64
68
65
- heap. deallocate ( x, size_of :: < usize > ( ) * 2 , align_of :: < usize > ( ) ) ;
69
+ heap. deallocate ( x, layout . clone ( ) ) ;
66
70
assert_eq ! ( ( * ( heap. bottom as * const Hole ) ) . size, heap. size) ;
67
71
assert ! ( ( * ( heap. bottom as * const Hole ) ) . next. is_none( ) ) ;
68
72
}
@@ -71,18 +75,18 @@ fn allocate_and_free_double_usize() {
71
75
#[ test]
72
76
fn deallocate_right_before ( ) {
73
77
let mut heap = new_heap ( ) ;
74
- let size = size_of :: < usize > ( ) * 5 ;
78
+ let layout = Layout :: from_size_align ( size_of :: < usize > ( ) * 5 , 1 ) . unwrap ( ) ;
75
79
76
- let x = heap. allocate_first_fit ( size , 1 ) . unwrap ( ) ;
77
- let y = heap. allocate_first_fit ( size , 1 ) . unwrap ( ) ;
78
- let z = heap. allocate_first_fit ( size , 1 ) . unwrap ( ) ;
80
+ let x = heap. allocate_first_fit ( layout . clone ( ) ) . unwrap ( ) ;
81
+ let y = heap. allocate_first_fit ( layout . clone ( ) ) . unwrap ( ) ;
82
+ let z = heap. allocate_first_fit ( layout . clone ( ) ) . unwrap ( ) ;
79
83
80
84
unsafe {
81
- heap. deallocate ( y, size , 1 ) ;
82
- assert_eq ! ( ( * ( y as * const Hole ) ) . size, size) ;
83
- heap. deallocate ( x, size , 1 ) ;
84
- assert_eq ! ( ( * ( x as * const Hole ) ) . size, size * 2 ) ;
85
- heap. deallocate ( z, size , 1 ) ;
85
+ heap. deallocate ( y, layout . clone ( ) ) ;
86
+ assert_eq ! ( ( * ( y as * const Hole ) ) . size, layout . size( ) ) ;
87
+ heap. deallocate ( x, layout . clone ( ) ) ;
88
+ assert_eq ! ( ( * ( x as * const Hole ) ) . size, layout . size( ) * 2 ) ;
89
+ heap. deallocate ( z, layout . clone ( ) ) ;
86
90
assert_eq ! ( ( * ( x as * const Hole ) ) . size, heap. size) ;
87
91
}
88
92
}
@@ -91,17 +95,18 @@ fn deallocate_right_before() {
91
95
fn deallocate_right_behind ( ) {
92
96
let mut heap = new_heap ( ) ;
93
97
let size = size_of :: < usize > ( ) * 5 ;
98
+ let layout = Layout :: from_size_align ( size, 1 ) . unwrap ( ) ;
94
99
95
- let x = heap. allocate_first_fit ( size , 1 ) . unwrap ( ) ;
96
- let y = heap. allocate_first_fit ( size , 1 ) . unwrap ( ) ;
97
- let z = heap. allocate_first_fit ( size , 1 ) . unwrap ( ) ;
100
+ let x = heap. allocate_first_fit ( layout . clone ( ) ) . unwrap ( ) ;
101
+ let y = heap. allocate_first_fit ( layout . clone ( ) ) . unwrap ( ) ;
102
+ let z = heap. allocate_first_fit ( layout . clone ( ) ) . unwrap ( ) ;
98
103
99
104
unsafe {
100
- heap. deallocate ( x, size , 1 ) ;
105
+ heap. deallocate ( x, layout . clone ( ) ) ;
101
106
assert_eq ! ( ( * ( x as * const Hole ) ) . size, size) ;
102
- heap. deallocate ( y, size , 1 ) ;
107
+ heap. deallocate ( y, layout . clone ( ) ) ;
103
108
assert_eq ! ( ( * ( x as * const Hole ) ) . size, size * 2 ) ;
104
- heap. deallocate ( z, size , 1 ) ;
109
+ heap. deallocate ( z, layout . clone ( ) ) ;
105
110
assert_eq ! ( ( * ( x as * const Hole ) ) . size, heap. size) ;
106
111
}
107
112
}
@@ -110,21 +115,22 @@ fn deallocate_right_behind() {
110
115
fn deallocate_middle ( ) {
111
116
let mut heap = new_heap ( ) ;
112
117
let size = size_of :: < usize > ( ) * 5 ;
118
+ let layout = Layout :: from_size_align ( size, 1 ) . unwrap ( ) ;
113
119
114
- let x = heap. allocate_first_fit ( size , 1 ) . unwrap ( ) ;
115
- let y = heap. allocate_first_fit ( size , 1 ) . unwrap ( ) ;
116
- let z = heap. allocate_first_fit ( size , 1 ) . unwrap ( ) ;
117
- let a = heap. allocate_first_fit ( size , 1 ) . unwrap ( ) ;
120
+ let x = heap. allocate_first_fit ( layout . clone ( ) ) . unwrap ( ) ;
121
+ let y = heap. allocate_first_fit ( layout . clone ( ) ) . unwrap ( ) ;
122
+ let z = heap. allocate_first_fit ( layout . clone ( ) ) . unwrap ( ) ;
123
+ let a = heap. allocate_first_fit ( layout . clone ( ) ) . unwrap ( ) ;
118
124
119
125
unsafe {
120
- heap. deallocate ( x, size , 1 ) ;
126
+ heap. deallocate ( x, layout . clone ( ) ) ;
121
127
assert_eq ! ( ( * ( x as * const Hole ) ) . size, size) ;
122
- heap. deallocate ( z, size , 1 ) ;
128
+ heap. deallocate ( z, layout . clone ( ) ) ;
123
129
assert_eq ! ( ( * ( x as * const Hole ) ) . size, size) ;
124
130
assert_eq ! ( ( * ( z as * const Hole ) ) . size, size) ;
125
- heap. deallocate ( y, size , 1 ) ;
131
+ heap. deallocate ( y, layout . clone ( ) ) ;
126
132
assert_eq ! ( ( * ( x as * const Hole ) ) . size, size * 3 ) ;
127
- heap. deallocate ( a, size , 1 ) ;
133
+ heap. deallocate ( a, layout . clone ( ) ) ;
128
134
assert_eq ! ( ( * ( x as * const Hole ) ) . size, heap. size) ;
129
135
}
130
136
}
@@ -133,14 +139,16 @@ fn deallocate_middle() {
133
139
fn reallocate_double_usize ( ) {
134
140
let mut heap = new_heap ( ) ;
135
141
136
- let x = heap. allocate_first_fit ( size_of :: < usize > ( ) * 2 , align_of :: < usize > ( ) ) . unwrap ( ) ;
142
+ let layout = Layout :: from_size_align ( size_of :: < usize > ( ) * 2 , align_of :: < usize > ( ) ) . unwrap ( ) ;
143
+
144
+ let x = heap. allocate_first_fit ( layout. clone ( ) ) . unwrap ( ) ;
137
145
unsafe {
138
- heap. deallocate ( x, size_of :: < usize > ( ) * 2 , align_of :: < usize > ( ) ) ;
146
+ heap. deallocate ( x, layout . clone ( ) ) ;
139
147
}
140
148
141
- let y = heap. allocate_first_fit ( size_of :: < usize > ( ) * 2 , align_of :: < usize > ( ) ) . unwrap ( ) ;
149
+ let y = heap. allocate_first_fit ( layout . clone ( ) ) . unwrap ( ) ;
142
150
unsafe {
143
- heap. deallocate ( y, size_of :: < usize > ( ) * 2 , align_of :: < usize > ( ) ) ;
151
+ heap. deallocate ( y, layout . clone ( ) ) ;
144
152
}
145
153
146
154
assert_eq ! ( x, y) ;
@@ -152,53 +160,63 @@ fn allocate_multiple_sizes() {
152
160
let base_size = size_of :: < usize > ( ) ;
153
161
let base_align = align_of :: < usize > ( ) ;
154
162
155
- let x = heap. allocate_first_fit ( base_size * 2 , base_align) . unwrap ( ) ;
156
- let y = heap. allocate_first_fit ( base_size * 7 , base_align) . unwrap ( ) ;
163
+ let layout_1 = Layout :: from_size_align ( base_size * 2 , base_align) . unwrap ( ) ;
164
+ let layout_2 = Layout :: from_size_align ( base_size * 7 , base_align) . unwrap ( ) ;
165
+ let layout_3 = Layout :: from_size_align ( base_size * 3 , base_align * 4 ) . unwrap ( ) ;
166
+ let layout_4 = Layout :: from_size_align ( base_size * 4 , base_align) . unwrap ( ) ;
167
+
168
+ let x = heap. allocate_first_fit ( layout_1. clone ( ) ) . unwrap ( ) ;
169
+ let y = heap. allocate_first_fit ( layout_2. clone ( ) ) . unwrap ( ) ;
157
170
assert_eq ! ( y as usize , x as usize + base_size * 2 ) ;
158
- let z = heap. allocate_first_fit ( base_size * 3 , base_align * 4 ) . unwrap ( ) ;
171
+ let z = heap. allocate_first_fit ( layout_3 . clone ( ) ) . unwrap ( ) ;
159
172
assert_eq ! ( z as usize % ( base_size * 4 ) , 0 ) ;
160
173
161
174
unsafe {
162
- heap. deallocate ( x, base_size * 2 , base_align ) ;
175
+ heap. deallocate ( x, layout_1 . clone ( ) ) ;
163
176
}
164
177
165
- let a = heap. allocate_first_fit ( base_size * 4 , base_align ) . unwrap ( ) ;
166
- let b = heap. allocate_first_fit ( base_size * 2 , base_align ) . unwrap ( ) ;
178
+ let a = heap. allocate_first_fit ( layout_4 . clone ( ) ) . unwrap ( ) ;
179
+ let b = heap. allocate_first_fit ( layout_1 . clone ( ) ) . unwrap ( ) ;
167
180
assert_eq ! ( b, x) ;
168
181
169
182
unsafe {
170
- heap. deallocate ( y, base_size * 7 , base_align ) ;
171
- heap. deallocate ( z, base_size * 3 , base_align * 4 ) ;
172
- heap. deallocate ( a, base_size * 4 , base_align ) ;
173
- heap. deallocate ( b, base_size * 2 , base_align ) ;
183
+ heap. deallocate ( y, layout_2 ) ;
184
+ heap. deallocate ( z, layout_3 ) ;
185
+ heap. deallocate ( a, layout_4 ) ;
186
+ heap. deallocate ( b, layout_1 ) ;
174
187
}
175
188
}
176
189
177
190
#[ test]
178
191
fn allocate_usize ( ) {
179
192
let mut heap = new_heap ( ) ;
180
193
181
- assert ! ( heap. allocate_first_fit( size_of:: <usize >( ) , 1 ) . is_some( ) ) ;
194
+ let layout = Layout :: from_size_align ( size_of :: < usize > ( ) , 1 ) . unwrap ( ) ;
195
+
196
+ assert ! ( heap. allocate_first_fit( layout. clone( ) ) . is_ok( ) ) ;
182
197
}
183
198
184
199
#[ test]
185
200
fn allocate_usize_in_bigger_block ( ) {
186
201
let mut heap = new_heap ( ) ;
187
202
188
- let x = heap. allocate_first_fit ( size_of :: < usize > ( ) * 2 , 1 ) . unwrap ( ) ;
189
- let y = heap. allocate_first_fit ( size_of :: < usize > ( ) * 2 , 1 ) . unwrap ( ) ;
203
+ let layout_1 = Layout :: from_size_align ( size_of :: < usize > ( ) * 2 , 1 ) . unwrap ( ) ;
204
+ let layout_2 = Layout :: from_size_align ( size_of :: < usize > ( ) , 1 ) . unwrap ( ) ;
205
+
206
+ let x = heap. allocate_first_fit ( layout_1. clone ( ) ) . unwrap ( ) ;
207
+ let y = heap. allocate_first_fit ( layout_1. clone ( ) ) . unwrap ( ) ;
190
208
unsafe {
191
- heap. deallocate ( x, size_of :: < usize > ( ) * 2 , 1 ) ;
209
+ heap. deallocate ( x, layout_1 . clone ( ) ) ;
192
210
}
193
211
194
- let z = heap. allocate_first_fit ( size_of :: < usize > ( ) , 1 ) ;
195
- assert ! ( z. is_some ( ) ) ;
212
+ let z = heap. allocate_first_fit ( layout_2 . clone ( ) ) ;
213
+ assert ! ( z. is_ok ( ) ) ;
196
214
let z = z. unwrap ( ) ;
197
215
assert_eq ! ( x, z) ;
198
216
199
217
unsafe {
200
- heap. deallocate ( y, size_of :: < usize > ( ) * 2 , 1 ) ;
201
- heap. deallocate ( z, size_of :: < usize > ( ) , 1 ) ;
218
+ heap. deallocate ( y, layout_1 . clone ( ) ) ;
219
+ heap. deallocate ( z, layout_2 ) ;
202
220
}
203
221
}
204
222
@@ -207,10 +225,13 @@ fn allocate_usize_in_bigger_block() {
207
225
fn align_from_small_to_big ( ) {
208
226
let mut heap = new_heap ( ) ;
209
227
228
+ let layout_1 = Layout :: from_size_align ( 28 , 4 ) . unwrap ( ) ;
229
+ let layout_2 = Layout :: from_size_align ( 8 , 8 ) . unwrap ( ) ;
230
+
210
231
// allocate 28 bytes so that the heap end is only 4 byte aligned
211
- assert ! ( heap. allocate_first_fit( 28 , 4 ) . is_some ( ) ) ;
232
+ assert ! ( heap. allocate_first_fit( layout_1 . clone ( ) ) . is_ok ( ) ) ;
212
233
// try to allocate a 8 byte aligned block
213
- assert ! ( heap. allocate_first_fit( 8 , 8 ) . is_some ( ) ) ;
234
+ assert ! ( heap. allocate_first_fit( layout_2 . clone ( ) ) . is_ok ( ) ) ;
214
235
}
215
236
216
237
#[ test]
@@ -222,34 +243,40 @@ fn extend_empty_heap() {
222
243
}
223
244
224
245
// Try to allocate full heap after extend
225
- assert ! ( heap. allocate_first_fit( 2048 , 1 ) . is_some( ) ) ;
246
+ let layout = Layout :: from_size_align ( 2048 , 1 ) . unwrap ( ) ;
247
+ assert ! ( heap. allocate_first_fit( layout. clone( ) ) . is_ok( ) ) ;
226
248
}
227
249
228
250
#[ test]
229
251
fn extend_full_heap ( ) {
230
252
let mut heap = new_max_heap ( ) ;
231
253
254
+ let layout = Layout :: from_size_align ( 1024 , 1 ) . unwrap ( ) ;
255
+
232
256
// Allocate full heap, extend and allocate again to the max
233
- assert ! ( heap. allocate_first_fit( 1024 , 1 ) . is_some ( ) ) ;
257
+ assert ! ( heap. allocate_first_fit( layout . clone ( ) ) . is_ok ( ) ) ;
234
258
unsafe {
235
259
heap. extend ( 1024 ) ;
236
260
}
237
- assert ! ( heap. allocate_first_fit( 1024 , 1 ) . is_some ( ) ) ;
261
+ assert ! ( heap. allocate_first_fit( layout . clone ( ) ) . is_ok ( ) ) ;
238
262
}
239
263
240
264
#[ test]
241
265
fn extend_fragmented_heap ( ) {
242
266
let mut heap = new_max_heap ( ) ;
243
267
244
- let alloc1 = heap. allocate_first_fit ( 512 , 1 ) ;
245
- let alloc2 = heap. allocate_first_fit ( 512 , 1 ) ;
268
+ let layout_1 = Layout :: from_size_align ( 512 , 1 ) . unwrap ( ) ;
269
+ let layout_2 = Layout :: from_size_align ( 1024 , 1 ) . unwrap ( ) ;
270
+
271
+ let alloc1 = heap. allocate_first_fit ( layout_1. clone ( ) ) ;
272
+ let alloc2 = heap. allocate_first_fit ( layout_1. clone ( ) ) ;
246
273
247
- assert ! ( alloc1. is_some ( ) ) ;
248
- assert ! ( alloc2. is_some ( ) ) ;
274
+ assert ! ( alloc1. is_ok ( ) ) ;
275
+ assert ! ( alloc2. is_ok ( ) ) ;
249
276
250
277
unsafe {
251
278
// Create a hole at the beginning of the heap
252
- heap. deallocate ( alloc1. unwrap ( ) , 512 , 1 ) ;
279
+ heap. deallocate ( alloc1. unwrap ( ) , layout_1 . clone ( ) ) ;
253
280
}
254
281
255
282
unsafe {
@@ -258,5 +285,5 @@ fn extend_fragmented_heap() {
258
285
259
286
// We got additional 1024 bytes hole at the end of the heap
260
287
// Try to allocate there
261
- assert ! ( heap. allocate_first_fit( 1024 , 1 ) . is_some ( ) ) ;
288
+ assert ! ( heap. allocate_first_fit( layout_2 . clone ( ) ) . is_ok ( ) ) ;
262
289
}
0 commit comments