Statically allocated pool providing a std-like Box, allowing to asynchronously await for a pool slot to become available.
It is tailored to be used with no-std async runtimes, like Embassy, but can also be used in std environments (check examples).
The most common use-case is sharing large memory regions on constrained devices (e.g. microcontrollers), where multiple tasks may need to use the memory for buffering an I/O or performing calculations, and having separate static buffers would be too costly.
It is important to know that waiting forever for a memory slot to be available may dead-lock your code if done wrong. With that in mind, you should consider using a timeout when allocating asynchronously (e.g. embassy_time::with_timeout).
This crate requires a critical section implementation. Check critical-section.
use async_pool::{pool, Box};
struct Buffer([u8; 256]);
// A maximum of 2 Packet instances can be allocated at a time.
// A maximum of 3 futures can be waiting at a time.
pool!(BufferPool: [Buffer; 2], 3);
async fn run() {
// Allocate non-blocking (will return None if no data slot is available)
let box1 = Box::<BufferPool>::new(Buffer([0; 256]));
// Allocate asynchronously (will wait if no data slot is available)
// This can return None if all future slots are taken
let box2 = Box::<BufferPool>::new_async(Buffer([0; 256])).await;
}
This crate is heavily based on atomic-pool.
This work is licensed under either of
- Apache License, Version 2.0 (LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0)
- MIT license (LICENSE-MIT or http://opensource.org/licenses/MIT)
at your option.
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.