Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- struct Foo {
- packet_bufs: Vec<Vec<u8>>,
- sockaddrs: Vec<std::net::SocketAddr>,
- lengths: Vec<usize>,
- }
- impl Foo {
- fn doit1(&mut self, sock: &std::net::UdpSocket) -> Result<usize, std::io::Error> {
- // trying to get rid of the allocation for this Vec
- let mut iovecs: Vec<[&mut [u8]; 1]> = self.packet_bufs
- .iter_mut()
- .map(|pk| {
- let iov = &mut pk[..];
- [iov]
- })
- .collect();
- Self::doit3(sock, &mut self.sockaddrs[..], &mut self.lengths, &mut iovecs[..])
- }
- fn doit2(&mut self, sock: &std::net::UdpSocket) -> Result<usize, std::io::Error> {
- // switching the code to ArrayVec doesn't compile
- let mut iovecs: arrayvec::ArrayVec<[[&mut [u8]; 1]; 8]> = self.packet_bufs
- .iter_mut()
- .map(|pk| {
- let iov = &mut pk[..];
- [iov]
- })
- .collect();
- Self::doit3(sock, &mut self.sockaddrs[..], &mut self.lengths, &mut iovecs[..])
- // ^^^^^^ borrowed value does not live long enough
- }
- // | `iovecs` dropped here while still borrowed
- fn doit3<'a, 'b: 'a>(
- _sock: &'a std::net::UdpSocket,
- _sockaddrs: &'a mut [std::net::SocketAddr],
- _lengths: &mut Vec<usize>,
- _iovecs: &'b mut [[&'a mut [u8]; 1]],
- ) -> Result<usize, std::io::Error> {
- //let mut recv_headers: arrayvec::ArrayVec<[RecvMMsgHdr<'_>; 8]> = iovecs
- // .iter_mut()
- // .zip(sockaddrs.iter_mut())
- // .map(|(iov, sockaddr)| {
- // RecvMMsgHdr::new(iov, None, MsgFlags::empty(), Some(sockaddr))
- // })
- // .collect();
- //let size = recvmmsg(sock.as_raw_fd(), &mut recv_headers[..], MsgFlags::empty(), None)?;
- //lengths.extend(recv_headers.drain(..size).map(|hdr| hdr.msg_len()));
- //Ok(size)
- Ok(0)
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement