aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--components/devtools/actors/timeline.rs77
-rw-r--r--components/devtools_traits/lib.rs39
-rw-r--r--components/script/dom/window.rs15
-rw-r--r--components/script/script_task.rs15
4 files changed, 47 insertions, 99 deletions
diff --git a/components/devtools/actors/timeline.rs b/components/devtools/actors/timeline.rs
index 17327b1043e..b38b85a97b5 100644
--- a/components/devtools/actors/timeline.rs
+++ b/components/devtools/actors/timeline.rs
@@ -6,7 +6,6 @@ use ipc_channel::ipc::{self, IpcReceiver, IpcSender};
use msg::constellation_msg::PipelineId;
use rustc_serialize::{json, Encoder, Encodable};
use std::cell::RefCell;
-use std::collections::{HashMap, VecDeque};
use std::net::TcpStream;
use std::sync::mpsc::channel;
use std::sync::{Arc, Mutex};
@@ -17,7 +16,7 @@ use actors::framerate::FramerateActor;
use actors::memory::{MemoryActor, TimelineMemoryReply};
use devtools_traits::DevtoolScriptControlMsg;
use devtools_traits::DevtoolScriptControlMsg::{SetTimelineMarkers, DropTimelineMarkers};
-use devtools_traits::{PreciseTime, TimelineMarker, TracingMetadata, TimelineMarkerType};
+use devtools_traits::{PreciseTime, TimelineMarker, TimelineMarkerType};
use protocol::JsonPacketStream;
use util::task;
@@ -148,72 +147,15 @@ impl TimelineActor {
return;
}
- /// Select root(with depth 0) TimelineMarker pair (IntervalStart + IntervalEnd)
- /// from queue and add marker to emitter
- /// Return true if closed (IntervalStart + IntervalEnd) pair was founded
- fn group(queue: &mut VecDeque<TimelineMarker>, depth: usize,
- start_payload: Option<TimelineMarker>, emitter: &Emitter,
- markers: &mut Vec<TimelineMarkerReply>) -> bool {
-
- if let Some(start_payload) = start_payload {
- if start_payload.metadata != TracingMetadata::IntervalStart {
- panic!("Start payload doesn't have metadata IntervalStart");
- }
-
- if let Some(end_payload) = queue.pop_front() {
- match end_payload.metadata {
- TracingMetadata::IntervalEnd => {
- if depth == 0 {
- // Emit TimelineMarkerReply, pair was found
- markers.push(emitter.marker(start_payload, end_payload));
- }
- return true;
- }
- TracingMetadata::IntervalStart => {
- if group(queue, depth + 1, Some(end_payload), emitter, markers) {
- return group(queue, depth, Some(start_payload), emitter, markers);
- } else {
- queue.push_front(start_payload);
- }
- }
- _ => panic!("Unknown tracingMetadata")
- }
- } else {
- queue.push_front(start_payload);
- }
- }
-
- false
- }
-
task::spawn_named("PullTimelineMarkers".to_string(), move || {
- let mut queues = HashMap::new();
- queues.insert("Reflow".to_string(), VecDeque::new());
- queues.insert("DOMEvent".to_string(), VecDeque::new());
-
loop {
if !*is_recording.lock().unwrap() {
break;
}
- // Creating queues by marker.name
- loop {
- match receiver.try_recv() {
- Ok(marker) => {
- if let Some(list) = queues.get_mut(&marker.name) {
- list.push_back(marker);
- }
- }
-
- Err(_) => break
- }
- }
-
- // Emit all markers
let mut markers = vec![];
- for (_, queue) in &mut queues {
- let start_payload = queue.pop_front();
- group(queue, 0, start_payload, &emitter, &mut markers);
+ while let Ok(marker) = receiver.try_recv() {
+ markers.push(emitter.marker(marker));
}
emitter.send(markers);
@@ -336,14 +278,13 @@ impl Emitter {
}
}
- fn marker(&self, start_payload: TimelineMarker, end_payload: TimelineMarker)
- -> TimelineMarkerReply {
+ fn marker(&self, payload: TimelineMarker) -> TimelineMarkerReply {
TimelineMarkerReply {
- name: start_payload.name,
- start: HighResolutionStamp::new(self.start_stamp, start_payload.time),
- end: HighResolutionStamp::new(self.start_stamp, end_payload.time),
- stack: start_payload.stack,
- endStack: end_payload.stack,
+ name: payload.name,
+ start: HighResolutionStamp::new(self.start_stamp, payload.start_time),
+ end: HighResolutionStamp::new(self.start_stamp, payload.end_time),
+ stack: payload.start_stack,
+ endStack: payload.end_stack,
}
}
diff --git a/components/devtools_traits/lib.rs b/components/devtools_traits/lib.rs
index 8df97634fad..c8889fcd5fb 100644
--- a/components/devtools_traits/lib.rs
+++ b/components/devtools_traits/lib.rs
@@ -124,21 +124,19 @@ pub struct NodeInfo {
pub incompleteValue: bool,
}
-#[derive(PartialEq, Eq, Deserialize, Serialize)]
-pub enum TracingMetadata {
- Default,
- IntervalStart,
- IntervalEnd,
- Event,
- EventBacktrace,
+pub struct StartedTimelineMarker {
+ name: String,
+ start_time: PreciseTime,
+ start_stack: Option<Vec<()>>,
}
#[derive(Deserialize, Serialize)]
pub struct TimelineMarker {
pub name: String,
- pub metadata: TracingMetadata,
- pub time: PreciseTime,
- pub stack: Option<Vec<()>>,
+ pub start_time: PreciseTime,
+ pub start_stack: Option<Vec<()>>,
+ pub end_time: PreciseTime,
+ pub end_stack: Option<Vec<()>>,
}
#[derive(PartialEq, Eq, Hash, Clone, Deserialize, Serialize)]
@@ -270,12 +268,23 @@ pub enum NetworkEvent {
}
impl TimelineMarker {
- pub fn new(name: String, metadata: TracingMetadata) -> TimelineMarker {
- TimelineMarker {
+ pub fn start(name: String) -> StartedTimelineMarker {
+ StartedTimelineMarker {
name: name,
- metadata: metadata,
- time: PreciseTime::now(),
- stack: None,
+ start_time: PreciseTime::now(),
+ start_stack: None,
+ }
+ }
+}
+
+impl StartedTimelineMarker {
+ pub fn end(self) -> TimelineMarker {
+ TimelineMarker {
+ name: self.name,
+ start_time: self.start_time,
+ start_stack: self.start_stack,
+ end_time: PreciseTime::now(),
+ end_stack: None,
}
}
}
diff --git a/components/script/dom/window.rs b/components/script/dom/window.rs
index 8bce4247a4a..6fd99de5b4d 100644
--- a/components/script/dom/window.rs
+++ b/components/script/dom/window.rs
@@ -40,7 +40,6 @@ use timers::{IsInterval, TimerId, TimerManager, TimerCallback};
use webdriver_handlers::jsval_to_webdriver;
use devtools_traits::{ScriptToDevtoolsControlMsg, TimelineMarker, TimelineMarkerType};
-use devtools_traits::{TracingMetadata};
use msg::compositor_msg::ScriptToCompositorMsg;
use msg::constellation_msg::{LoadData, PipelineId, SubpageId, ConstellationChan, WindowSizeData, WorkerId};
use msg::webdriver_msg::{WebDriverJSError, WebDriverJSResult};
@@ -681,10 +680,11 @@ impl Window {
debug!("script: performing reflow for goal {:?} reason {:?}", goal, reason);
- if self.need_emit_timeline_marker(TimelineMarkerType::Reflow) {
- let marker = TimelineMarker::new("Reflow".to_owned(), TracingMetadata::IntervalStart);
- self.emit_timeline_marker(marker);
- }
+ let marker = if self.need_emit_timeline_marker(TimelineMarkerType::Reflow) {
+ Some(TimelineMarker::start("Reflow".to_owned()))
+ } else {
+ None
+ };
// Layout will let us know when it's done.
let (join_chan, join_port) = channel();
@@ -725,9 +725,8 @@ impl Window {
self.pending_reflow_count.set(0);
- if self.need_emit_timeline_marker(TimelineMarkerType::Reflow) {
- let marker = TimelineMarker::new("Reflow".to_owned(), TracingMetadata::IntervalEnd);
- self.emit_timeline_marker(marker);
+ if let Some(marker) = marker {
+ self.emit_timeline_marker(marker.end());
}
}
diff --git a/components/script/script_task.rs b/components/script/script_task.rs
index 5ae982bbee5..1ab86d67570 100644
--- a/components/script/script_task.rs
+++ b/components/script/script_task.rs
@@ -52,8 +52,8 @@ use timers::TimerId;
use webdriver_handlers;
use devtools_traits::{DevtoolsPageInfo, DevtoolScriptControlMsg};
-use devtools_traits::{ScriptToDevtoolsControlMsg, TimelineMarker, TimelineMarkerType};
-use devtools_traits::{TracingMetadata};
+use devtools_traits::{ScriptToDevtoolsControlMsg, TimelineMarker};
+use devtools_traits::{StartedTimelineMarker, TimelineMarkerType};
use msg::compositor_msg::{LayerId, ScriptToCompositorMsg};
use msg::constellation_msg::Msg as ConstellationMsg;
use msg::constellation_msg::{ConstellationChan, FocusType};
@@ -2016,23 +2016,22 @@ impl Drop for ScriptTask {
}
struct AutoDOMEventMarker<'a> {
- script_task: &'a ScriptTask
+ script_task: &'a ScriptTask,
+ marker: Option<StartedTimelineMarker>,
}
impl<'a> AutoDOMEventMarker<'a> {
fn new(script_task: &'a ScriptTask) -> AutoDOMEventMarker<'a> {
- let marker = TimelineMarker::new("DOMEvent".to_owned(), TracingMetadata::IntervalStart);
- script_task.emit_timeline_marker(marker);
AutoDOMEventMarker {
- script_task: script_task
+ script_task: script_task,
+ marker: Some(TimelineMarker::start("DOMEvent".to_owned())),
}
}
}
impl<'a> Drop for AutoDOMEventMarker<'a> {
fn drop(&mut self) {
- let marker = TimelineMarker::new("DOMEvent".to_owned(), TracingMetadata::IntervalEnd);
- self.script_task.emit_timeline_marker(marker);
+ self.script_task.emit_timeline_marker(self.marker.take().unwrap().end());
}
}