[−][src]Crate bumpalo_herd
The Bumpalo Herd
The bumpalo
library let's one use a bump allocator, an interesting and fast strategy to
allocate a lot of small objects. Additionally, it helps solve some of Rust lifetime issues.
Nevertheless, it is not Sync
, which makes it hard to use in many situations ‒ like in
[rayon
] iterators or scoped threads.
This library extends bumpalo
with the Herd
type. It represents a group of the Bump
allocators. Each thread then can get its own instance to allocate from. Unlike just creating
one for each thread the convenient way, the allocated memory can survive past the
thread/iterator termination, because the lifetime is tied to the Herd
itself (the Bump
is rescued from the thread behind the scenes).
Examples
We use the bump allocation inside a [rayon
] iterator. The map_init
allows us to grab an
arena and use it in each invocation cheaply, but unlike Bump::new
allocated one, the memory
is usable after the iterator run to its termination.
// Bunch of Bump instances that can be borrowed let mut herd = Herd::new(); let ints: Vec<&mut usize> = (0usize..1_000) .into_par_iter() .map_init(|| herd.get(), |bump, i| { // We have an allocator here we can play with. // The computation would be something bigger, sure. bump.alloc(i) }) .collect(); // Available here even though the iterator has already ended. dbg!(ints); // Deallocate the memory herd.reset(); // Won't work any more, memory gone // (don't worry, Rust won't let us) // dbg!(ints);
Similar thing can be done with scoped threads from [crossbeam_utils
]. If we got our
allocator through Bump::new
, we wouldn't be allowed to use the results in the other thread.
let herd = Herd::new(); let (sender, receiver) = mpsc::sync_channel(10); // Scoped threads from crossbeam_utils. // Producer and consumer, can send data from one to another. // The data lives long enough. thread::scope(|s| { s.spawn(|_| { let bump = herd.get(); let s = bump.alloc_str("Hello"); sender.send(s).unwrap(); drop(sender); // Close the channel. }); s.spawn(|_| { for s in receiver { dbg!(s); } }); }).unwrap();
Structs
Herd | A group of |
Member | A proxy for a |