@@ -27,15 +27,15 @@ mod test;
27
27
28
28
pub use frame:: * ;
29
29
30
- /// A heap that uses buddy system
30
+ /// A heap that uses buddy system with configurable order.
31
31
///
32
32
/// # Usage
33
33
///
34
34
/// Create a heap and add a memory region to it:
35
35
/// ```
36
36
/// use buddy_system_allocator::*;
37
37
/// # use core::mem::size_of;
38
- /// let mut heap = Heap::empty();
38
+ /// let mut heap = Heap::<32>:: empty();
39
39
/// # let space: [usize; 100] = [0; 100];
40
40
/// # let begin: usize = space.as_ptr() as usize;
41
41
/// # let end: usize = begin + 100 * size_of::<usize>();
@@ -46,21 +46,21 @@ pub use frame::*;
46
46
/// heap.add_to_heap(begin, end);
47
47
/// }
48
48
/// ```
49
- pub struct Heap {
50
- // buddy system with max order of 32
51
- free_list : [ linked_list:: LinkedList ; 32 ] ,
49
+ pub struct Heap < const ORDER : usize > {
50
+ // buddy system with max order of `ORDER`
51
+ free_list : [ linked_list:: LinkedList ; ORDER ] ,
52
52
53
53
// statistics
54
54
user : usize ,
55
55
allocated : usize ,
56
56
total : usize ,
57
57
}
58
58
59
- impl Heap {
59
+ impl < const ORDER : usize > Heap < ORDER > {
60
60
/// Create an empty heap
61
61
pub const fn new ( ) -> Self {
62
62
Heap {
63
- free_list : [ linked_list:: LinkedList :: new ( ) ; 32 ] ,
63
+ free_list : [ linked_list:: LinkedList :: new ( ) ; ORDER ] ,
64
64
user : 0 ,
65
65
allocated : 0 ,
66
66
total : 0 ,
@@ -198,7 +198,7 @@ impl Heap {
198
198
}
199
199
}
200
200
201
- impl fmt:: Debug for Heap {
201
+ impl < const ORDER : usize > fmt:: Debug for Heap < ORDER > {
202
202
fn fmt ( & self , fmt : & mut fmt:: Formatter ) -> fmt:: Result {
203
203
fmt. debug_struct ( "Heap" )
204
204
. field ( "user" , & self . user )
@@ -216,7 +216,7 @@ impl fmt::Debug for Heap {
216
216
/// ```
217
217
/// use buddy_system_allocator::*;
218
218
/// # use core::mem::size_of;
219
- /// let mut heap = LockedHeap::new();
219
+ /// let mut heap = LockedHeap::<32>:: new();
220
220
/// # let space: [usize; 100] = [0; 100];
221
221
/// # let begin: usize = space.as_ptr() as usize;
222
222
/// # let end: usize = begin + 100 * size_of::<usize>();
@@ -228,32 +228,32 @@ impl fmt::Debug for Heap {
228
228
/// }
229
229
/// ```
230
230
#[ cfg( feature = "use_spin" ) ]
231
- pub struct LockedHeap ( Mutex < Heap > ) ;
231
+ pub struct LockedHeap < const ORDER : usize > ( Mutex < Heap < ORDER > > ) ;
232
232
233
233
#[ cfg( feature = "use_spin" ) ]
234
- impl LockedHeap {
234
+ impl < const ORDER : usize > LockedHeap < ORDER > {
235
235
/// Creates an empty heap
236
- pub const fn new ( ) -> LockedHeap {
237
- LockedHeap ( Mutex :: new ( Heap :: new ( ) ) )
236
+ pub const fn new ( ) -> Self {
237
+ LockedHeap ( Mutex :: new ( Heap :: < ORDER > :: new ( ) ) )
238
238
}
239
239
240
240
/// Creates an empty heap
241
- pub const fn empty ( ) -> LockedHeap {
242
- LockedHeap ( Mutex :: new ( Heap :: new ( ) ) )
241
+ pub const fn empty ( ) -> Self {
242
+ LockedHeap ( Mutex :: new ( Heap :: < ORDER > :: new ( ) ) )
243
243
}
244
244
}
245
245
246
246
#[ cfg( feature = "use_spin" ) ]
247
- impl Deref for LockedHeap {
248
- type Target = Mutex < Heap > ;
247
+ impl < const ORDER : usize > Deref for LockedHeap < ORDER > {
248
+ type Target = Mutex < Heap < ORDER > > ;
249
249
250
- fn deref ( & self ) -> & Mutex < Heap > {
250
+ fn deref ( & self ) -> & Self :: Target {
251
251
& self . 0
252
252
}
253
253
}
254
254
255
255
#[ cfg( feature = "use_spin" ) ]
256
- unsafe impl GlobalAlloc for LockedHeap {
256
+ unsafe impl < const ORDER : usize > GlobalAlloc for LockedHeap < ORDER > {
257
257
unsafe fn alloc ( & self , layout : Layout ) -> * mut u8 {
258
258
self . 0
259
259
. lock ( )
@@ -274,48 +274,48 @@ unsafe impl GlobalAlloc for LockedHeap {
274
274
/// Create a locked heap:
275
275
/// ```
276
276
/// use buddy_system_allocator::*;
277
- /// let heap = LockedHeapWithRescue::new(|heap: &mut Heap| {});
277
+ /// let heap = LockedHeapWithRescue::new(|heap: &mut Heap<32> | {});
278
278
/// ```
279
279
///
280
280
/// Before oom, the allocator will try to call rescue function and try for one more time.
281
281
#[ cfg( feature = "use_spin" ) ]
282
- pub struct LockedHeapWithRescue {
283
- inner : Mutex < Heap > ,
284
- rescue : fn ( & mut Heap ) ,
282
+ pub struct LockedHeapWithRescue < const ORDER : usize > {
283
+ inner : Mutex < Heap < ORDER > > ,
284
+ rescue : fn ( & mut Heap < ORDER > ) ,
285
285
}
286
286
287
287
#[ cfg( feature = "use_spin" ) ]
288
- impl LockedHeapWithRescue {
288
+ impl < const ORDER : usize > LockedHeapWithRescue < ORDER > {
289
289
/// Creates an empty heap
290
290
#[ cfg( feature = "const_fn" ) ]
291
- pub const fn new ( rescue : fn ( & mut Heap ) ) -> LockedHeapWithRescue {
291
+ pub const fn new ( rescue : fn ( & mut Heap ) ) -> Self {
292
292
LockedHeapWithRescue {
293
- inner : Mutex :: new ( Heap :: new ( ) ) ,
293
+ inner : Mutex :: new ( Heap :: < ORDER > :: new ( ) ) ,
294
294
rescue,
295
295
}
296
296
}
297
297
298
298
/// Creates an empty heap
299
299
#[ cfg( not( feature = "const_fn" ) ) ]
300
- pub fn new ( rescue : fn ( & mut Heap ) ) -> LockedHeapWithRescue {
300
+ pub fn new ( rescue : fn ( & mut Heap < ORDER > ) ) -> Self {
301
301
LockedHeapWithRescue {
302
- inner : Mutex :: new ( Heap :: new ( ) ) ,
302
+ inner : Mutex :: new ( Heap :: < ORDER > :: new ( ) ) ,
303
303
rescue,
304
304
}
305
305
}
306
306
}
307
307
308
308
#[ cfg( feature = "use_spin" ) ]
309
- impl Deref for LockedHeapWithRescue {
310
- type Target = Mutex < Heap > ;
309
+ impl < const ORDER : usize > Deref for LockedHeapWithRescue < ORDER > {
310
+ type Target = Mutex < Heap < ORDER > > ;
311
311
312
- fn deref ( & self ) -> & Mutex < Heap > {
312
+ fn deref ( & self ) -> & Self :: Target {
313
313
& self . inner
314
314
}
315
315
}
316
316
317
317
#[ cfg( feature = "use_spin" ) ]
318
- unsafe impl GlobalAlloc for LockedHeapWithRescue {
318
+ unsafe impl < const ORDER : usize > GlobalAlloc for LockedHeapWithRescue < ORDER > {
319
319
unsafe fn alloc ( & self , layout : Layout ) -> * mut u8 {
320
320
let mut inner = self . inner . lock ( ) ;
321
321
match inner. alloc ( layout) {
0 commit comments