diff --git a/network/src/channel.rs b/network/src/channel.rs
index 3f03120fd9..d07826c7e1 100644
--- a/network/src/channel.rs
+++ b/network/src/channel.rs
@@ -21,8 +21,8 @@ pub(crate) trait ChannelProtocol {
type Handle: ?Sized + mio::Evented;
/// Execute when ready to read
fn read(&mut self) -> Vec;
- /// Execute when ready to write, return Err when would block
- fn write(&mut self, frame: Frame) -> Result<(), ()>;
+ /// Execute when ready to write
+ fn write>(&mut self, frames: &mut I);
/// used for mio
fn get_handle(&self) -> &Self::Handle;
}
@@ -141,25 +141,13 @@ impl Channel {
self.tick_streams();
match &mut self.protocol {
ChannelProtocols::Tcp(c) => {
- while let Some(frame) = self.send_queue.pop_front() {
- if c.write(frame).is_err() {
- break;
- }
- }
+ c.write(&mut self.send_queue.drain(..));
},
ChannelProtocols::Udp(c) => {
- while let Some(frame) = self.send_queue.pop_front() {
- if c.write(frame).is_err() {
- break;
- }
- }
+ c.write(&mut self.send_queue.drain(..));
},
ChannelProtocols::Mpsc(c) => {
- while let Some(frame) = self.send_queue.pop_front() {
- if c.write(frame).is_err() {
- break;
- }
- }
+ c.write(&mut self.send_queue.drain(..));
},
}
}
diff --git a/network/src/mpsc.rs b/network/src/mpsc.rs
index 2793007e28..08939ac2f9 100644
--- a/network/src/mpsc.rs
+++ b/network/src/mpsc.rs
@@ -33,23 +33,23 @@ impl ChannelProtocol for MpscChannel {
result
}
- /// Execute when ready to write
- fn write(&mut self, frame: Frame) -> Result<(), ()> {
- match self.endpoint_sender.send(frame) {
- Ok(n) => {
- trace!("semded");
- },
- Err(mio_extras::channel::SendError::Io(e))
- if e.kind() == std::io::ErrorKind::WouldBlock =>
- {
- debug!("would block");
- return Err(());
- }
- Err(e) => {
- panic!("{}", e);
- },
- };
- Ok(())
+ fn write>(&mut self, frames: &mut I) {
+ for frame in frames {
+ match self.endpoint_sender.send(frame) {
+ Ok(n) => {
+ trace!("sended");
+ },
+ Err(mio_extras::channel::SendError::Io(e))
+ if e.kind() == std::io::ErrorKind::WouldBlock =>
+ {
+ debug!("would block");
+ return;
+ }
+ Err(e) => {
+ panic!("{}", e);
+ },
+ };
+ }
}
fn get_handle(&self) -> &Self::Handle { &self.endpoint_receiver }
diff --git a/network/src/tcp.rs b/network/src/tcp.rs
index 8e9a42da22..781e189ae5 100644
--- a/network/src/tcp.rs
+++ b/network/src/tcp.rs
@@ -59,10 +59,7 @@ impl NetworkBuffer {
fn actually_written(&mut self, cnt: usize) { self.write_idx += cnt; }
- fn get_read_slice(&self) -> &[u8] {
- trace!(?self, "get_read_slice");
- &self.data[self.read_idx..self.write_idx]
- }
+ fn get_read_slice(&self) -> &[u8] { &self.data[self.read_idx..self.write_idx] }
fn actually_read(&mut self, cnt: usize) {
self.read_idx += cnt;
@@ -162,30 +159,42 @@ impl ChannelProtocol for TcpChannel {
}
/// Execute when ready to write
- fn write(&mut self, frame: Frame) -> Result<(), ()> {
- if let Ok(mut size) = bincode::serialized_size(&frame) {
- let slice = self.write_buffer.get_write_slice(size as usize);
- if let Err(e) = bincode::serialize_into(slice, &frame) {
- error!(
- "serialising frame was unsuccessful, this should never happen! dropping frame!"
- )
+ fn write>(&mut self, frames: &mut I) {
+ loop {
+ //serialize when len < MTU 1500, then write
+ if self.write_buffer.get_read_slice().len() < 1500 {
+ match frames.next() {
+ Some(frame) => {
+ if let Ok(mut size) = bincode::serialized_size(&frame) {
+ let slice = self.write_buffer.get_write_slice(size as usize);
+ if let Err(e) = bincode::serialize_into(slice, &frame) {
+ error!(
+ "serialising frame was unsuccessful, this should never \
+ happen! dropping frame!"
+ )
+ }
+ self.write_buffer.actually_written(size as usize); //I have to rely on those informations to be consistent!
+ } else {
+ error!(
+ "getting size of frame was unsuccessful, this should never \
+ happen! dropping frame!"
+ )
+ };
+ },
+ None => break,
+ }
+ }
+
+ match self.endpoint.write(self.write_buffer.get_read_slice()) {
+ Ok(n) => {
+ self.write_buffer.actually_read(n);
+ },
+ Err(e) if e.kind() == std::io::ErrorKind::WouldBlock => {
+ debug!("can't send tcp yet, would block");
+ return;
+ },
+ Err(e) => panic!("{}", e),
}
- self.write_buffer.actually_written(size as usize); //I have to rely on those informations to be consistent!
- } else {
- error!(
- "getting size of frame was unsuccessful, this should never happen! dropping frame!"
- )
- };
- match self.endpoint.write(self.write_buffer.get_read_slice()) {
- Ok(n) => {
- self.write_buffer.actually_read(n);
- Ok(())
- },
- Err(e) if e.kind() == std::io::ErrorKind::WouldBlock => {
- debug!("can't send tcp yet, would block");
- Err(())
- },
- Err(e) => panic!("{}", e),
}
}
diff --git a/network/src/udp.rs b/network/src/udp.rs
index e5c32daf81..7c53604755 100644
--- a/network/src/udp.rs
+++ b/network/src/udp.rs
@@ -57,29 +57,27 @@ impl ChannelProtocol for UdpChannel {
}
/// Execute when ready to write
- fn write(&mut self, frame: Frame) -> Result<(), ()> {
- if let Ok(mut data) = bincode::serialize(&frame) {
- let total = data.len();
- match self.endpoint.send(&data) {
- Ok(n) if n == total => {
- trace!("send {} bytes", n);
- },
- Ok(n) => {
- error!("could only send part");
- //let data = data.drain(n..).collect(); //TODO:
- // validate n.. is correct
- // to_send.push_front(data);
- },
- Err(e) if e.kind() == std::io::ErrorKind::WouldBlock => {
- debug!("would block");
- return Err(());
- },
- Err(e) => {
- panic!("{}", e);
- },
+ fn write>(&mut self, frames: &mut I) {
+ for frame in frames {
+ if let Ok(mut data) = bincode::serialize(&frame) {
+ let total = data.len();
+ match self.endpoint.send(&data) {
+ Ok(n) if n == total => {
+ trace!("send {} bytes", n);
+ },
+ Ok(n) => {
+ error!("could only send part");
+ },
+ Err(e) if e.kind() == std::io::ErrorKind::WouldBlock => {
+ debug!("would block");
+ return;
+ },
+ Err(e) => {
+ panic!("{}", e);
+ },
+ };
};
- };
- Ok(())
+ }
}
fn get_handle(&self) -> &Self::Handle { &self.endpoint }