aboutsummaryrefslogtreecommitdiffstats
path: root/components/layout_thread/lib.rs
diff options
context:
space:
mode:
authorGregory Terzian <gterzian@users.noreply.github.com>2018-09-11 15:49:47 +0800
committerGregory Terzian <gterzian@users.noreply.github.com>2018-11-26 14:15:33 +0800
commit4eb785cdc0446539bf5e7eb66bf7ad46ba5705dd (patch)
tree3703ffe374141ff2816b1b3adf6c54ec1bdcf722 /components/layout_thread/lib.rs
parent7c65505df3fff47f43062da20088113631ed9ae0 (diff)
downloadservo-4eb785cdc0446539bf5e7eb66bf7ad46ba5705dd.tar.gz
servo-4eb785cdc0446539bf5e7eb66bf7ad46ba5705dd.zip
introduce a background-hang-monitor:
Mac-Os implementation of a thread sampler, Linux and Windows skeleton implementations.
Diffstat (limited to 'components/layout_thread/lib.rs')
-rw-r--r--components/layout_thread/lib.rs57
1 files changed, 55 insertions, 2 deletions
diff --git a/components/layout_thread/lib.rs b/components/layout_thread/lib.rs
index b5f9c8faf61..611bbbfac00 100644
--- a/components/layout_thread/lib.rs
+++ b/components/layout_thread/lib.rs
@@ -65,8 +65,11 @@ use layout_traits::LayoutThreadFactory;
use libc::c_void;
use malloc_size_of::{MallocSizeOf, MallocSizeOfOps};
use metrics::{PaintTimeMetrics, ProfilerMetadataFactory, ProgressiveWebMetric};
-use msg::constellation_msg::PipelineId;
-use msg::constellation_msg::TopLevelBrowsingContextId;
+use msg::constellation_msg::{
+ BackgroundHangMonitor, BackgroundHangMonitorRegister, HangAnnotation,
+};
+use msg::constellation_msg::{LayoutHangAnnotation, MonitoredComponentType, PipelineId};
+use msg::constellation_msg::{MonitoredComponentId, TopLevelBrowsingContextId};
use net_traits::image_cache::{ImageCache, UsePlaceholder};
use parking_lot::RwLock;
use profile_traits::mem::{self as profile_mem, Report, ReportKind, ReportsChan};
@@ -96,6 +99,7 @@ use std::process;
use std::sync::atomic::{AtomicUsize, Ordering};
use std::sync::{Arc, Mutex, MutexGuard};
use std::thread;
+use std::time::Duration;
use style::animation::Animation;
use style::context::{QuirksMode, RegisteredSpeculativePainter, RegisteredSpeculativePainters};
use style::context::{SharedStyleContext, StyleSystemOptions, ThreadLocalStyleContextCreationInfo};
@@ -150,6 +154,9 @@ pub struct LayoutThread {
/// The channel on which the font cache can send messages to us.
font_cache_sender: IpcSender<()>,
+ /// A means of communication with the background hang monitor.
+ background_hang_monitor: Box<BackgroundHangMonitor>,
+
/// The channel on which messages can be sent to the constellation.
constellation_chan: IpcSender<ConstellationMsg>,
@@ -253,6 +260,7 @@ impl LayoutThreadFactory for LayoutThread {
is_iframe: bool,
chan: (Sender<Msg>, Receiver<Msg>),
pipeline_port: IpcReceiver<LayoutControlMsg>,
+ background_hang_monitor_register: Box<BackgroundHangMonitorRegister>,
constellation_chan: IpcSender<ConstellationMsg>,
script_chan: IpcSender<ConstellationControlMsg>,
image_cache: Arc<dyn ImageCache>,
@@ -276,6 +284,14 @@ impl LayoutThreadFactory for LayoutThread {
{
// Ensures layout thread is destroyed before we send shutdown message
let sender = chan.0;
+
+ let background_hang_monitor = background_hang_monitor_register
+ .register_component(
+ MonitoredComponentId(id, MonitoredComponentType::Layout),
+ Duration::from_millis(1000),
+ Duration::from_millis(5000),
+ );
+
let layout = LayoutThread::new(
id,
top_level_browsing_context_id,
@@ -283,6 +299,7 @@ impl LayoutThreadFactory for LayoutThread {
is_iframe,
chan.1,
pipeline_port,
+ background_hang_monitor,
constellation_chan,
script_chan,
image_cache.clone(),
@@ -444,6 +461,7 @@ impl LayoutThread {
is_iframe: bool,
port: Receiver<Msg>,
pipeline_port: IpcReceiver<LayoutControlMsg>,
+ background_hang_monitor: Box<BackgroundHangMonitor>,
constellation_chan: IpcSender<ConstellationMsg>,
script_chan: IpcSender<ConstellationControlMsg>,
image_cache: Arc<dyn ImageCache>,
@@ -493,6 +511,7 @@ impl LayoutThread {
port: port,
pipeline_port: pipeline_receiver,
script_chan: script_chan.clone(),
+ background_hang_monitor,
constellation_chan: constellation_chan.clone(),
time_profiler_chan: time_profiler_chan,
mem_profiler_chan: mem_profiler_chan,
@@ -605,6 +624,34 @@ impl LayoutThread {
}
}
+ fn notify_activity_to_hang_monitor(&self, request: &Msg) {
+ let hang_annotation = match request {
+ Msg::AddStylesheet(..) => LayoutHangAnnotation::AddStylesheet,
+ Msg::RemoveStylesheet(..) => LayoutHangAnnotation::RemoveStylesheet,
+ Msg::SetQuirksMode(..) => LayoutHangAnnotation::SetQuirksMode,
+ Msg::Reflow(..) => LayoutHangAnnotation::Reflow,
+ Msg::GetRPC(..) => LayoutHangAnnotation::GetRPC,
+ Msg::TickAnimations => LayoutHangAnnotation::TickAnimations,
+ Msg::AdvanceClockMs(..) => LayoutHangAnnotation::AdvanceClockMs,
+ Msg::ReapStyleAndLayoutData(..) => LayoutHangAnnotation::ReapStyleAndLayoutData,
+ Msg::CollectReports(..) => LayoutHangAnnotation::CollectReports,
+ Msg::PrepareToExit(..) => LayoutHangAnnotation::PrepareToExit,
+ Msg::ExitNow => LayoutHangAnnotation::ExitNow,
+ Msg::GetCurrentEpoch(..) => LayoutHangAnnotation::GetCurrentEpoch,
+ Msg::GetWebFontLoadState(..) => LayoutHangAnnotation::GetWebFontLoadState,
+ Msg::CreateLayoutThread(..) => LayoutHangAnnotation::CreateLayoutThread,
+ Msg::SetFinalUrl(..) => LayoutHangAnnotation::SetFinalUrl,
+ Msg::SetScrollStates(..) => LayoutHangAnnotation::SetScrollStates,
+ Msg::UpdateScrollStateFromScript(..) => {
+ LayoutHangAnnotation::UpdateScrollStateFromScript
+ },
+ Msg::RegisterPaint(..) => LayoutHangAnnotation::RegisterPaint,
+ Msg::SetNavigationStart(..) => LayoutHangAnnotation::SetNavigationStart,
+ };
+ self.background_hang_monitor
+ .notify_activity(HangAnnotation::Layout(hang_annotation));
+ }
+
/// Receives and dispatches messages from the script and constellation threads
fn handle_request<'a, 'b>(&mut self, possibly_locked_rw_data: &mut RwData<'a, 'b>) -> bool {
enum Request {
@@ -613,6 +660,9 @@ impl LayoutThread {
FromFontCache,
}
+ // Notify the background-hang-monitor we are waiting for an event.
+ self.background_hang_monitor.notify_wait();
+
let request = select! {
recv(self.pipeline_port) -> msg => Request::FromPipeline(msg.unwrap()),
recv(self.port) -> msg => Request::FromScript(msg.unwrap()),
@@ -659,6 +709,8 @@ impl LayoutThread {
request: Msg,
possibly_locked_rw_data: &mut RwData<'a, 'b>,
) -> bool {
+ self.notify_activity_to_hang_monitor(&request);
+
match request {
Msg::AddStylesheet(stylesheet, before_stylesheet) => {
let guard = stylesheet.shared_lock.read();
@@ -815,6 +867,7 @@ impl LayoutThread {
info.is_parent,
info.layout_pair,
info.pipeline_port,
+ info.background_hang_monitor_register,
info.constellation_chan,
info.script_chan.clone(),
info.image_cache.clone(),