read_buf: use unsafe but remove callback
This commit is contained in:
parent
01cbeabd51
commit
e658b960e3
2 changed files with 18 additions and 21 deletions
|
|
@ -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.
|
||||||
|
|
|
||||||
|
|
@ -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()),
|
||||||
};
|
};
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue