profile_traits/
ipc.rs

1/* This Source Code Form is subject to the terms of the Mozilla Public
2 * License, v. 2.0. If a copy of the MPL was not distributed with this
3 * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
5use std::io::Error;
6
7use ipc_channel::ipc;
8use serde::{Deserialize, Serialize};
9
10use crate::time::{ProfilerCategory, ProfilerChan};
11use crate::time_profile;
12
13pub struct IpcReceiver<T>
14where
15    T: for<'de> Deserialize<'de> + Serialize,
16{
17    ipc_receiver: ipc::IpcReceiver<T>,
18    time_profile_chan: ProfilerChan,
19}
20
21impl<T> IpcReceiver<T>
22where
23    T: for<'de> Deserialize<'de> + Serialize,
24{
25    pub fn recv(&self) -> Result<T, ipc::IpcError> {
26        time_profile!(
27            ProfilerCategory::IpcReceiver,
28            None,
29            self.time_profile_chan.clone(),
30            move || self.ipc_receiver.recv(),
31        )
32    }
33
34    pub fn try_recv(&self) -> Result<T, ipc::TryRecvError> {
35        self.ipc_receiver.try_recv()
36    }
37
38    pub fn to_ipc_receiver(self) -> ipc::IpcReceiver<T> {
39        self.ipc_receiver
40    }
41}
42
43pub fn channel<T>(
44    time_profile_chan: ProfilerChan,
45) -> Result<(ipc::IpcSender<T>, IpcReceiver<T>), Error>
46where
47    T: for<'de> Deserialize<'de> + Serialize,
48{
49    let (ipc_sender, ipc_receiver) = ipc::channel()?;
50    let profiled_ipc_receiver = IpcReceiver {
51        ipc_receiver,
52        time_profile_chan,
53    };
54    Ok((ipc_sender, profiled_ipc_receiver))
55}
56
57pub struct IpcBytesReceiver {
58    ipc_bytes_receiver: ipc::IpcBytesReceiver,
59    time_profile_chan: ProfilerChan,
60}
61
62impl IpcBytesReceiver {
63    pub fn recv(&self) -> Result<Vec<u8>, ipc::IpcError> {
64        time_profile!(
65            ProfilerCategory::IpcBytesReceiver,
66            None,
67            self.time_profile_chan.clone(),
68            move || self.ipc_bytes_receiver.recv(),
69        )
70    }
71}
72
73pub fn bytes_channel(
74    time_profile_chan: ProfilerChan,
75) -> Result<(ipc::IpcBytesSender, IpcBytesReceiver), Error> {
76    let (ipc_bytes_sender, ipc_bytes_receiver) = ipc::bytes_channel()?;
77    let profiled_ipc_bytes_receiver = IpcBytesReceiver {
78        ipc_bytes_receiver,
79        time_profile_chan,
80    };
81    Ok((ipc_bytes_sender, profiled_ipc_bytes_receiver))
82}