Skip to main content

ibverbs_rs/multi_channel/ops/
unpolled_ops.rs

1use crate::channel::PendingWork;
2use crate::ibverbs::error::IbvResult;
3use crate::ibverbs::work::SendWorkRequest;
4use crate::multi_channel::MultiChannel;
5use crate::multi_channel::work_request::*;
6
7impl MultiChannel {
8    /// Posts sends to multiple peers without polling for completion.
9    ///
10    /// # Safety
11    /// See [`Channel::send_unpolled`](crate::channel::Channel::send_unpolled).
12    pub unsafe fn scatter_send_unpolled<'wr, 'data, I>(
13        &mut self,
14        wrs: I,
15    ) -> IbvResult<Vec<PendingWork<'data>>>
16    where
17        I: IntoIterator<Item = PeerSendWorkRequest<'wr, 'data>>,
18        'data: 'wr,
19    {
20        wrs.into_iter()
21            .map(|wr| unsafe { self.send_unpolled(wr) })
22            .collect()
23    }
24
25    /// Posts RDMA writes to multiple peers without polling for completion.
26    ///
27    /// # Safety
28    /// See [`Channel::write_unpolled`](crate::channel::Channel::write_unpolled).
29    pub unsafe fn scatter_write_unpolled<'wr, 'data, I>(
30        &mut self,
31        wrs: I,
32    ) -> IbvResult<Vec<PendingWork<'data>>>
33    where
34        I: IntoIterator<Item = PeerWriteWorkRequest<'wr, 'data>>,
35        'data: 'wr,
36    {
37        wrs.into_iter()
38            .map(|wr| unsafe { self.write_unpolled(wr) })
39            .collect()
40    }
41
42    /// Posts receives from multiple peers without polling for completion.
43    ///
44    /// # Safety
45    /// See [`Channel::receive_unpolled`](crate::channel::Channel::receive_unpolled).
46    pub unsafe fn gather_receive_unpolled<'wr, 'data, I>(
47        &mut self,
48        wrs: I,
49    ) -> IbvResult<Vec<PendingWork<'data>>>
50    where
51        I: IntoIterator<Item = PeerReceiveWorkRequest<'wr, 'data>>,
52        'data: 'wr,
53    {
54        wrs.into_iter()
55            .map(|wr| unsafe { self.receive_unpolled(wr) })
56            .collect()
57    }
58
59    /// Posts RDMA reads from multiple peers without polling for completion.
60    ///
61    /// # Safety
62    /// See [`Channel::read_unpolled`](crate::channel::Channel::read_unpolled).
63    pub unsafe fn gather_read_unpolled<'wr, 'data, I>(
64        &mut self,
65        wrs: I,
66    ) -> IbvResult<Vec<PendingWork<'data>>>
67    where
68        I: IntoIterator<Item = PeerReadWorkRequest<'wr, 'data>>,
69        'data: 'wr,
70    {
71        wrs.into_iter()
72            .map(|wr| unsafe { self.read_unpolled(wr) })
73            .collect()
74    }
75
76    /// Posts the same send to multiple peers without polling for completion.
77    ///
78    /// # Safety
79    /// See [`Channel::send_unpolled`](crate::channel::Channel::send_unpolled).
80    pub unsafe fn multicast_send_unpolled<'wr, 'data, I>(
81        &mut self,
82        peers: I,
83        wr: SendWorkRequest<'wr, 'data>,
84    ) -> IbvResult<Vec<PendingWork<'data>>>
85    where
86        I: IntoIterator<Item = usize>,
87    {
88        peers
89            .into_iter()
90            .map(|peer| unsafe {
91                self.send_unpolled(PeerSendWorkRequest::from_wr(peer, wr.clone()))
92            })
93            .collect()
94    }
95}