dynamic-pool
A lock-free, thread-safe, dynamically-sized object pool.
This pool begins with an initial capacity and will continue creating new objects on request when none are available.
pooled objects are returned to the pool on destruction (with an extra provision to optionally "reset" the state of
an object for re-use).
If, during an attempted return, a pool already has maximum_capacity
objects in the pool, the pool will throw away
that object.
Basic Usage
Add this to your Cargo.toml
:
[dependencies]
dynamic-pool = "0.1"
Next, do some pooling:
use dynamic_pool::{DynamicPool, DynamicReset};
#[derive(Default)]
struct Person {
name: String,
age: u16,
}
impl DynamicReset for Person {
fn reset(&mut self) {
self.name.clear();
self.age = 0;
}
}
fn main() {
let pool = DynamicPool::new(1, 10, Person::default);
assert_eq!(pool.available(), 1);
let mut person = pool.take();
person.name = "jake".into();
person.age = 99;
assert_eq!(pool.available(), 0);
drop(person);
assert_eq!(pool.available(), 1);
let person = pool.take();
assert_eq!(person.name, "");
assert_eq!(person.age, 0);
assert_eq!(pool.available(), 0);
assert!(pool.try_take().is_none());
drop(person);
assert_eq!(pool.available(), 1);
let person = pool.try_take().unwrap();
let person = person.detach();
drop(person);
assert_eq!(pool.available(), 0);
}
License
Licensed under the MIT license.