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