many fixes for bootstrap and public internet connectivity
This commit is contained in:
@@ -20,6 +20,96 @@ where
|
||||
}
|
||||
}
|
||||
|
||||
////////
|
||||
///
|
||||
|
||||
pub struct Peek<'a> {
|
||||
aps: AsyncPeekStream,
|
||||
buf: &'a mut [u8],
|
||||
}
|
||||
|
||||
impl Unpin for Peek<'_> {}
|
||||
|
||||
impl Future for Peek<'_> {
|
||||
type Output = std::io::Result<usize>;
|
||||
|
||||
fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
|
||||
let this = &mut *self;
|
||||
|
||||
let mut inner = this.aps.inner.lock();
|
||||
let inner = &mut *inner;
|
||||
//
|
||||
let buf_len = this.buf.len();
|
||||
let mut copy_len = buf_len;
|
||||
if buf_len > inner.peekbuf_len {
|
||||
//
|
||||
inner.peekbuf.resize(buf_len, 0u8);
|
||||
let mut read_future = inner
|
||||
.stream
|
||||
.read(&mut inner.peekbuf.as_mut_slice()[inner.peekbuf_len..buf_len]);
|
||||
let read_len = match Pin::new(&mut read_future).poll(cx) {
|
||||
Poll::Pending => {
|
||||
inner.peekbuf.resize(inner.peekbuf_len, 0u8);
|
||||
return Poll::Pending;
|
||||
}
|
||||
Poll::Ready(Err(e)) => {
|
||||
return Poll::Ready(Err(e));
|
||||
}
|
||||
Poll::Ready(Ok(v)) => v,
|
||||
};
|
||||
inner.peekbuf_len += read_len;
|
||||
inner.peekbuf.resize(inner.peekbuf_len, 0u8);
|
||||
copy_len = inner.peekbuf_len;
|
||||
}
|
||||
this.buf[..copy_len].copy_from_slice(&inner.peekbuf[..copy_len]);
|
||||
Poll::Ready(Ok(copy_len))
|
||||
}
|
||||
}
|
||||
|
||||
////////
|
||||
///
|
||||
|
||||
pub struct PeekExact<'a> {
|
||||
aps: AsyncPeekStream,
|
||||
buf: &'a mut [u8],
|
||||
}
|
||||
|
||||
impl Unpin for PeekExact<'_> {}
|
||||
|
||||
impl Future for PeekExact<'_> {
|
||||
type Output = std::io::Result<usize>;
|
||||
|
||||
fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
|
||||
let this = &mut *self;
|
||||
|
||||
let mut inner = this.aps.inner.lock();
|
||||
let inner = &mut *inner;
|
||||
//
|
||||
let buf_len = this.buf.len();
|
||||
let mut copy_len = buf_len;
|
||||
if buf_len > inner.peekbuf_len {
|
||||
//
|
||||
inner.peekbuf.resize(buf_len, 0u8);
|
||||
let mut read_future = inner
|
||||
.stream
|
||||
.read_exact(&mut inner.peekbuf.as_mut_slice()[inner.peekbuf_len..buf_len]);
|
||||
match Pin::new(&mut read_future).poll(cx) {
|
||||
Poll::Pending => {
|
||||
inner.peekbuf.resize(inner.peekbuf_len, 0u8);
|
||||
return Poll::Pending;
|
||||
}
|
||||
Poll::Ready(Err(e)) => {
|
||||
return Poll::Ready(Err(e));
|
||||
}
|
||||
Poll::Ready(Ok(())) => (),
|
||||
};
|
||||
inner.peekbuf_len = buf_len;
|
||||
copy_len = inner.peekbuf_len;
|
||||
}
|
||||
this.buf[..copy_len].copy_from_slice(&inner.peekbuf[..copy_len]);
|
||||
Poll::Ready(Ok(copy_len))
|
||||
}
|
||||
}
|
||||
/////////
|
||||
///
|
||||
struct AsyncPeekStreamInner {
|
||||
@@ -50,60 +140,18 @@ impl AsyncPeekStream {
|
||||
}
|
||||
}
|
||||
|
||||
pub async fn peek(&'_ self, buf: &'_ mut [u8]) -> Result<usize> {
|
||||
let (mut stream, mut peekbuf, mut peekbuf_len) = {
|
||||
let inner = self.inner.lock();
|
||||
(
|
||||
inner.stream.clone_stream(),
|
||||
inner.peekbuf.clone(),
|
||||
inner.peekbuf_len,
|
||||
)
|
||||
};
|
||||
//
|
||||
let buf_len = buf.len();
|
||||
let mut copy_len = buf_len;
|
||||
if buf_len > peekbuf_len {
|
||||
//
|
||||
peekbuf.resize(buf_len, 0u8);
|
||||
let read_len = stream
|
||||
.read(&mut peekbuf.as_mut_slice()[peekbuf_len..buf_len])
|
||||
.await?;
|
||||
peekbuf_len += read_len;
|
||||
copy_len = peekbuf_len;
|
||||
pub fn peek<'a>(&'a self, buf: &'a mut [u8]) -> Peek<'a> {
|
||||
Peek::<'a> {
|
||||
aps: self.clone(),
|
||||
buf,
|
||||
}
|
||||
buf[..copy_len].copy_from_slice(&peekbuf[..copy_len]);
|
||||
|
||||
let mut inner = self.inner.lock();
|
||||
inner.peekbuf = peekbuf;
|
||||
inner.peekbuf_len = peekbuf_len;
|
||||
Ok(copy_len)
|
||||
}
|
||||
|
||||
pub async fn peek_exact(&'_ self, buf: &'_ mut [u8]) -> Result<()> {
|
||||
let (mut stream, mut peekbuf, mut peekbuf_len) = {
|
||||
let inner = self.inner.lock();
|
||||
(
|
||||
inner.stream.clone_stream(),
|
||||
inner.peekbuf.clone(),
|
||||
inner.peekbuf_len,
|
||||
)
|
||||
};
|
||||
//
|
||||
let buf_len = buf.len();
|
||||
if buf_len > peekbuf_len {
|
||||
//
|
||||
peekbuf.resize(buf_len, 0u8);
|
||||
stream
|
||||
.read_exact(&mut peekbuf.as_mut_slice()[peekbuf_len..buf_len])
|
||||
.await?;
|
||||
peekbuf_len = buf_len;
|
||||
pub fn peek_exact<'a>(&'a self, buf: &'a mut [u8]) -> PeekExact<'a> {
|
||||
PeekExact::<'a> {
|
||||
aps: self.clone(),
|
||||
buf,
|
||||
}
|
||||
buf.copy_from_slice(&peekbuf[..buf_len]);
|
||||
|
||||
let mut inner = self.inner.lock();
|
||||
inner.peekbuf = peekbuf;
|
||||
inner.peekbuf_len = peekbuf_len;
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -62,7 +62,7 @@ pub struct EventualValueFuture<T: Unpin> {
|
||||
}
|
||||
|
||||
impl<T: Unpin> Future for EventualValueFuture<T> {
|
||||
type Output = ();
|
||||
type Output = EventualValue<T>;
|
||||
fn poll(mut self: Pin<&mut Self>, cx: &mut task::Context<'_>) -> task::Poll<Self::Output> {
|
||||
let this = &mut *self;
|
||||
let out = {
|
||||
@@ -76,7 +76,7 @@ impl<T: Unpin> Future for EventualValueFuture<T> {
|
||||
for w in wakers {
|
||||
w.wake();
|
||||
}
|
||||
task::Poll::<Self::Output>::Ready(())
|
||||
task::Poll::<Self::Output>::Ready(this.eventual.clone())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -97,6 +97,14 @@ macro_rules! log_rtab {
|
||||
(warn $fmt:literal, $($arg:expr),+) => {
|
||||
warn!(target:"rtab", $fmt, $($arg),+);
|
||||
};
|
||||
(debug $text:expr) => { debug!(
|
||||
target: "rtab",
|
||||
"{}",
|
||||
$text,
|
||||
)};
|
||||
(debug $fmt:literal, $($arg:expr),+) => {
|
||||
debug!(target:"rtab", $fmt, $($arg),+);
|
||||
};
|
||||
($text:expr) => {trace!(
|
||||
target: "rtab",
|
||||
"{}",
|
||||
@@ -230,7 +238,7 @@ macro_rules! logthru {
|
||||
(error $target:literal) => (|e__| {
|
||||
error!(
|
||||
target: $target,
|
||||
"[{}]",
|
||||
"[{:?}]",
|
||||
e__,
|
||||
);
|
||||
e__
|
||||
@@ -238,7 +246,7 @@ macro_rules! logthru {
|
||||
(error $target:literal, $text:literal) => (|e__| {
|
||||
error!(
|
||||
target: $target,
|
||||
"[{}] {}",
|
||||
"[{:?}] {}",
|
||||
e__,
|
||||
$text
|
||||
);
|
||||
@@ -247,7 +255,7 @@ macro_rules! logthru {
|
||||
(error $target:literal, $fmt:literal, $($arg:expr),+) => (|e__| {
|
||||
error!(
|
||||
target: $target,
|
||||
concat!("[{}] ", $fmt),
|
||||
concat!("[{:?}] ", $fmt),
|
||||
e__,
|
||||
$($arg),+
|
||||
);
|
||||
@@ -257,7 +265,7 @@ macro_rules! logthru {
|
||||
(warn $target:literal) => (|e__| {
|
||||
warn!(
|
||||
target: $target,
|
||||
"[{}]",
|
||||
"[{:?}]",
|
||||
e__,
|
||||
);
|
||||
e__
|
||||
@@ -265,7 +273,7 @@ macro_rules! logthru {
|
||||
(warn $target:literal, $text:literal) => (|e__| {
|
||||
warn!(
|
||||
target: $target,
|
||||
"[{}] {}",
|
||||
"[{:?}] {}",
|
||||
e__,
|
||||
$text
|
||||
);
|
||||
@@ -274,7 +282,7 @@ macro_rules! logthru {
|
||||
(warn $target:literal, $fmt:literal, $($arg:expr),+) => (|e__| {
|
||||
warn!(
|
||||
target: $target,
|
||||
concat!("[{}] ", $fmt),
|
||||
concat!("[{:?}] ", $fmt),
|
||||
e__,
|
||||
$($arg),+
|
||||
);
|
||||
@@ -284,7 +292,7 @@ macro_rules! logthru {
|
||||
(debug $target:literal) => (|e__| {
|
||||
debug!(
|
||||
target: $target,
|
||||
"[{}]",
|
||||
"[{:?}]",
|
||||
e__,
|
||||
);
|
||||
e__
|
||||
@@ -292,7 +300,7 @@ macro_rules! logthru {
|
||||
(debug $target:literal, $text:literal) => (|e__| {
|
||||
debug!(
|
||||
target: $target,
|
||||
"[{}] {}",
|
||||
"[{:?}] {}",
|
||||
e__,
|
||||
$text
|
||||
);
|
||||
@@ -301,7 +309,7 @@ macro_rules! logthru {
|
||||
(debug $target:literal, $fmt:literal, $($arg:expr),+) => (|e__| {
|
||||
debug!(
|
||||
target: $target,
|
||||
concat!("[{}] ", $fmt),
|
||||
concat!("[{:?}] ", $fmt),
|
||||
e__,
|
||||
$($arg),+
|
||||
);
|
||||
@@ -311,7 +319,7 @@ macro_rules! logthru {
|
||||
($target:literal) => (|e__| {
|
||||
trace!(
|
||||
target: $target,
|
||||
"[{}]",
|
||||
"[{:?}]",
|
||||
e__,
|
||||
);
|
||||
e__
|
||||
@@ -319,7 +327,7 @@ macro_rules! logthru {
|
||||
($target:literal, $text:literal) => (|e__| {
|
||||
trace!(
|
||||
target: $target,
|
||||
"[{}] {}",
|
||||
"[{:?}] {}",
|
||||
e__,
|
||||
$text
|
||||
);
|
||||
@@ -328,7 +336,7 @@ macro_rules! logthru {
|
||||
($target:literal, $fmt:literal, $($arg:expr),+) => (|e__| {
|
||||
trace!(
|
||||
target: $target,
|
||||
concat!("[{}] ", $fmt),
|
||||
concat!("[{:?}] ", $fmt),
|
||||
e__,
|
||||
$($arg),+
|
||||
);
|
||||
|
@@ -2,38 +2,43 @@ use super::*;
|
||||
|
||||
pub struct SingleShotEventual<T>
|
||||
where
|
||||
T: Unpin + Clone,
|
||||
T: Unpin,
|
||||
{
|
||||
eventual: EventualValueClone<T>,
|
||||
drop_value: T,
|
||||
eventual: EventualValue<T>,
|
||||
drop_value: Option<T>,
|
||||
}
|
||||
|
||||
impl<T> Drop for SingleShotEventual<T>
|
||||
where
|
||||
T: Unpin + Clone,
|
||||
T: Unpin,
|
||||
{
|
||||
fn drop(&mut self) {
|
||||
self.eventual.resolve(self.drop_value.clone());
|
||||
if let Some(drop_value) = self.drop_value.take() {
|
||||
self.eventual.resolve(drop_value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<T> SingleShotEventual<T>
|
||||
where
|
||||
T: Unpin + Clone,
|
||||
T: Unpin,
|
||||
{
|
||||
pub fn new(drop_value: T) -> Self {
|
||||
pub fn new(drop_value: Option<T>) -> Self {
|
||||
Self {
|
||||
eventual: EventualValueClone::new(),
|
||||
eventual: EventualValue::new(),
|
||||
drop_value,
|
||||
}
|
||||
}
|
||||
|
||||
// Can only call this once, it consumes the eventual
|
||||
pub fn resolve(self, value: T) -> EventualResolvedFuture<EventualValueClone<T>> {
|
||||
pub fn resolve(mut self, value: T) -> EventualResolvedFuture<EventualValue<T>> {
|
||||
// If we resolve, we don't want to resolve again to the drop value
|
||||
self.drop_value = None;
|
||||
// Resolve to the specified value
|
||||
self.eventual.resolve(value)
|
||||
}
|
||||
|
||||
pub fn instance(&self) -> EventualValueCloneFuture<T> {
|
||||
pub fn instance(&self) -> EventualValueFuture<T> {
|
||||
self.eventual.instance()
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user