mirror of
https://github.com/servo/servo.git
synced 2025-07-08 16:03:40 +01:00
Add support for IpcBytesReceiver in profile_traits::ipc - #21704
This commit is contained in:
parent
fc0c191246
commit
3e8f7fcefd
4 changed files with 55 additions and 0 deletions
|
@ -151,6 +151,7 @@ impl Formattable for ProfilerCategory {
|
||||||
ProfilerCategory::TimeToFirstContentfulPaint => "Time To First Contentful Paint",
|
ProfilerCategory::TimeToFirstContentfulPaint => "Time To First Contentful Paint",
|
||||||
ProfilerCategory::TimeToInteractive => "Time to Interactive",
|
ProfilerCategory::TimeToInteractive => "Time to Interactive",
|
||||||
ProfilerCategory::IpcReceiver => "Blocked at IPC Receive",
|
ProfilerCategory::IpcReceiver => "Blocked at IPC Receive",
|
||||||
|
ProfilerCategory::IpcBytesReceiver => "Blocked at IPC Bytes Receive",
|
||||||
ProfilerCategory::ApplicationHeartbeat => "Application Heartbeat",
|
ProfilerCategory::ApplicationHeartbeat => "Application Heartbeat",
|
||||||
};
|
};
|
||||||
format!("{}{}", padding, name)
|
format!("{}{}", padding, name)
|
||||||
|
|
|
@ -53,3 +53,33 @@ where
|
||||||
};
|
};
|
||||||
Ok((ipc_sender, profiled_ipc_receiver))
|
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))
|
||||||
|
}
|
||||||
|
|
|
@ -110,6 +110,7 @@ pub enum ProfilerCategory {
|
||||||
TimeToFirstContentfulPaint = 0x81,
|
TimeToFirstContentfulPaint = 0x81,
|
||||||
TimeToInteractive = 0x82,
|
TimeToInteractive = 0x82,
|
||||||
IpcReceiver = 0x83,
|
IpcReceiver = 0x83,
|
||||||
|
IpcBytesReceiver = 0x84,
|
||||||
ApplicationHeartbeat = 0x90,
|
ApplicationHeartbeat = 0x90,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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)]
|
#[cfg(debug_assertions)]
|
||||||
#[test]
|
#[test]
|
||||||
#[should_panic]
|
#[should_panic]
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue