|
@@ -8,6 +8,7 @@ use btlib::{crypto::Creds, BlockPath, Result};
|
|
|
use btmsg::{receiver, MsgCallback, MsgReceived, Receiver};
|
|
|
use core::future::Future;
|
|
|
use std::{io::Read, net::IpAddr, sync::Arc};
|
|
|
+use swimmer::Pool;
|
|
|
|
|
|
pub trait FsProvider: Send + Sync {
|
|
|
type LookupFut<'c>: Send + Future<Output = Result<LookupReply>>
|
|
@@ -237,12 +238,22 @@ impl<P: FsProvider> FsProvider for &P {
|
|
|
}
|
|
|
|
|
|
struct ServerCallback<P> {
|
|
|
+ pool: Arc<Pool<Vec<u8>>>,
|
|
|
provider: Arc<P>,
|
|
|
}
|
|
|
|
|
|
impl<P> ServerCallback<P> {
|
|
|
+ const POOL_SZ: usize = 8;
|
|
|
+
|
|
|
fn new(provider: Arc<P>) -> Self {
|
|
|
- Self { provider }
|
|
|
+ let pool = swimmer::builder()
|
|
|
+ .with_starting_size(Self::POOL_SZ)
|
|
|
+ .with_supplier(|| Vec::with_capacity(btlib::SECTOR_SZ_DEFAULT))
|
|
|
+ .build();
|
|
|
+ Self {
|
|
|
+ provider,
|
|
|
+ pool: Arc::new(pool),
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -250,6 +261,7 @@ impl<P> Clone for ServerCallback<P> {
|
|
|
fn clone(&self) -> Self {
|
|
|
Self {
|
|
|
provider: self.provider.clone(),
|
|
|
+ pool: self.pool.clone(),
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -267,9 +279,7 @@ impl<P: 'static + Send + Sync + FsProvider> MsgCallback for ServerCallback<P> {
|
|
|
FsMsg::Open(open) => FsReply::Open(provider.open(&from, open).await?),
|
|
|
FsMsg::Read(read) => {
|
|
|
let buf = provider.read(&from, read, move |data| {
|
|
|
- // TODO: Avoid allocating a buffer on every read. If possible, avoid coping
|
|
|
- // data altogether.
|
|
|
- let mut buf = Vec::with_capacity(data.len());
|
|
|
+ let mut buf = self.pool.get();
|
|
|
buf.extend_from_slice(data);
|
|
|
buf
|
|
|
})?;
|