Keep the same read buffer unless the last message was overly large

This avoids repeatedly deallocating-allocating a Vec for the peer
read buffer after every message/header.
This commit is contained in:
Matt Corallo 2021-10-11 05:03:45 +00:00
parent ae4ceb71a5
commit eb17464e78

View file

@ -972,7 +972,7 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, L: Deref, CMH: Deref> P
if peer.pending_read_is_header { if peer.pending_read_is_header {
let msg_len = try_potential_handleerror!(peer, let msg_len = try_potential_handleerror!(peer,
peer.channel_encryptor.decrypt_length_header(&peer.pending_read_buffer[..])); peer.channel_encryptor.decrypt_length_header(&peer.pending_read_buffer[..]));
peer.pending_read_buffer = Vec::with_capacity(msg_len as usize + 16); if peer.pending_read_buffer.capacity() > 8192 { peer.pending_read_buffer = Vec::new(); }
peer.pending_read_buffer.resize(msg_len as usize + 16, 0); peer.pending_read_buffer.resize(msg_len as usize + 16, 0);
if msg_len < 2 { // Need at least the message type tag if msg_len < 2 { // Need at least the message type tag
return Err(PeerHandleError{ no_connection_possible: false }); return Err(PeerHandleError{ no_connection_possible: false });
@ -984,7 +984,8 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, L: Deref, CMH: Deref> P
assert!(msg_data.len() >= 2); assert!(msg_data.len() >= 2);
// Reset read buffer // Reset read buffer
peer.pending_read_buffer = [0; 18].to_vec(); if peer.pending_read_buffer.capacity() > 8192 { peer.pending_read_buffer = Vec::new(); }
peer.pending_read_buffer.resize(18, 0);
peer.pending_read_is_header = true; peer.pending_read_is_header = true;
let mut reader = io::Cursor::new(&msg_data[..]); let mut reader = io::Cursor::new(&msg_data[..]);