use std::{
io,
sync::atomic::{AtomicU64, Ordering},
};
use compio::runtime::Runtime;
use compio_pool::{ManageConnection, Pool};
static OPENS: AtomicU64 = AtomicU64::new(0);
struct Resource {
#[allow(dead_code)]
id: u64,
}
struct Manager;
impl ManageConnection for Manager {
type Connection = Resource;
type Error = io::Error;
async fn connect(&self) -> io::Result<Resource> {
let id = OPENS.fetch_add(1, Ordering::Relaxed);
Ok(Resource { id })
}
async fn is_valid(&self, _conn: &mut Resource) -> io::Result<()> {
Ok(())
}
fn has_broken(&self, _conn: &mut Resource) -> bool {
false
}
}
fn opened() -> u64 {
OPENS.load(Ordering::Relaxed)
}
fn main() -> io::Result<()> {
let pool = Pool::builder().max_size(8).min_idle(4).build(Manager);
let runtime = Runtime::builder().build().expect("build compio runtime");
runtime.block_on(async move {
let local = pool.local();
println!("fresh pool: {:?} opened={}", local.state(), opened());
let made = local.warm().await.expect("warm");
println!(
"after warm: {:?} opened={} (warm made {made})",
local.state(),
opened()
);
let a = local.get().await.expect("get a");
let b = local.get().await.expect("get b");
let c = local.get().await.expect("get c");
println!("3 checked out: {:?} opened={}", local.state(), opened());
drop((a, b, c));
println!("3 returned: {:?} opened={}", local.state(), opened());
let mut held = Vec::new();
for _ in 0..8 {
held.push(local.get().await.expect("burst"));
}
println!("8 checked out: {:?} opened={}", local.state(), opened());
drop(held);
println!("8 returned: {:?} opened={}", local.state(), opened());
});
Ok(())
}