Skip to content

Commit 52c049f

Browse files
committed
For recvmmsg split lifetime 'a
into separate lifetimes for 'data, headers ('hdr) and related iterator
1 parent 1b0dba6 commit 52c049f

File tree

2 files changed

+36
-27
lines changed

2 files changed

+36
-27
lines changed

src/sys/socket/mod.rs

+13-10
Original file line numberDiff line numberDiff line change
@@ -1765,7 +1765,7 @@ pub fn sendmmsg<'a, XS, AS, C, I, S>(
17651765
// shared across all the messages
17661766
cmsgs: C,
17671767
flags: MsgFlags
1768-
) -> crate::Result<MultiResults<'a, S>>
1768+
) -> crate::Result<MultiResults<'a, 'a, S>>
17691769
where
17701770
XS: IntoIterator<Item = &'a I>,
17711771
AS: AsRef<[Option<S>]>,
@@ -1820,6 +1820,7 @@ pub fn sendmmsg<'a, XS, AS, C, I, S>(
18201820
Ok(MultiResults {
18211821
rmm: data,
18221822
current_index: 0,
1823+
slices: std::marker::PhantomData,
18231824
received: sent
18241825
})
18251826

@@ -1908,16 +1909,16 @@ impl<S> MultiHeaders<S> {
19081909
// always produce the desired results - see https://github.com/nix-rust/nix/pull/1744 for more
19091910
// details
19101911
#[cfg(any(linux_android, target_os = "freebsd", target_os = "netbsd"))]
1911-
pub fn recvmmsg<'a, XS, S, I>(
1912+
pub fn recvmmsg<'hdr, 'iter, 'data, XS, S, I>(
19121913
fd: RawFd,
1913-
data: &'a mut MultiHeaders<S>,
1914+
data: &'hdr mut MultiHeaders<S>,
19141915
slices: XS,
19151916
flags: MsgFlags,
19161917
mut timeout: Option<crate::sys::time::TimeSpec>,
1917-
) -> crate::Result<MultiResults<'a, S>>
1918+
) -> crate::Result<MultiResults<'hdr, 'data, S>>
19181919
where
1919-
XS: IntoIterator<Item = &'a mut I>,
1920-
I: AsMut<[IoSliceMut<'a>]> + 'a,
1920+
XS: IntoIterator<Item = &'iter mut I>,
1921+
I: AsMut<[IoSliceMut<'data>]> + 'iter,
19211922
{
19221923
let mut count = 0;
19231924
for (i, (slice, mmsghdr)) in slices.into_iter().zip(data.items.iter_mut()).enumerate() {
@@ -1949,6 +1950,7 @@ where
19491950
})? as usize;
19501951

19511952
Ok(MultiResults {
1953+
slices: std::marker::PhantomData,
19521954
rmm: data,
19531955
current_index: 0,
19541956
received,
@@ -1958,19 +1960,20 @@ where
19581960
/// Iterator over results of [`recvmmsg`]/[`sendmmsg`]
19591961
#[cfg(any(linux_android, target_os = "freebsd", target_os = "netbsd"))]
19601962
#[derive(Debug)]
1961-
pub struct MultiResults<'a, S> {
1963+
pub struct MultiResults<'hdrs, 'data, S> {
19621964
// preallocated structures
1963-
rmm: &'a MultiHeaders<S>,
1965+
rmm: &'hdrs MultiHeaders<S>,
1966+
slices: std::marker::PhantomData<&'data ()>,
19641967
current_index: usize,
19651968
received: usize,
19661969
}
19671970

19681971
#[cfg(any(linux_android, target_os = "freebsd", target_os = "netbsd"))]
1969-
impl<'a, S> Iterator for MultiResults<'a, S>
1972+
impl<'hdrs, 'data, S> Iterator for MultiResults<'hdrs, 'data, S>
19701973
where
19711974
S: Copy + SockaddrLike,
19721975
{
1973-
type Item = RecvMsg<'a, 'a, S>;
1976+
type Item = RecvMsg<'hdrs, 'data, S>;
19741977

19751978
// The cast is not unnecessary on all platforms.
19761979
#[allow(clippy::unnecessary_cast)]

test/sys/test_socket.rs

+23-17
Original file line numberDiff line numberDiff line change
@@ -646,8 +646,9 @@ mod recvfrom {
646646
)
647647
.expect("send socket failed");
648648

649+
const LOOPS: usize = 3;
649650
let send_thread = thread::spawn(move || {
650-
for _ in 0..NUM_MESSAGES_SENT {
651+
for _ in 0..NUM_MESSAGES_SENT * LOOPS {
651652
sendto(
652653
ssock.as_raw_fd(),
653654
&DATA[..],
@@ -671,24 +672,29 @@ mod recvfrom {
671672
let mut data =
672673
MultiHeaders::<SockaddrIn>::preallocate(msgs.len(), None);
673674

674-
let res: Vec<RecvMsg<SockaddrIn>> = recvmmsg(
675-
rsock.as_raw_fd(),
676-
&mut data,
677-
msgs.iter_mut(),
678-
MsgFlags::empty(),
679-
None,
680-
)
681-
.expect("recvmmsg")
682-
.collect();
683-
assert_eq!(res.len(), DATA.len());
675+
for _ in 0..LOOPS {
676+
let res: Vec<RecvMsg<SockaddrIn>> = recvmmsg(
677+
rsock.as_raw_fd(),
678+
&mut data,
679+
msgs.iter_mut(),
680+
MsgFlags::empty(),
681+
None,
682+
)
683+
.expect("recvmmsg")
684+
.collect();
685+
assert_eq!(res.len(), DATA.len());
684686

685-
for RecvMsg { address, bytes, .. } in res.into_iter() {
686-
assert_eq!(AddressFamily::Inet, address.unwrap().family().unwrap());
687-
assert_eq!(DATA.len(), bytes);
688-
}
687+
for RecvMsg { address, bytes, .. } in res.into_iter() {
688+
assert_eq!(
689+
AddressFamily::Inet,
690+
address.unwrap().family().unwrap()
691+
);
692+
assert_eq!(DATA.len(), bytes);
693+
}
689694

690-
for buf in &receive_buffers {
691-
assert_eq!(&buf[..DATA.len()], DATA);
695+
for buf in msgs.iter().flatten() {
696+
assert_eq!(&buf[..DATA.len()], DATA);
697+
}
692698
}
693699

694700
send_thread.join().unwrap();

0 commit comments

Comments
 (0)