Skip to content

Commit b45dc50

Browse files
committed
refactor: reduce mem alloc during framed reading
1 parent 157b9ed commit b45dc50

File tree

3 files changed

+28
-4
lines changed

3 files changed

+28
-4
lines changed

src/frame.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,8 @@ impl Decoder for MuxCodec {
9595
type Error = MuxError;
9696

9797
fn decode(&mut self, src: &mut BytesMut) -> Result<Option<Self::Item>, Self::Error> {
98+
src.reserve(HEADER_SIZE + MAX_PAYLOAD_SIZE + HEADER_SIZE);
99+
98100
if src.len() < HEADER_SIZE {
99101
return Ok(None);
100102
}

src/lib.rs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -317,4 +317,29 @@ mod tests {
317317

318318
assert!(stream2.write_all(b"1234").await.is_err());
319319
}
320+
321+
#[tokio::test]
322+
async fn test_inner_shutdown() {
323+
let (a, b) = get_tcp_pair().await;
324+
325+
let (connector_a, mut acceptor_a, worker_a) =
326+
MuxBuilder::client().with_connection(a).build();
327+
let (connector_b, mut acceptor_b, worker_b) =
328+
MuxBuilder::server().with_connection(b).build();
329+
330+
let a_res = tokio::spawn(worker_a);
331+
drop(worker_b);
332+
tokio::time::sleep(Duration::from_secs(2)).await;
333+
334+
assert!(connector_b.connect().is_err());
335+
assert!(acceptor_b.accept().await.is_none());
336+
337+
drop(connector_b);
338+
drop(acceptor_b);
339+
340+
tokio::time::sleep(Duration::from_secs(2)).await;
341+
assert!(connector_a.connect().is_err());
342+
assert!(acceptor_a.accept().await.is_none());
343+
a_res.await.unwrap().unwrap_err();
344+
}
320345
}

src/mux.rs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -626,10 +626,7 @@ impl<T: TokioConn> MuxState<T> {
626626
self.check_closed()?;
627627

628628
if let Some(r) = ready!(self.inner.poll_next_unpin(cx)) {
629-
let frame = r.map_err(|e| {
630-
self.close();
631-
e
632-
})?;
629+
let frame = r.inspect_err(|_| self.close())?;
633630
Poll::Ready(Ok(frame))
634631
} else {
635632
self.close();

0 commit comments

Comments
 (0)