Remove futures from ex data slots once they resolve

This commit is contained in:
Anthony Ramine 2023-10-09 11:55:35 +02:00 committed by Alessandro Ghedini
parent 5f88374d7b
commit ea96015b66
1 changed files with 14 additions and 18 deletions

View File

@ -26,10 +26,10 @@ pub type ExDataFuture<T> = Pin<Box<dyn Future<Output = T> + Send + Sync>>;
pub(crate) static TASK_WAKER_INDEX: Lazy<Index<Ssl, Option<Waker>>> = pub(crate) static TASK_WAKER_INDEX: Lazy<Index<Ssl, Option<Waker>>> =
Lazy::new(|| Ssl::new_ex_index().unwrap()); Lazy::new(|| Ssl::new_ex_index().unwrap());
pub(crate) static SELECT_CERT_FUTURE_INDEX: Lazy<Index<Ssl, BoxSelectCertFuture>> = pub(crate) static SELECT_CERT_FUTURE_INDEX: Lazy<Index<Ssl, Option<BoxSelectCertFuture>>> =
Lazy::new(|| Ssl::new_ex_index().unwrap()); Lazy::new(|| Ssl::new_ex_index().unwrap());
pub(crate) static SELECT_PRIVATE_KEY_METHOD_FUTURE_INDEX: Lazy< pub(crate) static SELECT_PRIVATE_KEY_METHOD_FUTURE_INDEX: Lazy<
Index<Ssl, BoxPrivateKeyMethodFuture>, Index<Ssl, Option<BoxPrivateKeyMethodFuture>>,
> = Lazy::new(|| Ssl::new_ex_index().unwrap()); > = Lazy::new(|| Ssl::new_ex_index().unwrap());
/// Extensions to [`SslContextBuilder`]. /// Extensions to [`SslContextBuilder`].
@ -219,7 +219,7 @@ fn with_private_key_method(
/// created by `create_fut` returns `Poll::Ready(_)` on the first poll call. /// created by `create_fut` returns `Poll::Ready(_)` on the first poll call.
fn with_ex_data_future<H, T, E>( fn with_ex_data_future<H, T, E>(
ssl_handle: &mut H, ssl_handle: &mut H,
index: Index<ssl::Ssl, ExDataFuture<Result<T, E>>>, index: Index<ssl::Ssl, Option<ExDataFuture<Result<T, E>>>>,
get_ssl_mut: impl Fn(&mut H) -> &mut ssl::SslRef, get_ssl_mut: impl Fn(&mut H) -> &mut ssl::SslRef,
create_fut: impl FnOnce(&mut H) -> Result<ExDataFuture<Result<T, E>>, E>, create_fut: impl FnOnce(&mut H) -> Result<ExDataFuture<Result<T, E>>, E>,
) -> Poll<Result<T, E>> { ) -> Poll<Result<T, E>> {
@ -232,29 +232,25 @@ fn with_ex_data_future<H, T, E>(
let mut ctx = Context::from_waker(&waker); let mut ctx = Context::from_waker(&waker);
match ssl.ex_data_mut(index) { if let Some(data @ Some(_)) = ssl.ex_data_mut(index) {
Some(fut) => { let fut_result = ready!(data.as_mut().unwrap().as_mut().poll(&mut ctx));
let fut_result = ready!(fut.as_mut().poll(&mut ctx));
// NOTE(nox): For memory usage concerns, maybe we should implement *data = None;
// a way to remove the stored future from the `Ssl` value here?
Poll::Ready(fut_result) Poll::Ready(fut_result)
} } else {
None => {
let mut fut = create_fut(ssl_handle)?; let mut fut = create_fut(ssl_handle)?;
match fut.as_mut().poll(&mut ctx) { match fut.as_mut().poll(&mut ctx) {
Poll::Ready(fut_result) => Poll::Ready(fut_result), Poll::Ready(fut_result) => Poll::Ready(fut_result),
Poll::Pending => { Poll::Pending => {
get_ssl_mut(ssl_handle).set_ex_data(index, fut); get_ssl_mut(ssl_handle).set_ex_data(index, Some(fut));
Poll::Pending Poll::Pending
} }
} }
} }
} }
}
mod private { mod private {
pub trait Sealed {} pub trait Sealed {}