massive network refactor
This commit is contained in:
@@ -8,6 +8,7 @@ mod eventual_value_clone;
|
||||
mod ip_addr_port;
|
||||
mod ip_extra;
|
||||
mod log_thru;
|
||||
mod mutable_future;
|
||||
mod single_future;
|
||||
mod single_shot_eventual;
|
||||
mod split_url;
|
||||
@@ -104,6 +105,7 @@ pub use eventual_value::*;
|
||||
pub use eventual_value_clone::*;
|
||||
pub use ip_addr_port::*;
|
||||
pub use ip_extra::*;
|
||||
pub use mutable_future::*;
|
||||
pub use single_future::*;
|
||||
pub use single_shot_eventual::*;
|
||||
pub use tick_task::*;
|
||||
|
||||
33
veilid-core/src/xx/mutable_future.rs
Normal file
33
veilid-core/src/xx/mutable_future.rs
Normal file
@@ -0,0 +1,33 @@
|
||||
use super::*;
|
||||
|
||||
pub struct MutableFuture<O, T: Future<Output = O>> {
|
||||
inner: Arc<Mutex<Pin<Box<T>>>>,
|
||||
}
|
||||
|
||||
impl<O, T: Future<Output = O>> MutableFuture<O, T> {
|
||||
pub fn new(inner: T) -> Self {
|
||||
Self {
|
||||
inner: Arc::new(Mutex::new(Box::pin(inner))),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn set(&self, inner: T) {
|
||||
*self.inner.lock() = Box::pin(inner);
|
||||
}
|
||||
}
|
||||
|
||||
impl<O, T: Future<Output = O>> Clone for MutableFuture<O, T> {
|
||||
fn clone(&self) -> Self {
|
||||
Self {
|
||||
inner: self.inner.clone(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<O, T: Future<Output = O>> Future for MutableFuture<O, T> {
|
||||
type Output = O;
|
||||
fn poll(self: Pin<&mut Self>, cx: &mut task::Context<'_>) -> task::Poll<Self::Output> {
|
||||
let mut inner = self.inner.lock();
|
||||
T::poll(inner.as_mut(), cx)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user