dope_sys/io/request/
borrow.rs1use std::mem;
2
3use libc::socklen_t;
4use o3::{base::marker::ThreadBound, buffer::bytes};
5
6use crate::{io, io::socket::addr};
7
8#[repr(transparent)]
10pub struct Borrowed<'a, I>(Retained<'a, I>, ThreadBound);
11
12pub enum Retained<'a, I> {
13 Accept {
14 listener: I,
15 addr: &'a mut libc::sockaddr_storage,
16 len: &'a mut socklen_t,
17 },
18 Send {
19 slot: I,
20 input: bytes::Prefix<'a, { i32::MAX as usize }>,
21 },
22 SendMsg {
23 slot: I,
24 msg: &'a io::socket::msg::Header,
25 },
26 Connect {
27 slot: I,
28 addr: addr::Addr<'a>,
29 },
30}
31
32impl<'a, I> Borrowed<'a, I> {
33 pub fn send(slot: I, input: bytes::Prefix<'a, { i32::MAX as usize }>) -> Self {
34 Self(Retained::Send { slot, input }, ThreadBound::NEW)
35 }
36
37 pub fn send_msg<M: io::raw::Message<'a>>(slot: I, message: M) -> Self {
38 Self(
39 Retained::SendMsg {
40 slot,
41 msg: message.header(),
42 },
43 ThreadBound::NEW,
44 )
45 }
46
47 pub fn accept(
48 listener: I,
49 address: &'a mut libc::sockaddr_storage,
50 len: &'a mut socklen_t,
51 ) -> Self {
52 const CAPACITY: socklen_t = {
53 assert!(mem::size_of::<libc::sockaddr_storage>() <= socklen_t::MAX as usize);
54 mem::size_of::<libc::sockaddr_storage>() as socklen_t
55 };
56 *len = CAPACITY;
57 Self(
58 Retained::Accept {
59 listener,
60 addr: address,
61 len,
62 },
63 ThreadBound::NEW,
64 )
65 }
66
67 pub fn connect(slot: I, addr: addr::Addr<'a>) -> Self {
68 Self(Retained::Connect { slot, addr }, ThreadBound::NEW)
69 }
70
71 pub fn into_inner(self) -> Retained<'a, I> {
72 self.0
73 }
74}