composable_allocators/
lib.rs

1#![feature(allocator_api)]
2#![feature(never_type)]
3#![feature(slice_ptr_get)]
4
5#![deny(warnings)]
6#![doc(test(attr(deny(warnings))))]
7#![doc(test(attr(allow(dead_code))))]
8#![doc(test(attr(allow(unused_variables))))]
9#![allow(clippy::collapsible_else_if)]
10#![allow(clippy::needless_lifetimes)]
11
12#![no_std]
13
14extern crate alloc;
15
16mod base;
17pub use base::*;
18
19pub mod fallbacked;
20
21pub mod limited_up_to;
22
23mod global;
24pub use global::*;
25
26mod as_global;
27pub use as_global::*;
28
29mod logging;
30pub use logging::*;
31
32#[cfg(all(not(target_os="dos"), windows))]
33mod winapi;
34
35#[cfg(all(not(target_os="dos"), not(windows)))]
36mod posix;
37
38#[cfg(not(target_os="dos"))]
39mod system;
40
41#[cfg(not(target_os="dos"))]
42pub use system::*;
43
44mod impossible;
45pub use impossible::*;
46
47mod non_working;
48pub use non_working::*;
49
50pub mod stacked;
51
52pub mod freelist;
53
54#[doc(hidden)]
55pub use core::alloc::Layout as std_alloc_Layout;
56#[doc(hidden)]
57pub use core::mem::MaybeUninit as std_mem_MaybeUninit;
58#[doc(hidden)]
59pub use core::ptr::addr_of_mut as std_ptr_addr_of_mut;
60
61#[macro_export]
62macro_rules! freelist_allocator_128_KiB_align_8 {
63    ($name:ident : $ty:ident) => {
64        const MEM_SIZE: usize = 131072;
65
66        static mut MEM: [$crate::std_mem_MaybeUninit<u8>; MEM_SIZE] =
67            [$crate::std_mem_MaybeUninit::uninit(); MEM_SIZE]
68        ;
69
70        static STACKED: $crate::stacked::Stacked =
71            $crate::stacked::Stacked::from_static_array(unsafe { &mut *$crate::std_ptr_addr_of_mut!(MEM) })
72        ;
73
74        type $ty = $crate::fallbacked::Fallbacked<$crate::limited_up_to::LimitedUpTo<
75            $crate::freelist::Freelist<$crate::freelist::NoLimit, &'static $crate::stacked::Stacked>
76        >, &'static Freelist16B>;
77
78        static $name: $ty = $crate::fallbacked::Fallbacked(
79            $crate::limited_up_to::LimitedUpTo::new(
80                unsafe { $crate::std_alloc_Layout::from_size_align_unchecked(8, 8) },
81                $crate::freelist::Freelist::new(
82                    unsafe { $crate::std_alloc_Layout::from_size_align_unchecked(8, 8) },
83                    unsafe { $crate::std_alloc_Layout::from_size_align_unchecked(1, 1) },
84                    $crate::freelist::NoLimit,
85                    &STACKED
86                )
87            ),
88            &FREELIST_16_B
89        );
90
91        type Freelist16B = $crate::fallbacked::Fallbacked<$crate::limited_up_to::LimitedUpTo<
92            $crate::freelist::Freelist<$crate::freelist::NoLimit, &'static $crate::stacked::Stacked>
93        >, &'static Freelist32B>;
94
95        static FREELIST_16_B: Freelist16B = $crate::fallbacked::Fallbacked(
96            $crate::limited_up_to::LimitedUpTo::new(
97                unsafe { $crate::std_alloc_Layout::from_size_align_unchecked(16, 8) },
98                $crate::freelist::Freelist::new(
99                    unsafe { $crate::std_alloc_Layout::from_size_align_unchecked(16, 8) },
100                    unsafe { $crate::std_alloc_Layout::from_size_align_unchecked(9, 1) },
101                    $crate::freelist::NoLimit,
102                    &STACKED
103                )
104            ),
105            &FREELIST_32_B
106        );
107
108        type Freelist32B = $crate::fallbacked::Fallbacked<$crate::limited_up_to::LimitedUpTo<
109            $crate::freelist::Freelist<$crate::freelist::NoLimit, &'static $crate::stacked::Stacked>
110        >, &'static Freelist64B>;
111
112        static FREELIST_32_B: Freelist32B = $crate::fallbacked::Fallbacked(
113            $crate::limited_up_to::LimitedUpTo::new(
114                unsafe { $crate::std_alloc_Layout::from_size_align_unchecked(32, 8) },
115                $crate::freelist::Freelist::new(
116                    unsafe { $crate::std_alloc_Layout::from_size_align_unchecked(32, 8) },
117                    unsafe { $crate::std_alloc_Layout::from_size_align_unchecked(17, 1) },
118                    $crate::freelist::NoLimit,
119                    &STACKED
120                )
121            ),
122            &FREELIST_64_B
123        );
124
125        type Freelist64B = $crate::fallbacked::Fallbacked<$crate::limited_up_to::LimitedUpTo<
126            $crate::freelist::Freelist<$crate::freelist::NoLimit, &'static $crate::stacked::Stacked>
127        >, &'static Freelist128B>;
128
129        static FREELIST_64_B: Freelist64B = $crate::fallbacked::Fallbacked(
130            $crate::limited_up_to::LimitedUpTo::new(
131                unsafe { $crate::std_alloc_Layout::from_size_align_unchecked(64, 8) },
132                $crate::freelist::Freelist::new(
133                    unsafe { $crate::std_alloc_Layout::from_size_align_unchecked(64, 8) },
134                    unsafe { $crate::std_alloc_Layout::from_size_align_unchecked(33, 1) },
135                    $crate::freelist::NoLimit,
136                    &STACKED
137                )
138            ),
139            &FREELIST_128_B
140        );
141
142        type Freelist128B = $crate::fallbacked::Fallbacked<$crate::limited_up_to::LimitedUpTo<
143            $crate::freelist::Freelist<$crate::freelist::NoLimit, &'static $crate::stacked::Stacked>
144        >, &'static Freelist256B>;
145
146        static FREELIST_128_B: Freelist128B = $crate::fallbacked::Fallbacked(
147            $crate::limited_up_to::LimitedUpTo::new(
148                unsafe { $crate::std_alloc_Layout::from_size_align_unchecked(128, 8) },
149                $crate::freelist::Freelist::new(
150                    unsafe { $crate::std_alloc_Layout::from_size_align_unchecked(128, 8) },
151                    unsafe { $crate::std_alloc_Layout::from_size_align_unchecked(65, 1) },
152                    $crate::freelist::NoLimit,
153                    &STACKED
154                )
155            ),
156            &FREELIST_256_B
157        );
158
159        type Freelist256B = $crate::fallbacked::Fallbacked<$crate::limited_up_to::LimitedUpTo<
160            $crate::freelist::Freelist<$crate::freelist::NoLimit, &'static $crate::stacked::Stacked>
161        >, &'static Freelist512B>;
162
163        static FREELIST_256_B: Freelist256B = $crate::fallbacked::Fallbacked(
164            $crate::limited_up_to::LimitedUpTo::new(
165                unsafe { $crate::std_alloc_Layout::from_size_align_unchecked(256, 8) },
166                $crate::freelist::Freelist::new(
167                    unsafe { $crate::std_alloc_Layout::from_size_align_unchecked(256, 8) },
168                    unsafe { $crate::std_alloc_Layout::from_size_align_unchecked(129, 1) },
169                    $crate::freelist::NoLimit,
170                    &STACKED
171                )
172            ),
173            &FREELIST_512_B
174        );
175
176        type Freelist512B = $crate::fallbacked::Fallbacked<$crate::limited_up_to::LimitedUpTo<
177            $crate::freelist::Freelist<$crate::freelist::NoLimit, &'static $crate::stacked::Stacked>
178        >, &'static Freelist1KiB>;
179
180        static FREELIST_512_B: Freelist512B = $crate::fallbacked::Fallbacked(
181            $crate::limited_up_to::LimitedUpTo::new(
182                unsafe { $crate::std_alloc_Layout::from_size_align_unchecked(512, 8) },
183                $crate::freelist::Freelist::new(
184                    unsafe { $crate::std_alloc_Layout::from_size_align_unchecked(512, 8) },
185                    unsafe { $crate::std_alloc_Layout::from_size_align_unchecked(257, 1) },
186                    $crate::freelist::NoLimit,
187                    &STACKED
188                )
189            ),
190            &FREELIST_1_KIB
191        );
192
193        type Freelist1KiB = $crate::fallbacked::Fallbacked<$crate::limited_up_to::LimitedUpTo<
194            $crate::freelist::Freelist<$crate::freelist::NoLimit, &'static $crate::stacked::Stacked>
195        >, &'static Freelist2KiB>;
196
197        static FREELIST_1_KIB: Freelist1KiB = $crate::fallbacked::Fallbacked(
198            $crate::limited_up_to::LimitedUpTo::new(
199                unsafe { $crate::std_alloc_Layout::from_size_align_unchecked(1024, 8) },
200                $crate::freelist::Freelist::new(
201                    unsafe { $crate::std_alloc_Layout::from_size_align_unchecked(1024, 8) },
202                    unsafe { $crate::std_alloc_Layout::from_size_align_unchecked(513, 1) },
203                    $crate::freelist::NoLimit,
204                    &STACKED
205                )
206            ),
207            &FREELIST_2_KIB
208        );
209
210        type Freelist2KiB = $crate::fallbacked::Fallbacked<$crate::limited_up_to::LimitedUpTo<
211            $crate::freelist::Freelist<$crate::freelist::NoLimit, &'static $crate::stacked::Stacked>
212        >, &'static Freelist4KiB>;
213
214        static FREELIST_2_KIB: Freelist2KiB = $crate::fallbacked::Fallbacked(
215            $crate::limited_up_to::LimitedUpTo::new(
216                unsafe { $crate::std_alloc_Layout::from_size_align_unchecked(2048, 8) },
217                $crate::freelist::Freelist::new(
218                    unsafe { $crate::std_alloc_Layout::from_size_align_unchecked(2048, 8) },
219                    unsafe { $crate::std_alloc_Layout::from_size_align_unchecked(1025, 1) },
220                    $crate::freelist::NoLimit,
221                    &STACKED
222                )
223            ),
224            &FREELIST_4_KIB
225        );
226
227        type Freelist4KiB = $crate::fallbacked::Fallbacked<$crate::limited_up_to::LimitedUpTo<
228            $crate::freelist::Freelist<$crate::freelist::NoLimit, &'static $crate::stacked::Stacked>
229        >, &'static Freelist8KiB>;
230
231        static FREELIST_4_KIB: Freelist4KiB = $crate::fallbacked::Fallbacked(
232            $crate::limited_up_to::LimitedUpTo::new(
233                unsafe { $crate::std_alloc_Layout::from_size_align_unchecked(4096, 8) },
234                $crate::freelist::Freelist::new(
235                    unsafe { $crate::std_alloc_Layout::from_size_align_unchecked(4096, 8) },
236                    unsafe { $crate::std_alloc_Layout::from_size_align_unchecked(2049, 1) },
237                    $crate::freelist::NoLimit,
238                    &STACKED
239                )
240            ),
241            &FREELIST_8_KIB
242        );
243
244        type Freelist8KiB = $crate::fallbacked::Fallbacked<$crate::limited_up_to::LimitedUpTo<
245            $crate::freelist::Freelist<$crate::freelist::NoLimit, &'static $crate::stacked::Stacked>
246        >, &'static Freelist16KiB>;
247
248        static FREELIST_8_KIB: Freelist8KiB = $crate::fallbacked::Fallbacked(
249            $crate::limited_up_to::LimitedUpTo::new(
250                unsafe { $crate::std_alloc_Layout::from_size_align_unchecked(8192, 8) },
251                $crate::freelist::Freelist::new(
252                    unsafe { $crate::std_alloc_Layout::from_size_align_unchecked(8192, 8) },
253                    unsafe { $crate::std_alloc_Layout::from_size_align_unchecked(4097, 1) },
254                    $crate::freelist::NoLimit,
255                    &STACKED
256                )
257            ),
258            &FREELIST_16_KIB
259        );
260
261        type Freelist16KiB = $crate::fallbacked::Fallbacked<$crate::limited_up_to::LimitedUpTo<
262            $crate::freelist::Freelist<$crate::freelist::NoLimit, &'static $crate::stacked::Stacked>
263        >, &'static Freelist32KiB>;
264
265        static FREELIST_16_KIB: Freelist16KiB = $crate::fallbacked::Fallbacked(
266            $crate::limited_up_to::LimitedUpTo::new(
267                unsafe { $crate::std_alloc_Layout::from_size_align_unchecked(16384, 8) },
268                $crate::freelist::Freelist::new(
269                    unsafe { $crate::std_alloc_Layout::from_size_align_unchecked(16384, 8) },
270                    unsafe { $crate::std_alloc_Layout::from_size_align_unchecked(8193, 1) },
271                    $crate::freelist::NoLimit,
272                    &STACKED
273                )
274            ),
275            &FREELIST_32_KIB
276        );
277    
278        type Freelist32KiB = $crate::fallbacked::Fallbacked<$crate::limited_up_to::LimitedUpTo<
279            $crate::freelist::Freelist<$crate::freelist::NoLimit, &'static $crate::stacked::Stacked>
280        >, &'static Freelist64KiB>;
281
282        static FREELIST_32_KIB: Freelist32KiB = $crate::fallbacked::Fallbacked(
283            $crate::limited_up_to::LimitedUpTo::new(
284                unsafe { $crate::std_alloc_Layout::from_size_align_unchecked(32768, 8) },
285                $crate::freelist::Freelist::new(
286                    unsafe { $crate::std_alloc_Layout::from_size_align_unchecked(32768, 8) },
287                    unsafe { $crate::std_alloc_Layout::from_size_align_unchecked(16385, 1) },
288                    $crate::freelist::NoLimit,
289                    &STACKED
290                )
291            ),
292            &FREELIST_64_KIB
293        );
294
295        type Freelist64KiB = $crate::limited_up_to::LimitedUpTo<
296            $crate::freelist::Freelist<$crate::freelist::NoLimit, &'static $crate::stacked::Stacked>
297        >;
298
299        static FREELIST_64_KIB: Freelist64KiB = $crate::limited_up_to::LimitedUpTo::new(
300            unsafe { $crate::std_alloc_Layout::from_size_align_unchecked(65536, 8) },
301            $crate::freelist::Freelist::new(
302                unsafe { $crate::std_alloc_Layout::from_size_align_unchecked(65536, 8) },
303                unsafe { $crate::std_alloc_Layout::from_size_align_unchecked(32769, 1) },
304                $crate::freelist::NoLimit,
305                &STACKED
306            )
307        );
308    };
309}
310
311#[macro_export]
312macro_rules! global_freelist_allocator_128_KiB_align_8 {
313    () => {
314        const MEM_SIZE: usize = 131072;
315
316        static mut MEM: [$crate::std_mem_MaybeUninit<u8>; MEM_SIZE] =
317            [$crate::std_mem_MaybeUninit::uninit(); MEM_SIZE]
318        ;
319
320        static STACKED: $crate::stacked::Stacked =
321            $crate::stacked::Stacked::from_static_array(unsafe { &mut *$crate::std_ptr_addr_of_mut!(MEM) })
322        ;
323
324        type Freelist8B = $crate::AsGlobal<$crate::fallbacked::Fallbacked<$crate::limited_up_to::LimitedUpTo<
325            $crate::freelist::Freelist<$crate::freelist::NoLimit, &'static $crate::stacked::Stacked>
326        >, &'static Freelist16B>>;
327
328        #[global_allocator]
329        static FREELIST_8_B: Freelist8B = $crate::AsGlobal($crate::fallbacked::Fallbacked(
330            $crate::limited_up_to::LimitedUpTo::new(
331                unsafe { $crate::std_alloc_Layout::from_size_align_unchecked(8, 8) },
332                $crate::freelist::Freelist::new(
333                    unsafe { $crate::std_alloc_Layout::from_size_align_unchecked(8, 8) },
334                    unsafe { $crate::std_alloc_Layout::from_size_align_unchecked(1, 1) },
335                    $crate::freelist::NoLimit,
336                    &STACKED
337                )
338            ),
339            &FREELIST_16_B
340        ));
341
342        type Freelist16B = $crate::fallbacked::Fallbacked<$crate::limited_up_to::LimitedUpTo<
343            $crate::freelist::Freelist<$crate::freelist::NoLimit, &'static $crate::stacked::Stacked>
344        >, &'static Freelist32B>;
345
346        static FREELIST_16_B: Freelist16B = $crate::fallbacked::Fallbacked(
347            $crate::limited_up_to::LimitedUpTo::new(
348                unsafe { $crate::std_alloc_Layout::from_size_align_unchecked(16, 8) },
349                $crate::freelist::Freelist::new(
350                    unsafe { $crate::std_alloc_Layout::from_size_align_unchecked(16, 8) },
351                    unsafe { $crate::std_alloc_Layout::from_size_align_unchecked(9, 1) },
352                    $crate::freelist::NoLimit,
353                    &STACKED
354                )
355            ),
356            &FREELIST_32_B
357        );
358
359        type Freelist32B = $crate::fallbacked::Fallbacked<$crate::limited_up_to::LimitedUpTo<
360            $crate::freelist::Freelist<$crate::freelist::NoLimit, &'static $crate::stacked::Stacked>
361        >, &'static Freelist64B>;
362
363        static FREELIST_32_B: Freelist32B = $crate::fallbacked::Fallbacked(
364            $crate::limited_up_to::LimitedUpTo::new(
365                unsafe { $crate::std_alloc_Layout::from_size_align_unchecked(32, 8) },
366                $crate::freelist::Freelist::new(
367                    unsafe { $crate::std_alloc_Layout::from_size_align_unchecked(32, 8) },
368                    unsafe { $crate::std_alloc_Layout::from_size_align_unchecked(17, 1) },
369                    $crate::freelist::NoLimit,
370                    &STACKED
371                )
372            ),
373            &FREELIST_64_B
374        );
375
376        type Freelist64B = $crate::fallbacked::Fallbacked<$crate::limited_up_to::LimitedUpTo<
377            $crate::freelist::Freelist<$crate::freelist::NoLimit, &'static $crate::stacked::Stacked>
378        >, &'static Freelist128B>;
379
380        static FREELIST_64_B: Freelist64B = $crate::fallbacked::Fallbacked(
381            $crate::limited_up_to::LimitedUpTo::new(
382                unsafe { $crate::std_alloc_Layout::from_size_align_unchecked(64, 8) },
383                $crate::freelist::Freelist::new(
384                    unsafe { $crate::std_alloc_Layout::from_size_align_unchecked(64, 8) },
385                    unsafe { $crate::std_alloc_Layout::from_size_align_unchecked(33, 1) },
386                    $crate::freelist::NoLimit,
387                    &STACKED
388                )
389            ),
390            &FREELIST_128_B
391        );
392
393        type Freelist128B = $crate::fallbacked::Fallbacked<$crate::limited_up_to::LimitedUpTo<
394            $crate::freelist::Freelist<$crate::freelist::NoLimit, &'static $crate::stacked::Stacked>
395        >, &'static Freelist256B>;
396
397        static FREELIST_128_B: Freelist128B = $crate::fallbacked::Fallbacked(
398            $crate::limited_up_to::LimitedUpTo::new(
399                unsafe { $crate::std_alloc_Layout::from_size_align_unchecked(128, 8) },
400                $crate::freelist::Freelist::new(
401                    unsafe { $crate::std_alloc_Layout::from_size_align_unchecked(128, 8) },
402                    unsafe { $crate::std_alloc_Layout::from_size_align_unchecked(65, 1) },
403                    $crate::freelist::NoLimit,
404                    &STACKED
405                )
406            ),
407            &FREELIST_256_B
408        );
409
410        type Freelist256B = $crate::fallbacked::Fallbacked<$crate::limited_up_to::LimitedUpTo<
411            $crate::freelist::Freelist<$crate::freelist::NoLimit, &'static $crate::stacked::Stacked>
412        >, &'static Freelist512B>;
413
414        static FREELIST_256_B: Freelist256B = $crate::fallbacked::Fallbacked(
415            $crate::limited_up_to::LimitedUpTo::new(
416                unsafe { $crate::std_alloc_Layout::from_size_align_unchecked(256, 8) },
417                $crate::freelist::Freelist::new(
418                    unsafe { $crate::std_alloc_Layout::from_size_align_unchecked(256, 8) },
419                    unsafe { $crate::std_alloc_Layout::from_size_align_unchecked(129, 1) },
420                    $crate::freelist::NoLimit,
421                    &STACKED
422                )
423            ),
424            &FREELIST_512_B
425        );
426
427        type Freelist512B = $crate::fallbacked::Fallbacked<$crate::limited_up_to::LimitedUpTo<
428            $crate::freelist::Freelist<$crate::freelist::NoLimit, &'static $crate::stacked::Stacked>
429        >, &'static Freelist1KiB>;
430
431        static FREELIST_512_B: Freelist512B = $crate::fallbacked::Fallbacked(
432            $crate::limited_up_to::LimitedUpTo::new(
433                unsafe { $crate::std_alloc_Layout::from_size_align_unchecked(512, 8) },
434                $crate::freelist::Freelist::new(
435                    unsafe { $crate::std_alloc_Layout::from_size_align_unchecked(512, 8) },
436                    unsafe { $crate::std_alloc_Layout::from_size_align_unchecked(257, 1) },
437                    $crate::freelist::NoLimit,
438                    &STACKED
439                )
440            ),
441            &FREELIST_1_KIB
442        );
443
444        type Freelist1KiB = $crate::fallbacked::Fallbacked<$crate::limited_up_to::LimitedUpTo<
445            $crate::freelist::Freelist<$crate::freelist::NoLimit, &'static $crate::stacked::Stacked>
446        >, &'static Freelist2KiB>;
447
448        static FREELIST_1_KIB: Freelist1KiB = $crate::fallbacked::Fallbacked(
449            $crate::limited_up_to::LimitedUpTo::new(
450                unsafe { $crate::std_alloc_Layout::from_size_align_unchecked(1024, 8) },
451                $crate::freelist::Freelist::new(
452                    unsafe { $crate::std_alloc_Layout::from_size_align_unchecked(1024, 8) },
453                    unsafe { $crate::std_alloc_Layout::from_size_align_unchecked(513, 1) },
454                    $crate::freelist::NoLimit,
455                    &STACKED
456                )
457            ),
458            &FREELIST_2_KIB
459        );
460
461        type Freelist2KiB = $crate::fallbacked::Fallbacked<$crate::limited_up_to::LimitedUpTo<
462            $crate::freelist::Freelist<$crate::freelist::NoLimit, &'static $crate::stacked::Stacked>
463        >, &'static Freelist4KiB>;
464
465        static FREELIST_2_KIB: Freelist2KiB = $crate::fallbacked::Fallbacked(
466            $crate::limited_up_to::LimitedUpTo::new(
467                unsafe { $crate::std_alloc_Layout::from_size_align_unchecked(2048, 8) },
468                $crate::freelist::Freelist::new(
469                    unsafe { $crate::std_alloc_Layout::from_size_align_unchecked(2048, 8) },
470                    unsafe { $crate::std_alloc_Layout::from_size_align_unchecked(1025, 1) },
471                    $crate::freelist::NoLimit,
472                    &STACKED
473                )
474            ),
475            &FREELIST_4_KIB
476        );
477
478        type Freelist4KiB = $crate::fallbacked::Fallbacked<$crate::limited_up_to::LimitedUpTo<
479            $crate::freelist::Freelist<$crate::freelist::NoLimit, &'static $crate::stacked::Stacked>
480        >, &'static Freelist8KiB>;
481
482        static FREELIST_4_KIB: Freelist4KiB = $crate::fallbacked::Fallbacked(
483            $crate::limited_up_to::LimitedUpTo::new(
484                unsafe { $crate::std_alloc_Layout::from_size_align_unchecked(4096, 8) },
485                $crate::freelist::Freelist::new(
486                    unsafe { $crate::std_alloc_Layout::from_size_align_unchecked(4096, 8) },
487                    unsafe { $crate::std_alloc_Layout::from_size_align_unchecked(2049, 1) },
488                    $crate::freelist::NoLimit,
489                    &STACKED
490                )
491            ),
492            &FREELIST_8_KIB
493        );
494
495        type Freelist8KiB = $crate::fallbacked::Fallbacked<$crate::limited_up_to::LimitedUpTo<
496            $crate::freelist::Freelist<$crate::freelist::NoLimit, &'static $crate::stacked::Stacked>
497        >, &'static Freelist16KiB>;
498
499        static FREELIST_8_KIB: Freelist8KiB = $crate::fallbacked::Fallbacked(
500            $crate::limited_up_to::LimitedUpTo::new(
501                unsafe { $crate::std_alloc_Layout::from_size_align_unchecked(8192, 8) },
502                $crate::freelist::Freelist::new(
503                    unsafe { $crate::std_alloc_Layout::from_size_align_unchecked(8192, 8) },
504                    unsafe { $crate::std_alloc_Layout::from_size_align_unchecked(4097, 1) },
505                    $crate::freelist::NoLimit,
506                    &STACKED
507                )
508            ),
509            &FREELIST_16_KIB
510        );
511
512        type Freelist16KiB = $crate::fallbacked::Fallbacked<$crate::limited_up_to::LimitedUpTo<
513            $crate::freelist::Freelist<$crate::freelist::NoLimit, &'static $crate::stacked::Stacked>
514        >, &'static Freelist32KiB>;
515
516        static FREELIST_16_KIB: Freelist16KiB = $crate::fallbacked::Fallbacked(
517            $crate::limited_up_to::LimitedUpTo::new(
518                unsafe { $crate::std_alloc_Layout::from_size_align_unchecked(16384, 8) },
519                $crate::freelist::Freelist::new(
520                    unsafe { $crate::std_alloc_Layout::from_size_align_unchecked(16384, 8) },
521                    unsafe { $crate::std_alloc_Layout::from_size_align_unchecked(8193, 1) },
522                    $crate::freelist::NoLimit,
523                    &STACKED
524                )
525            ),
526            &FREELIST_32_KIB
527        );
528    
529        type Freelist32KiB = $crate::fallbacked::Fallbacked<$crate::limited_up_to::LimitedUpTo<
530            $crate::freelist::Freelist<$crate::freelist::NoLimit, &'static $crate::stacked::Stacked>
531        >, &'static Freelist64KiB>;
532
533        static FREELIST_32_KIB: Freelist32KiB = $crate::fallbacked::Fallbacked(
534            $crate::limited_up_to::LimitedUpTo::new(
535                unsafe { $crate::std_alloc_Layout::from_size_align_unchecked(32768, 8) },
536                $crate::freelist::Freelist::new(
537                    unsafe { $crate::std_alloc_Layout::from_size_align_unchecked(32768, 8) },
538                    unsafe { $crate::std_alloc_Layout::from_size_align_unchecked(16385, 1) },
539                    $crate::freelist::NoLimit,
540                    &STACKED
541                )
542            ),
543            &FREELIST_64_KIB
544        );
545
546        type Freelist64KiB = $crate::limited_up_to::LimitedUpTo<
547            $crate::freelist::Freelist<$crate::freelist::NoLimit, &'static $crate::stacked::Stacked>
548        >;
549
550        static FREELIST_64_KIB: Freelist64KiB = $crate::limited_up_to::LimitedUpTo::new(
551            unsafe { $crate::std_alloc_Layout::from_size_align_unchecked(65536, 8) },
552            $crate::freelist::Freelist::new(
553                unsafe { $crate::std_alloc_Layout::from_size_align_unchecked(65536, 8) },
554                unsafe { $crate::std_alloc_Layout::from_size_align_unchecked(32769, 1) },
555                $crate::freelist::NoLimit,
556                &STACKED
557            )
558        );
559    };
560}