1use 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}