summaryrefslogtreecommitdiffstats
path: root/third_party/rust/audioipc2/src/sys/mod.rs
blob: 0bcfdaa15eb11d77d6716ced691d4f0f6c04a9da (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
// Copyright © 2021 Mozilla Foundation
//
// This program is made available under an ISC-style license.  See the
// accompanying file LICENSE for details

use std::{collections::VecDeque, io::Result};

use bytes::BytesMut;
use mio::{event::Source, Interest, Registry, Token};

#[cfg(unix)]
mod unix;
use crate::messages::RemoteHandle;

#[cfg(unix)]
pub use self::unix::*;

#[cfg(windows)]
mod windows;
#[cfg(windows)]
pub use self::windows::*;

impl Source for Pipe {
    fn register(&mut self, registry: &Registry, token: Token, interests: Interest) -> Result<()> {
        self.io.register(registry, token, interests)
    }

    fn reregister(&mut self, registry: &Registry, token: Token, interests: Interest) -> Result<()> {
        self.io.reregister(registry, token, interests)
    }

    fn deregister(&mut self, registry: &Registry) -> Result<()> {
        self.io.deregister(registry)
    }
}

const HANDLE_QUEUE_LIMIT: usize = 16;

#[derive(Debug)]
pub struct ConnectionBuffer {
    pub buf: BytesMut,
    handles: VecDeque<RemoteHandle>,
}

impl ConnectionBuffer {
    pub fn with_capacity(cap: usize) -> Self {
        ConnectionBuffer {
            buf: BytesMut::with_capacity(cap),
            handles: VecDeque::with_capacity(HANDLE_QUEUE_LIMIT),
        }
    }

    pub fn is_empty(&self) -> bool {
        self.buf.is_empty()
    }

    pub fn push_handle(&mut self, handle: RemoteHandle) {
        assert!(self.handles.len() < self.handles.capacity());
        self.handles.push_back(handle)
    }

    pub fn pop_handle(&mut self) -> Option<RemoteHandle> {
        self.handles.pop_front()
    }
}

pub trait RecvMsg {
    // Receive data from the associated connection.  `recv_msg` expects the capacity of
    // the `ConnectionBuffer` members have been adjusted appropriately by the caller.
    fn recv_msg(&mut self, buf: &mut ConnectionBuffer) -> Result<usize>;
}

pub trait SendMsg {
    // Send data on the associated connection.  `send_msg` consumes and adjusts the length of the
    // `ConnectionBuffer` members based on the size of the successful send operation.
    fn send_msg(&mut self, buf: &mut ConnectionBuffer) -> Result<usize>;
}