Expand description
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).
§Dependencies
This crate requires a critical section implementation. Check critical-section.
§Example
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;
}
Macros§
- pool
- Create a item pool of a given type and size, as well as a waker pool of a given length.