diff options
-rw-r--r-- | components/profile/time.rs | 1 | ||||
-rw-r--r-- | components/profile_traits/ipc.rs | 30 | ||||
-rw-r--r-- | components/profile_traits/time.rs | 1 | ||||
-rw-r--r-- | tests/unit/profile/time.rs | 23 |
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] |