read_buf: use unsafe but remove callback

This commit is contained in:
Igor Katson 2024-05-03 12:38:24 +01:00
parent 01cbeabd51
commit e658b960e3
2 changed files with 18 additions and 21 deletions

View file

@ -347,23 +347,21 @@ impl<H: PeerConnectionHandler> PeerConnection<H> {
let reader = async move { let reader = async move {
loop { loop {
read_buf let message = read_buf
.read_message(&mut read_half, rwtimeout, |message| { .read_message(&mut read_half, rwtimeout)
trace!("received: {:?}", &message);
if let Message::Extended(ExtendedMessage::Handshake(h)) = &message {
*extended_handshake_ref.write() = Some(h.clone_to_owned());
self.handler.on_extended_handshake(h)?;
trace!("remembered extended handshake for future serializing");
} else {
self.handler
.on_received_message(message)
.context("error in handler.on_received_message()")?;
}
Ok(())
})
.await .await
.context("error reading message")?; .context("error reading message")?;
trace!("received: {:?}", &message);
if let Message::Extended(ExtendedMessage::Handshake(h)) = &message {
*extended_handshake_ref.write() = Some(h.clone_to_owned());
self.handler.on_extended_handshake(h)?;
trace!("remembered extended handshake for future serializing");
} else {
self.handler
.on_received_message(message)
.context("error in handler.on_received_message()")?;
}
} }
// For type inference. // For type inference.

View file

@ -68,18 +68,17 @@ impl ReadBuf {
&mut self, &mut self,
mut conn: impl AsyncReadExt + Unpin, mut conn: impl AsyncReadExt + Unpin,
timeout: Duration, timeout: Duration,
on_message: impl for<'a> FnOnce(MessageBorrowed<'a>) -> anyhow::Result<()>, ) -> anyhow::Result<MessageBorrowed<'_>> {
) -> anyhow::Result<()> {
loop { loop {
let need_additional_bytes = let need_additional_bytes =
match MessageBorrowed::deserialize(&self.buf[self.processed..self.filled]) { match MessageBorrowed::deserialize(&self.buf[self.processed..self.filled]) {
Err(MessageDeserializeError::NotEnoughData(d, _)) => d, Err(MessageDeserializeError::NotEnoughData(d, _)) => d,
Ok((msg, size)) => { Ok((msg, size)) => {
self.processed += size; self.processed += size;
// Rust's borrow checker can't do this early return. So we are using a callback instead.
// return Ok(msg); // Rust's borrow checker can't do this early return so resort to unsafe.
on_message(msg)?; let msg = unsafe { std::mem::transmute(msg) };
return Ok(()); return Ok(msg);
} }
Err(e) => return Err(e.into()), Err(e) => return Err(e.into()),
}; };