ckb_std/global_alloc_macro/
default_alloc.rs

1/// Defines global allocator
2///
3///
4/// # Example
5///
6/// ```
7/// // define global allocator
8/// default_alloc!()
9///
10/// // Default allocator uses a mixed allocation strategy:
11/// //
12/// // * Fixed block heap, only allocate fixed size(64B) memory block
13/// // * Dynamic memory heap, allocate any size memory block
14/// //
15/// // User can invoke macro with arguments to customize the heap size
16/// // The default heap size arguments are:
17/// // (fixed heap size 4KB, dynamic heap size 516KB, dynamic heap min memory block 64B)
18/// default_alloc!(4 * 1024, 516 * 1024, 64)
19/// ```
20#[macro_export]
21macro_rules! default_alloc {
22    () => {
23        $crate::default_alloc!({ 4 * 1024 }, { 516 * 1024 }, 64);
24    };
25    ($fixed_block_heap_size:expr, $heap_size:expr, $min_block_size:expr) => {
26        #[repr(align(64))]
27        struct _AlignedHeap<const N: usize>([u8; N]);
28
29        static mut _BUDDY_HEAP: _AlignedHeap<$heap_size> = _AlignedHeap([0u8; $heap_size]);
30        static mut _FIXED_BLOCK_HEAP: _AlignedHeap<$fixed_block_heap_size> =
31            _AlignedHeap([0u8; $fixed_block_heap_size]);
32
33        #[global_allocator]
34        static ALLOC: $crate::buddy_alloc::NonThreadsafeAlloc = unsafe {
35            let fast_param = $crate::buddy_alloc::FastAllocParam::new(
36                _FIXED_BLOCK_HEAP.0.as_ptr(),
37                $fixed_block_heap_size,
38            );
39            let buddy_param = $crate::buddy_alloc::BuddyAllocParam::new_with_zero_filled(
40                _BUDDY_HEAP.0.as_ptr(),
41                $heap_size,
42                $min_block_size,
43            );
44            $crate::buddy_alloc::NonThreadsafeAlloc::new(fast_param, buddy_param)
45        };
46    };
47}