aboutsummaryrefslogtreecommitdiffstats
path: root/components/shared/profile/ipc.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/shared/profile/ipc.rs')
-rw-r--r--components/shared/profile/ipc.rs82
1 files changed, 82 insertions, 0 deletions
diff --git a/components/shared/profile/ipc.rs b/components/shared/profile/ipc.rs
new file mode 100644
index 00000000000..7a005939a98
--- /dev/null
+++ b/components/shared/profile/ipc.rs
@@ -0,0 +1,82 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
+
+use std::io::Error;
+
+use ipc_channel::ipc;
+use serde::{Deserialize, Serialize};
+
+use crate::time;
+use crate::time::{ProfilerCategory, ProfilerChan};
+
+pub struct IpcReceiver<T>
+where
+ T: for<'de> Deserialize<'de> + Serialize,
+{
+ ipc_receiver: ipc::IpcReceiver<T>,
+ time_profile_chan: ProfilerChan,
+}
+
+impl<T> IpcReceiver<T>
+where
+ T: for<'de> Deserialize<'de> + Serialize,
+{
+ pub fn recv(&self) -> Result<T, ipc::IpcError> {
+ time::profile(
+ ProfilerCategory::IpcReceiver,
+ None,
+ self.time_profile_chan.clone(),
+ move || self.ipc_receiver.recv(),
+ )
+ }
+
+ pub fn try_recv(&self) -> Result<T, ipc::TryRecvError> {
+ self.ipc_receiver.try_recv()
+ }
+
+ pub fn to_opaque(self) -> ipc::OpaqueIpcReceiver {
+ self.ipc_receiver.to_opaque()
+ }
+}
+
+pub fn channel<T>(
+ time_profile_chan: ProfilerChan,
+) -> Result<(ipc::IpcSender<T>, IpcReceiver<T>), Error>
+where
+ T: for<'de> Deserialize<'de> + Serialize,
+{
+ let (ipc_sender, ipc_receiver) = ipc::channel()?;
+ let profiled_ipc_receiver = IpcReceiver {
+ ipc_receiver,
+ time_profile_chan,
+ };
+ Ok((ipc_sender, profiled_ipc_receiver))
+}
+
+pub struct IpcBytesReceiver {
+ ipc_bytes_receiver: ipc::IpcBytesReceiver,
+ time_profile_chan: ProfilerChan,
+}
+
+impl IpcBytesReceiver {
+ pub fn recv(&self) -> Result<Vec<u8>, ipc::IpcError> {
+ time::profile(
+ ProfilerCategory::IpcBytesReceiver,
+ None,
+ self.time_profile_chan.clone(),
+ move || self.ipc_bytes_receiver.recv(),
+ )
+ }
+}
+
+pub fn bytes_channel(
+ time_profile_chan: ProfilerChan,
+) -> Result<(ipc::IpcBytesSender, IpcBytesReceiver), Error> {
+ let (ipc_bytes_sender, ipc_bytes_receiver) = ipc::bytes_channel()?;
+ let profiled_ipc_bytes_receiver = IpcBytesReceiver {
+ ipc_bytes_receiver,
+ time_profile_chan,
+ };
+ Ok((ipc_bytes_sender, profiled_ipc_bytes_receiver))
+}