profile_traits/
generic_channel.rs1use base::generic_channel;
6use serde::{Deserialize, Serialize};
7
8use crate::time::{ProfilerCategory, ProfilerChan};
9use crate::time_profile;
10
11pub struct GenericReceiver<T>
12where
13 T: for<'de> Deserialize<'de> + Serialize,
14{
15 receiver: generic_channel::GenericReceiver<T>,
16 time_profile_chan: ProfilerChan,
17}
18
19impl<T> GenericReceiver<T>
20where
21 T: for<'de> Deserialize<'de> + Serialize,
22{
23 pub fn recv(&self) -> Result<T, generic_channel::ReceiveError> {
24 time_profile!(
25 ProfilerCategory::IpcReceiver,
26 None,
27 self.time_profile_chan.clone(),
28 move || self.receiver.recv(),
29 )
30 }
31
32 pub fn try_recv(&self) -> Result<T, generic_channel::TryReceiveError> {
33 self.receiver.try_recv()
34 }
35
36 pub fn into_inner(self) -> generic_channel::GenericReceiver<T> {
37 self.receiver
38 }
39}
40
41pub fn channel<T>(
42 time_profile_chan: ProfilerChan,
43) -> Option<(generic_channel::GenericSender<T>, GenericReceiver<T>)>
44where
45 T: for<'de> Deserialize<'de> + Serialize,
46{
47 let (sender, receiver) = generic_channel::channel()?;
48 let profiled_receiver = GenericReceiver {
49 receiver,
50 time_profile_chan,
51 };
52 Some((sender, profiled_receiver))
53}