@@ -96,12 +96,14 @@ impl HoleList {
96
96
pub fn allocate_first_fit ( & mut self , layout : Layout ) -> Result < ( NonNull < u8 > , Layout ) , ( ) > {
97
97
let aligned_layout = Self :: align_layout ( layout) ;
98
98
99
- allocate_first_fit ( & mut self . first , aligned_layout) . map ( |holeinfo| {
100
- (
101
- NonNull :: new ( holeinfo. addr as * mut u8 ) . unwrap ( ) ,
102
- aligned_layout,
103
- )
104
- } )
99
+ let _ = allocate_first_fit ( & mut self . first , aligned_layout) ;
100
+ // .map(|holeinfo| {
101
+ // (
102
+ // NonNull::new(holeinfo.addr).unwrap(),
103
+ // aligned_layout,
104
+ // )
105
+ // })
106
+ Err ( ( ) )
105
107
}
106
108
107
109
/// Frees the allocation given by `ptr` and `layout`.
@@ -147,7 +149,7 @@ impl Hole {
147
149
/// Returns basic information about the hole.
148
150
fn info ( & mut self ) -> HoleInfo {
149
151
HoleInfo {
150
- addr : self as * mut _ as * mut u8 ,
152
+ addr : self as * mut Hole ,
151
153
size : self . size ,
152
154
}
153
155
}
@@ -156,10 +158,16 @@ impl Hole {
156
158
/// Basic information about a hole.
157
159
#[ derive( Debug , Clone , Copy ) ]
158
160
struct HoleInfo {
159
- addr : * mut u8 ,
161
+ addr : * mut Hole ,
160
162
size : usize ,
161
163
}
162
164
165
+ impl HoleInfo {
166
+ pub fn addr_u8 ( & self ) -> * mut u8 {
167
+ self . addr . cast ( )
168
+ }
169
+ }
170
+
163
171
/// The result returned by `split_hole` and `allocate_first_fit`. Contains the address and size of
164
172
/// the allocation (in the `info` field), and the front and back padding.
165
173
struct Allocation {
@@ -177,17 +185,17 @@ fn split_hole(hole: HoleInfo, required_layout: Layout) -> Option<Allocation> {
177
185
let required_size = required_layout. size ( ) ;
178
186
let required_align = required_layout. align ( ) ;
179
187
180
- let ( aligned_addr, front_padding) = if hole. addr == align_up ( hole. addr , required_align) {
188
+ let ( aligned_addr, front_padding) = if hole. addr_u8 ( ) == align_up ( hole. addr_u8 ( ) , required_align) {
181
189
// hole has already the required alignment
182
190
( hole. addr , None )
183
191
} else {
184
192
// the required alignment causes some padding before the allocation
185
- let aligned_addr = align_up ( hole. addr . wrapping_add ( HoleList :: min_size ( ) ) , required_align) ;
193
+ let aligned_addr = align_up ( hole. addr_u8 ( ) . wrapping_add ( HoleList :: min_size ( ) ) , required_align) . cast :: < Hole > ( ) ;
186
194
(
187
195
aligned_addr,
188
196
Some ( HoleInfo {
189
197
addr : hole. addr ,
190
- size : unsafe { aligned_addr. offset_from ( hole. addr ) }
198
+ size : unsafe { aligned_addr. cast :: < u8 > ( ) . offset_from ( hole. addr_u8 ( ) ) }
191
199
. try_into ( )
192
200
. unwrap ( ) ,
193
201
} ) ,
@@ -253,9 +261,23 @@ fn allocate_first_fit(mut previous: &mut Hole, layout: Layout) -> Result<HoleInf
253
261
// previous - front_padding
254
262
// front_padding - back_padding
255
263
// back_padding - previous.next
256
- previous. next = previous. next . as_mut ( ) . unwrap ( ) . next . take ( ) ;
264
+ let prev = previous as * mut Hole as usize ;
265
+ println ! ( "prev: {:016X}..{:016X}" , prev, prev + previous. size) ;
266
+ if let Some ( padding) = allocation. back_padding {
267
+ let back = padding. addr as usize ;
268
+ println ! ( "back: {:016X}..{:016X}" , back, back + padding. size) ;
269
+ }
270
+ if let Some ( next) = previous. next . as_mut ( ) {
271
+ let nxt = ( * next) as * mut Hole as usize ;
272
+ println ! ( "next: {:016X}..{:016X}" , nxt, nxt + next. size) ;
273
+ }
274
+ panic ! ( ) ;
275
+
276
+ let new_next = previous. next . as_mut ( ) . unwrap ( ) . next . take ( ) ;
277
+
278
+ previous. next = new_next;
257
279
if let Some ( padding) = allocation. front_padding {
258
- let ptr = padding. addr as * mut Hole ;
280
+ let ptr = padding. addr ;
259
281
unsafe {
260
282
ptr. write ( Hole {
261
283
size : padding. size ,
@@ -266,7 +288,7 @@ fn allocate_first_fit(mut previous: &mut Hole, layout: Layout) -> Result<HoleInf
266
288
previous = move_helper ( previous) . next . as_mut ( ) . unwrap ( ) ;
267
289
}
268
290
if let Some ( padding) = allocation. back_padding {
269
- let ptr = padding. addr as * mut Hole ;
291
+ let ptr = padding. addr ;
270
292
unsafe {
271
293
ptr. write ( Hole {
272
294
size : padding. size ,
@@ -318,7 +340,7 @@ fn deallocate(mut hole: &mut Hole, addr: *mut u8, mut size: usize) {
318
340
match next_hole_info {
319
341
Some ( next)
320
342
if hole_addr. wrapping_offset ( hole. size . try_into ( ) . unwrap ( ) ) == addr
321
- && addr. wrapping_offset ( size. try_into ( ) . unwrap ( ) ) == next. addr =>
343
+ && addr. wrapping_offset ( size. try_into ( ) . unwrap ( ) ) == next. addr_u8 ( ) =>
322
344
{
323
345
// block fills the gap between this hole and the next hole
324
346
// before: ___XXX____YYYYY____ where X is this hole and Y the next hole
@@ -338,7 +360,7 @@ fn deallocate(mut hole: &mut Hole, addr: *mut u8, mut size: usize) {
338
360
339
361
hole. size += size; // merge the F block to this X block
340
362
}
341
- Some ( next) if addr. wrapping_offset ( size. try_into ( ) . unwrap ( ) ) == next. addr => {
363
+ Some ( next) if addr. wrapping_offset ( size. try_into ( ) . unwrap ( ) ) == next. addr_u8 ( ) => {
342
364
// block is right before the next hole but there is used memory before it
343
365
// before: ___XXX______YYYYY____ where X is this hole and Y the next hole
344
366
// after: ___XXX__FFFFYYYYY____ where F is the freed block
@@ -347,7 +369,7 @@ fn deallocate(mut hole: &mut Hole, addr: *mut u8, mut size: usize) {
347
369
size += next. size ; // free the merged F/Y block in next iteration
348
370
continue ;
349
371
}
350
- Some ( next) if next. addr <= addr => {
372
+ Some ( next) if next. addr_u8 ( ) <= addr => {
351
373
// block is behind the next hole, so we delegate it to the next hole
352
374
// before: ___XXX__YYYYY________ where X is this hole and Y the next hole
353
375
// after: ___XXX__YYYYY__FFFF__ where F is the freed block
0 commit comments