solana/src/window_stage.rs

61 lines
1.5 KiB
Rust
Raw Normal View History

//! The `window_stage` maintains the blob window
use crdt::Crdt;
2018-06-27 11:33:56 -07:00
use packet::BlobRecycler;
use service::Service;
use std::net::UdpSocket;
use std::sync::mpsc::channel;
use std::sync::{Arc, RwLock};
use std::thread::{self, JoinHandle};
2018-06-27 11:33:56 -07:00
use streamer::{self, BlobReceiver, Window};
pub struct WindowStage {
thread_hdls: Vec<JoinHandle<()>>,
}
impl WindowStage {
pub fn new(
2018-07-11 13:40:46 -07:00
crdt: &Arc<RwLock<Crdt>>,
2018-06-27 11:33:56 -07:00
window: Window,
2018-06-27 12:35:58 -07:00
entry_height: u64,
retransmit_socket: UdpSocket,
2018-07-11 13:40:46 -07:00
blob_recycler: &BlobRecycler,
2018-06-27 11:33:56 -07:00
fetch_stage_receiver: BlobReceiver,
) -> (Self, BlobReceiver) {
let (retransmit_sender, retransmit_receiver) = channel();
let t_retransmit = streamer::retransmitter(
retransmit_socket,
crdt.clone(),
blob_recycler.clone(),
retransmit_receiver,
);
let (blob_sender, blob_receiver) = channel();
let t_window = streamer::window(
crdt.clone(),
window,
2018-06-27 12:35:58 -07:00
entry_height,
blob_recycler.clone(),
fetch_stage_receiver,
blob_sender,
retransmit_sender,
);
let thread_hdls = vec![t_retransmit, t_window];
(WindowStage { thread_hdls }, blob_receiver)
}
}
impl Service for WindowStage {
fn thread_hdls(self) -> Vec<JoinHandle<()>> {
self.thread_hdls
}
fn join(self) -> thread::Result<()> {
for thread_hdl in self.thread_hdls() {
thread_hdl.join()?;
}
Ok(())
}
}