aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--components/profile/time.rs1
-rw-r--r--components/profile_traits/ipc.rs30
-rw-r--r--components/profile_traits/time.rs1
-rw-r--r--tests/unit/profile/time.rs23
4 files changed, 55 insertions, 0 deletions
diff --git a/components/profile/time.rs b/components/profile/time.rs
index fd09ca8cd8e..780a6e9da2f 100644
--- a/components/profile/time.rs
+++ b/components/profile/time.rs
@@ -151,6 +151,7 @@ impl Formattable for ProfilerCategory {
ProfilerCategory::TimeToFirstContentfulPaint => "Time To First Contentful Paint",
ProfilerCategory::TimeToInteractive => "Time to Interactive",
ProfilerCategory::IpcReceiver => "Blocked at IPC Receive",
+ ProfilerCategory::IpcBytesReceiver => "Blocked at IPC Bytes Receive",
ProfilerCategory::ApplicationHeartbeat => "Application Heartbeat",
};
format!("{}{}", padding, name)
diff --git a/components/profile_traits/ipc.rs b/components/profile_traits/ipc.rs
index cd4553ea8bc..7436ef5d5f1 100644
--- a/components/profile_traits/ipc.rs
+++ b/components/profile_traits/ipc.rs
@@ -53,3 +53,33 @@ where
};
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>, bincode::Error> {
+ 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))
+}
diff --git a/components/profile_traits/time.rs b/components/profile_traits/time.rs
index f905348a882..9f3c41740ff 100644
--- a/components/profile_traits/time.rs
+++ b/components/profile_traits/time.rs
@@ -110,6 +110,7 @@ pub enum ProfilerCategory {
TimeToFirstContentfulPaint = 0x81,
TimeToInteractive = 0x82,
IpcReceiver = 0x83,
+ IpcBytesReceiver = 0x84,
ApplicationHeartbeat = 0x90,
}
diff --git a/tests/unit/profile/time.rs b/tests/unit/profile/time.rs
index 19d3a19ee5d..0cd41086065 100644
--- a/tests/unit/profile/time.rs
+++ b/tests/unit/profile/time.rs
@@ -64,6 +64,29 @@ fn channel_profiler_test() {
}
+#[test]
+fn bytes_channel_profiler_test() {
+ let chan = time::Profiler::create(&Some(OutputOptions::Stdout(5.0)), None);
+ let (profiled_sender, profiled_receiver) = ProfiledIpc::bytes_channel(chan.clone()).unwrap();
+ thread::spawn(move || {
+ thread::sleep(Duration::from_secs(2));
+ profiled_sender.send(&[1, 2, 3]).unwrap();
+ });
+
+ let val_profile_receiver = profiled_receiver.recv().unwrap();
+ assert_eq!(val_profile_receiver, [1, 2, 3]);
+
+ let (sender, receiver) = ipc::channel().unwrap();
+ chan.send(ProfilerMsg::Get((ProfilerCategory::IpcBytesReceiver, None), sender.clone()));
+
+ match receiver.recv().unwrap() {
+ // asserts that the time spent in the sleeping thread is more than 1500 milliseconds
+ ProfilerData::Record(time_data) => assert!(time_data[0] > 1.5e3),
+ ProfilerData::NoRecords => assert!(false),
+ };
+
+}
+
#[cfg(debug_assertions)]
#[test]
#[should_panic]