diff --git a/src/packet.rs b/src/packet.rs index 9110e694cd..0b1f3184b4 100644 --- a/src/packet.rs +++ b/src/packet.rs @@ -441,6 +441,18 @@ impl Blob { self.meta.size = new_size; self.set_data_size(new_size as u64).unwrap(); } + + pub fn recv_blob(socket: &UdpSocket, r: &SharedBlob) -> io::Result<()> { + let mut p = r.write().expect("'r' write lock in pub fn recv_from"); + trace!("receiving on {}", socket.local_addr().unwrap()); + + let (nrecv, from) = socket.recv_from(&mut p.data)?; + p.meta.size = nrecv; + p.meta.set_addr(&from); + trace!("got {} bytes from {}", nrecv, from); + Ok(()) + } + pub fn recv_from(re: &BlobRecycler, socket: &UdpSocket) -> Result { let mut v = Vec::new(); //DOCUMENTED SIDE-EFFECT @@ -452,29 +464,22 @@ impl Blob { socket.set_nonblocking(false)?; for i in 0..NUM_BLOBS { let r = re.allocate(); - { - let mut p = r.write().expect("'r' write lock in pub fn recv_from"); - trace!("receiving on {}", socket.local_addr().unwrap()); - match socket.recv_from(&mut p.data) { - Err(_) if i > 0 => { - trace!("got {:?} messages on {}", i, socket.local_addr().unwrap()); - break; - } - Err(e) => { - if e.kind() != io::ErrorKind::WouldBlock { - info!("recv_from err {:?}", e); - } - return Err(Error::IO(e)); - } - Ok((nrecv, from)) => { - p.meta.size = nrecv; - p.meta.set_addr(&from); - trace!("got {} bytes from {}", nrecv, from); - if i == 0 { - socket.set_nonblocking(true)?; - } - } + + match Blob::recv_blob(socket, &r) { + Err(_) if i > 0 => { + trace!("got {:?} messages on {}", i, socket.local_addr().unwrap()); + break; } + Err(e) => { + if e.kind() != io::ErrorKind::WouldBlock { + info!("recv_from err {:?}", e); + } + re.recycle(r, "Blob::recv_from"); + return Err(Error::IO(e)); + } + Ok(()) => if i == 0 { + socket.set_nonblocking(true)?; + }, } v.push(r); }