WIP
This commit is contained in:
@@ -103,7 +103,6 @@ where
|
|||||||
{
|
{
|
||||||
Ongoing(F),
|
Ongoing(F),
|
||||||
Ready(<F as Future>::Output),
|
Ready(<F as Future>::Output),
|
||||||
Taken,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<F> Fst<F>
|
impl<F> Fst<F>
|
||||||
@@ -111,17 +110,6 @@ where
|
|||||||
F: Future + Unpin,
|
F: Future + Unpin,
|
||||||
<F as Future>::Output: Unpin,
|
<F as Future>::Output: Unpin,
|
||||||
{
|
{
|
||||||
fn take_if_ready(&mut self) -> Poll<Option<<F as Future>::Output>> {
|
|
||||||
use Poll::*;
|
|
||||||
match self {
|
|
||||||
Fst::Ongoing(_) => Pending,
|
|
||||||
Fst::Ready(_) => match core::mem::replace(self, Fst::Taken) {
|
|
||||||
Fst::Ready(x) => Ready(Some(x)),
|
|
||||||
_ => panic!(),
|
|
||||||
},
|
|
||||||
Fst::Taken => Ready(None),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<F> Future for Fst<F>
|
impl<F> Future for Fst<F>
|
||||||
@@ -142,7 +130,6 @@ where
|
|||||||
Pending => Pending,
|
Pending => Pending,
|
||||||
},
|
},
|
||||||
Fst::Ready(_) => Ready(()),
|
Fst::Ready(_) => Ready(()),
|
||||||
Fst::Taken => Ready(()),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -188,19 +175,14 @@ impl Stream for ReadQueue {
|
|||||||
for fut in self.futs.iter_mut() {
|
for fut in self.futs.iter_mut() {
|
||||||
let _ = fut.poll_unpin(cx);
|
let _ = fut.poll_unpin(cx);
|
||||||
}
|
}
|
||||||
if let Some(Fst::Taken) = self.futs.front() {
|
if let Some(Fst::Ready(_)) = self.futs.front() {
|
||||||
error!("fut in queue Taken");
|
if let Some(Fst::Ready(k)) = self.futs.pop_front() {
|
||||||
panic!()
|
Ready(Some(k))
|
||||||
} else {
|
|
||||||
if let Some(Fst::Ready(_)) = self.futs.front() {
|
|
||||||
if let Some(Fst::Ready(k)) = self.futs.pop_front() {
|
|
||||||
Ready(Some(k))
|
|
||||||
} else {
|
|
||||||
panic!()
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
Pending
|
panic!()
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
Pending
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -224,7 +206,19 @@ struct ReadingBck {
|
|||||||
}
|
}
|
||||||
|
|
||||||
struct ReadingFwd {
|
struct ReadingFwd {
|
||||||
reading_state: ReadingState,
|
msp_done: bool,
|
||||||
|
msp_fut: Option<FetchMsp>,
|
||||||
|
qu: ReadQueue,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ReadingFwd {
|
||||||
|
fn new(qucap: usize) -> Self {
|
||||||
|
Self {
|
||||||
|
msp_done: false,
|
||||||
|
msp_fut: None,
|
||||||
|
qu: ReadQueue::new(qucap),
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
enum State {
|
enum State {
|
||||||
@@ -443,62 +437,29 @@ impl EventsStreamRt {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn setup_fwd_read(&mut self) {
|
fn setup_fwd_read(&mut self) {
|
||||||
if let State::ReadingFwd(st2) = &self.state {
|
self.state = State::ReadingFwd(ReadingFwd::new(self.qucap));
|
||||||
if let ReadingState::FetchEvents(st3) = &st2.reading_state {
|
}
|
||||||
if st3.qu.has_space() {
|
|
||||||
} else {
|
|
||||||
panic!()
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
self.state = State::ReadingFwd(ReadingFwd {
|
|
||||||
reading_state: ReadingState::FetchEvents(FetchEvents {
|
|
||||||
qu: ReadQueue::new(self.qucap),
|
|
||||||
}),
|
|
||||||
});
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
self.state = State::ReadingFwd(ReadingFwd {
|
|
||||||
reading_state: ReadingState::FetchEvents(FetchEvents {
|
|
||||||
qu: ReadQueue::new(self.qucap),
|
|
||||||
}),
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
let qu = if let State::ReadingFwd(st2) = &mut self.state {
|
fn redo_fwd_read(&mut self) {
|
||||||
if let ReadingState::FetchEvents(st3) = &mut st2.reading_state {
|
// trace_fetch!("setup_fwd_read {} {} BEFORE", self.msp_buf.len(), qu.len());
|
||||||
&mut st3.qu
|
// while qu.has_space() {
|
||||||
} else {
|
// if let Some(ts) = self.msp_buf.pop_front() {
|
||||||
panic!()
|
// trace_fetch!("setup_fwd_read {} FILL A SLOT", ts.fmt());
|
||||||
}
|
// let jobtrace = ReadJobTrace::new();
|
||||||
} else {
|
// let scyqueue = self.scyqueue.clone();
|
||||||
panic!()
|
// let rt = self.rt.clone();
|
||||||
};
|
// let series = self.series.clone();
|
||||||
trace_fetch!("setup_fwd_read {} {} BEFORE", self.msp_buf.len(), qu.len());
|
// let range = self.range.clone();
|
||||||
while qu.has_space() {
|
// let readopts = self.readopts.clone();
|
||||||
if let Some(ts) = self.msp_buf.pop_front() {
|
// let ch_conf = self.ch_conf.clone();
|
||||||
trace_fetch!("setup_fwd_read {} FILL A SLOT", ts.fmt());
|
// let fut =
|
||||||
let jobtrace = ReadJobTrace::new();
|
// Self::make_read_events_fut(ts, false, rt, series, range, readopts, ch_conf, scyqueue, jobtrace);
|
||||||
let scyqueue = self.scyqueue.clone();
|
// qu.push(fut);
|
||||||
let rt = self.rt.clone();
|
// } else {
|
||||||
let series = self.series.clone();
|
// break;
|
||||||
let range = self.range.clone();
|
// }
|
||||||
let readopts = self.readopts.clone();
|
// }
|
||||||
let ch_conf = self.ch_conf.clone();
|
// trace_fetch!("setup_fwd_read {} {} AFTER", self.msp_buf.len(), qu.len());
|
||||||
let fut =
|
|
||||||
Self::make_read_events_fut(ts, false, rt, series, range, readopts, ch_conf, scyqueue, jobtrace);
|
|
||||||
qu.push(fut);
|
|
||||||
} else {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
trace_fetch!("setup_fwd_read {} {} AFTER", self.msp_buf.len(), qu.len());
|
|
||||||
if self.msp_buf.len() == 0 && qu.len() == 0 {
|
|
||||||
trace_msp_fetch!("setup_fwd_read no msp");
|
|
||||||
let fut = Self::make_msp_read_fut(&mut self.msp_inp);
|
|
||||||
self.state = State::ReadingFwd(ReadingFwd {
|
|
||||||
reading_state: ReadingState::FetchMsp(FetchMsp { fut }),
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -579,7 +540,9 @@ impl Stream for EventsStreamRt {
|
|||||||
self.out_cnt += item.len() as u64;
|
self.out_cnt += item.len() as u64;
|
||||||
break Ready(Some(Ok(ChannelEvents::Events(item))));
|
break Ready(Some(Ok(ChannelEvents::Events(item))));
|
||||||
}
|
}
|
||||||
break match &mut self.state {
|
let self2 = self.as_mut().get_mut();
|
||||||
|
let (state, msp_buf) = (&mut self2.state, &mut self2.msp_buf);
|
||||||
|
break match state {
|
||||||
State::Begin => {
|
State::Begin => {
|
||||||
if self.readopts.one_before {
|
if self.readopts.one_before {
|
||||||
trace_fetch!("State::Begin Bck");
|
trace_fetch!("State::Begin Bck");
|
||||||
@@ -589,10 +552,8 @@ impl Stream for EventsStreamRt {
|
|||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
trace_fetch!("State::Begin Fwd");
|
trace_fetch!("State::Begin Fwd");
|
||||||
let fut = Self::make_msp_read_fut(&mut self.msp_inp);
|
// let fut = Self::make_msp_read_fut(&mut self.msp_inp);
|
||||||
self.state = State::ReadingFwd(ReadingFwd {
|
self.setup_fwd_read();
|
||||||
reading_state: ReadingState::FetchMsp(FetchMsp { fut }),
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -667,50 +628,69 @@ impl Stream for EventsStreamRt {
|
|||||||
Pending => Pending,
|
Pending => Pending,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
State::ReadingFwd(st) => match &mut st.reading_state {
|
State::ReadingFwd(st) => {
|
||||||
ReadingState::FetchMsp(st2) => match st2.fut.poll_unpin(cx) {
|
let mut have_pending = false;
|
||||||
Ready(Ok(a)) => {
|
if let Some(fut) = st.msp_fut.as_mut() {
|
||||||
// trace_fetch!("ReadingFwd FetchMsp {}", ts.fmt());
|
match fut.fut.poll_unpin(cx) {
|
||||||
for x in a {
|
Ready(_) => {
|
||||||
self.msp_buf.push_back(x);
|
st.msp_fut = None;
|
||||||
}
|
}
|
||||||
if self.msp_buf.len() == 0 {
|
Pending => {
|
||||||
self.state = State::InputDone;
|
have_pending = true;
|
||||||
continue;
|
|
||||||
} else {
|
|
||||||
self.setup_fwd_read();
|
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Ready(Err(e)) => Ready(Some(Err(e.into()))),
|
} else if st.msp_done == false && msp_buf.len() < 100 {
|
||||||
Pending => Pending,
|
trace_msp_fetch!("create msp read fut");
|
||||||
},
|
let fut = Self::make_msp_read_fut(&mut self2.msp_inp);
|
||||||
ReadingState::FetchEvents(st2) => match st2.qu.poll_next_unpin(cx) {
|
// let fut = err::todoval();
|
||||||
Ready(Some(x)) => match x {
|
st.msp_fut = Some(FetchMsp { fut: fut });
|
||||||
Ok((evs, mut jobtrace)) => {
|
};
|
||||||
jobtrace
|
panic!()
|
||||||
.add_event_now(crate::events::ReadEventKind::EventsStreamRtSees(evs.len() as u32));
|
}
|
||||||
use items_2::merger::Mergeable;
|
// State::ReadingFwd(st) => match &mut st.reading_state {
|
||||||
trace_fetch!("ReadingFwd {jobtrace}");
|
// ReadingState::FetchMsp(st2) => match st2.fut.poll_unpin(cx) {
|
||||||
for ts in Mergeable::tss(&evs) {
|
// Ready(Ok(a)) => {
|
||||||
trace_every_event!("ReadingFwd FetchEvents ts {}", ts.fmt());
|
// // trace_fetch!("ReadingFwd FetchMsp {}", ts.fmt());
|
||||||
}
|
// for x in a {
|
||||||
self.out.push_back(evs);
|
// self.msp_buf.push_back(x);
|
||||||
self.setup_fwd_read();
|
// }
|
||||||
continue;
|
// if self.msp_buf.len() == 0 {
|
||||||
}
|
// self.state = State::InputDone;
|
||||||
Err(e) => {
|
// continue;
|
||||||
self.state = State::Done;
|
// } else {
|
||||||
Ready(Some(Err(e.into())))
|
// self.setup_fwd_read();
|
||||||
}
|
// continue;
|
||||||
},
|
// }
|
||||||
Ready(None) => {
|
// }
|
||||||
self.state = State::Done;
|
// Ready(Err(e)) => Ready(Some(Err(e.into()))),
|
||||||
Ready(Some(Err(Error::ReadQueueEmptyFwd)))
|
// Pending => Pending,
|
||||||
}
|
// },
|
||||||
Pending => Pending,
|
// ReadingState::FetchEvents(st2) => match st2.qu.poll_next_unpin(cx) {
|
||||||
},
|
// Ready(Some(x)) => match x {
|
||||||
},
|
// Ok((evs, mut jobtrace)) => {
|
||||||
|
// jobtrace
|
||||||
|
// .add_event_now(crate::events::ReadEventKind::EventsStreamRtSees(evs.len() as u32));
|
||||||
|
// use items_2::merger::Mergeable;
|
||||||
|
// trace_fetch!("ReadingFwd {jobtrace}");
|
||||||
|
// for ts in Mergeable::tss(&evs) {
|
||||||
|
// trace_every_event!("ReadingFwd FetchEvents ts {}", ts.fmt());
|
||||||
|
// }
|
||||||
|
// self.out.push_back(evs);
|
||||||
|
// self.setup_fwd_read();
|
||||||
|
// continue;
|
||||||
|
// }
|
||||||
|
// Err(e) => {
|
||||||
|
// self.state = State::Done;
|
||||||
|
// Ready(Some(Err(e.into())))
|
||||||
|
// }
|
||||||
|
// },
|
||||||
|
// Ready(None) => {
|
||||||
|
// self.state = State::Done;
|
||||||
|
// Ready(Some(Err(Error::ReadQueueEmptyFwd)))
|
||||||
|
// }
|
||||||
|
// Pending => Pending,
|
||||||
|
// },
|
||||||
|
// },
|
||||||
State::InputDone => {
|
State::InputDone => {
|
||||||
if self.out.len() == 0 {
|
if self.out.len() == 0 {
|
||||||
self.state = State::Done;
|
self.state = State::Done;
|
||||||
|
|||||||
Reference in New Issue
Block a user