1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
//! General purpose global allocator(s) with static, inline storage. //! //! Provides an allocator for extremely resource constrained environments where the only memory //! guaranteed is your program's image in memory as provided by the loader. Possible use cases are //! OS-less development, embedded, bootloaders (even stage0/1 maybe, totally untested). //! //! ## Usage //! //! ```rust //! use static_alloc::Bump; //! //! #[global_allocator] //! static A: Bump<[u8; 1 << 16]> = Bump::uninit(); //! //! fn main() { //! let v = vec![0xdeadbeef_u32; 128]; //! println!("{:x?}", v); //! //! let buffer: &'static mut [u32; 128] = A.leak([0; 128]) //! .unwrap_or_else(|_| panic!("Runtime allocated before main")); //! } //! ``` //! //! ## Why the name? //! //! This crates makes it safe to define a *static* object and to then use its memory to *allocate* //! dynamic values without accidentally exposing or using uninitialized memory. This allows //! obtaining `&'static mut T` instances which is handy if a struct requires a mutable reference //! but it is also required that this struct has `'static` lifetime bounds itself. // Copyright 2019 Andreas Molzer #![no_std] #![deny(missing_docs)] #[cfg(feature = "alloc")] extern crate alloc; pub mod bump; pub use bump::Bump; pub mod leaked; /// An unsynchronized allocator. pub mod unsync; // Can't use the macro-call itself within the `doc` attribute. So force it to eval it as part of // the macro invocation. // // The inspiration for the macro and implementation is from // <https://github.com/GuillaumeGomez/doc-comment> // // MIT License // // Copyright (c) 2018 Guillaume Gomez macro_rules! insert_as_doc { { $content:expr } => { #[doc = $content] extern { } } } // Provides the README.md as doc, to ensure the example works! insert_as_doc!(include_str!("../Readme.md"));