aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimon Sapin <simon.sapin@exyr.org>2020-06-04 13:54:09 +0200
committerSimon Sapin <simon.sapin@exyr.org>2020-06-04 16:39:08 +0200
commit0abe90647f4548d0e35c8d9107b81e45ea739226 (patch)
tree158d2623f4d8cdf53ce1e3e03e004092e29f221d
parentd4f1f4641dbb4b44f7d2b507f4fb4a5ae875626d (diff)
downloadservo-0abe90647f4548d0e35c8d9107b81e45ea739226.tar.gz
servo-0abe90647f4548d0e35c8d9107b81e45ea739226.zip
Remove support for energy profiling
-rw-r--r--Cargo.lock45
-rw-r--r--components/layout_thread/lib.rs2
-rw-r--r--components/metrics/lib.rs2
-rw-r--r--components/profile/README.md28
-rw-r--r--components/profile/time.rs36
-rw-r--r--components/profile/trace_dump.rs9
-rw-r--r--components/profile_traits/Cargo.toml5
-rw-r--r--components/profile_traits/energy.rs62
-rw-r--r--components/profile_traits/lib.rs2
-rw-r--r--components/profile_traits/time.rs27
-rw-r--r--components/servo/Cargo.toml1
-rw-r--r--ports/libsimpleservo/api/Cargo.toml1
-rw-r--r--ports/libsimpleservo/capi/Cargo.toml1
-rw-r--r--ports/libsimpleservo/jniapi/Cargo.toml1
-rw-r--r--ports/winit/Cargo.toml1
15 files changed, 8 insertions, 215 deletions
diff --git a/Cargo.lock b/Cargo.lock
index 1354dbb1d7b..4c6921b4845 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -1378,49 +1378,6 @@ dependencies = [
]
[[package]]
-name = "energy-monitor"
-version = "0.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fe872d0664f1cc60db36349af245d892ee67d3c8f78055df0ebc43271fd4e05c"
-
-[[package]]
-name = "energymon"
-version = "0.3.0"
-source = "git+https://github.com/energymon/energymon-rust.git#89daf8f37858eab96ad8eec7cc81accb17b2411e"
-dependencies = [
- "energy-monitor",
- "energymon-default-sys",
- "libc",
-]
-
-[[package]]
-name = "energymon-builder"
-version = "0.3.0"
-source = "git+https://github.com/energymon/energymon-sys.git#f8d77ea2906b25f9c0fd358aa9d300a46dc3e97c"
-dependencies = [
- "cmake",
- "pkg-config",
-]
-
-[[package]]
-name = "energymon-default-sys"
-version = "0.3.0"
-source = "git+https://github.com/energymon/energymon-sys.git#f8d77ea2906b25f9c0fd358aa9d300a46dc3e97c"
-dependencies = [
- "energymon-builder",
- "energymon-sys",
- "libc",
-]
-
-[[package]]
-name = "energymon-sys"
-version = "0.3.0"
-source = "git+https://github.com/energymon/energymon-sys.git#f8d77ea2906b25f9c0fd358aa9d300a46dc3e97c"
-dependencies = [
- "libc",
-]
-
-[[package]]
name = "enum-iterator"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -4241,8 +4198,6 @@ name = "profile_traits"
version = "0.0.1"
dependencies = [
"crossbeam-channel",
- "energy-monitor",
- "energymon",
"ipc-channel",
"log",
"serde",
diff --git a/components/layout_thread/lib.rs b/components/layout_thread/lib.rs
index 82da02d1ce3..920345cbd47 100644
--- a/components/layout_thread/lib.rs
+++ b/components/layout_thread/lib.rs
@@ -1456,8 +1456,6 @@ impl LayoutThread {
&self.time_profiler_chan,
0,
text_shaping_time as u64,
- 0,
- 0,
);
// Retrieve the (possibly rebuilt) root flow.
diff --git a/components/metrics/lib.rs b/components/metrics/lib.rs
index 1165c8f45ca..ad6ef52e3ca 100644
--- a/components/metrics/lib.rs
+++ b/components/metrics/lib.rs
@@ -81,8 +81,6 @@ fn set_metric<U: ProgressiveWebMetric>(
&pwm.get_time_profiler_chan(),
time,
time,
- 0,
- 0,
);
// Print the metric to console if the print-pwm option was given.
diff --git a/components/profile/README.md b/components/profile/README.md
index cc98292c03f..85cd0747b6d 100644
--- a/components/profile/README.md
+++ b/components/profile/README.md
@@ -62,31 +62,3 @@ Time is measured in nanoseconds and energy is measured in microjoules.
`Work`, `Time`, and `Energy` also have `Global` and `Window` values which are the summed over the entire runtime and sliding window period, respectively.
`Perf` (performance) and `Pwr` (power) have `Global`, `Window`, and `Instant` values as described above.
-
-
-# Energy Profiling
-
-Energy monitoring is hardware and platform-specific, so it is only enabled with the `energy-profiling` feature.
-
-To use energy profiling, you must have a compatible `energymon-default` implementation installed to your system as `energymon-default-static` when building Servo.
-Otherwise a default dummy implementation is used.
-The library is linked through a chain of dependencies:
-
-* servo::profile_traits
- * energymon - Rust abstractions
- * energymon-default-sys - Rust bindings to `energymon-default.h`
- * energymon-default-static: A statically linked C library installed to the system that implements `energymon.h` and `energymon-default.h`
-
-For instructions on building existing native libraries, visit the [energymon project source](https://github.com/energymon/energymon).
-You may also write your own implementation of `energymon.h` and `energymon-default.h` and install it as `energymon-default-static` where pkg-config can find it.
-
-Once you install the proper library, you will need to rebuild the `energymon-default-sys` crate.
-The most straightforward way to do this is to do a clean build of Servo.
-
-To build Servo with the `energy-profiling` feature enabled, pass `--features "energy-profiling"` to the `mach` command, e.g.:
-
-```sh
-./mach build -r --features "energy-profiling"
-```
-
-When running Servo, you will want to enable the desired Heartbeats to record the results.
diff --git a/components/profile/time.rs b/components/profile/time.rs
index 59cc376acab..178d0473370 100644
--- a/components/profile/time.rs
+++ b/components/profile/time.rs
@@ -7,14 +7,12 @@
use crate::heartbeats;
use crate::trace_dump::TraceDump;
use ipc_channel::ipc::{self, IpcReceiver};
-use profile_traits::energy::{energy_interval_ms, read_energy_uj};
use profile_traits::time::{
ProfilerCategory, ProfilerChan, ProfilerData, ProfilerMsg, TimerMetadata,
};
use profile_traits::time::{TimerMetadataFrameType, TimerMetadataReflowType};
use servo_config::opts::OutputOptions;
use std::borrow::ToOwned;
-use std::cmp::Ordering;
use std::collections::{BTreeMap, HashMap};
use std::fs::File;
use std::io::{self, Write};
@@ -253,22 +251,15 @@ impl Profiler {
};
if run_ap_thread() {
let profiler_chan = profiler_chan.clone();
- // min of 1 heartbeat/sec, max of 20 should provide accurate enough power/energy readings
+ // min of 1 heartbeat/sec, max of 20 should provide accurate enough readings
// waking up more frequently allows the thread to end faster on exit
const SLEEP_MS: u32 = 10;
- const MIN_ENERGY_INTERVAL_MS: u32 = 50;
- const MAX_ENERGY_INTERVAL_MS: u32 = 1000;
- let interval_ms = enforce_range(
- MIN_ENERGY_INTERVAL_MS,
- MAX_ENERGY_INTERVAL_MS,
- energy_interval_ms(),
- );
+ let interval_ms = 200;
let loop_count: u32 = (interval_ms as f32 / SLEEP_MS as f32).ceil() as u32;
thread::Builder::new()
.name("Application heartbeat profiler".to_owned())
.spawn(move || {
let mut start_time = precise_time_ns();
- let mut start_energy = read_energy_uj();
loop {
for _ in 0..loop_count {
if run_ap_thread() {
@@ -278,7 +269,6 @@ impl Profiler {
}
}
let end_time = precise_time_ns();
- let end_energy = read_energy_uj();
// send using the inner channel
// (using ProfilerChan.send() forces an unwrap
// and sometimes panics for this background profiler)
@@ -286,12 +276,10 @@ impl Profiler {
if let Err(_) = c.send(ProfilerMsg::Time(
(ProfilerCategory::ApplicationHeartbeat, None),
(start_time, end_time),
- (start_energy, end_energy),
)) {
return;
}
start_time = end_time;
- start_energy = end_energy;
}
})
.expect("Thread spawning failed");
@@ -331,10 +319,10 @@ impl Profiler {
fn handle_msg(&mut self, msg: ProfilerMsg) -> bool {
match msg.clone() {
- ProfilerMsg::Time(k, t, e) => {
- heartbeats::maybe_heartbeat(&k.0, t.0, t.1, e.0, e.1, self.profile_heartbeats);
+ ProfilerMsg::Time(k, t) => {
+ heartbeats::maybe_heartbeat(&k.0, t.0, t.1, 0, 0, self.profile_heartbeats);
if let Some(ref mut trace) = self.trace {
- trace.write_one(&k, t, e);
+ trace.write_one(&k, t);
}
let ms = (t.1 - t.0) as f64 / 1000000f64;
self.find_or_insert(k, ms);
@@ -475,20 +463,6 @@ impl Profiler {
}
}
-fn enforce_range<T>(min: T, max: T, value: T) -> T
-where
- T: Ord,
-{
- assert!(min <= max);
- match value.cmp(&max) {
- Ordering::Equal | Ordering::Greater => max,
- Ordering::Less => match value.cmp(&min) {
- Ordering::Equal | Ordering::Less => min,
- Ordering::Greater => value,
- },
- }
-}
-
pub fn duration_from_seconds(secs: f64) -> Duration {
pub const NANOS_PER_SEC: u32 = 1_000_000_000;
diff --git a/components/profile/trace_dump.rs b/components/profile/trace_dump.rs
index 896bce9cb63..2833e3bd26d 100644
--- a/components/profile/trace_dump.rs
+++ b/components/profile/trace_dump.rs
@@ -25,12 +25,6 @@ struct TraceEntry {
#[serde(rename = "endTime")]
end_time: u64,
-
- #[serde(rename = "startEnergy")]
- start_energy: u64,
-
- #[serde(rename = "endEnergy")]
- end_energy: u64,
}
impl TraceDump {
@@ -50,15 +44,12 @@ impl TraceDump {
&mut self,
category: &(ProfilerCategory, Option<TimerMetadata>),
time: (u64, u64),
- energy: (u64, u64),
) {
let entry = TraceEntry {
category: category.0,
metadata: category.1.clone(),
start_time: time.0,
end_time: time.1,
- start_energy: energy.0,
- end_energy: energy.1,
};
serde_json::to_writer(&mut self.file, &entry).unwrap();
writeln!(&mut self.file, ",").unwrap();
diff --git a/components/profile_traits/Cargo.toml b/components/profile_traits/Cargo.toml
index 118d60caa17..519170dc0c7 100644
--- a/components/profile_traits/Cargo.toml
+++ b/components/profile_traits/Cargo.toml
@@ -10,13 +10,8 @@ publish = false
name = "profile_traits"
path = "lib.rs"
-[features]
-energy-profiling = ["energy-monitor", "energymon"]
-
[dependencies]
crossbeam-channel = "0.4"
-energy-monitor = { version = "0.2.0", optional = true }
-energymon = { git = "https://github.com/energymon/energymon-rust.git", optional = true }
ipc-channel = "0.14"
log = "0.4"
serde = "1.0"
diff --git a/components/profile_traits/energy.rs b/components/profile_traits/energy.rs
deleted file mode 100644
index 1753531b940..00000000000
--- a/components/profile_traits/energy.rs
+++ /dev/null
@@ -1,62 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
-
-#[cfg(feature = "energy-profiling")]
-pub fn read_energy_uj() -> u64 {
- energymon::read_energy_uj()
-}
-
-#[cfg(not(feature = "energy-profiling"))]
-pub fn read_energy_uj() -> u64 {
- 0
-}
-
-#[cfg(feature = "energy-profiling")]
-pub fn energy_interval_ms() -> u32 {
- energymon::get_min_interval_ms()
-}
-
-#[cfg(not(feature = "energy-profiling"))]
-pub fn energy_interval_ms() -> u32 {
- 1000
-}
-
-#[cfg(feature = "energy-profiling")]
-mod energymon {
- extern crate energy_monitor;
- extern crate energymon;
-
- use self::energy_monitor::EnergyMonitor;
- use self::energymon::EnergyMon;
- use std::sync::{Once, ONCE_INIT};
-
- static mut EM: Option<*mut EnergyMon> = None;
-
- fn init() {
- // can't use lazy_static macro for EM (no Sync trait for EnergyMon)
- static ONCE: Once = ONCE_INIT;
- ONCE.call_once(|| {
- if let Ok(em) = EnergyMon::new() {
- println!("Started energy monitoring from: {}", em.source());
- unsafe {
- EM = Some(Box::into_raw(Box::new(em)));
- }
- }
- });
- }
-
- /// Read energy from the energy monitor, otherwise return 0.
- pub fn read_energy_uj() -> u64 {
- init();
- unsafe {
- // EnergyMon implementations of EnergyMonitor always return a value
- EM.map_or(0, |em| (*em).read_uj().unwrap())
- }
- }
-
- pub fn get_min_interval_ms() -> u32 {
- init();
- unsafe { EM.map_or(0, |em| ((*em).interval_us() as f64 / 1000.0).ceil() as u32) }
- }
-}
diff --git a/components/profile_traits/lib.rs b/components/profile_traits/lib.rs
index c1e94fa8641..7e0ce8166d0 100644
--- a/components/profile_traits/lib.rs
+++ b/components/profile_traits/lib.rs
@@ -13,8 +13,6 @@ extern crate log;
#[macro_use]
extern crate serde;
-#[allow(unsafe_code)]
-pub mod energy;
pub mod ipc;
pub mod mem;
pub mod time;
diff --git a/components/profile_traits/time.rs b/components/profile_traits/time.rs
index 91a99fe18c4..043c0c4cb21 100644
--- a/components/profile_traits/time.rs
+++ b/components/profile_traits/time.rs
@@ -2,7 +2,6 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
-use crate::energy::read_energy_uj;
use ipc_channel::ipc::IpcSender;
use servo_config::opts;
use time::precise_time_ns;
@@ -34,11 +33,7 @@ pub enum ProfilerData {
#[derive(Clone, Debug, Deserialize, Serialize)]
pub enum ProfilerMsg {
/// Normal message used for reporting time
- Time(
- (ProfilerCategory, Option<TimerMetadata>),
- (u64, u64),
- (u64, u64),
- ),
+ Time((ProfilerCategory, Option<TimerMetadata>), (u64, u64)),
/// Message used to get time spend entries for a particular ProfilerBuckets (in nanoseconds)
Get(
(ProfilerCategory, Option<TimerMetadata>),
@@ -142,26 +137,16 @@ where
if opts::get().signpost {
signpost::start(category as u32, &[0, 0, 0, (category as usize) >> 4]);
}
- let start_energy = read_energy_uj();
let start_time = precise_time_ns();
let val = callback();
let end_time = precise_time_ns();
- let end_energy = read_energy_uj();
if opts::get().signpost {
signpost::end(category as u32, &[0, 0, 0, (category as usize) >> 4]);
}
- send_profile_data(
- category,
- meta,
- &profiler_chan,
- start_time,
- end_time,
- start_energy,
- end_energy,
- );
+ send_profile_data(category, meta, &profiler_chan, start_time, end_time);
val
}
@@ -171,12 +156,6 @@ pub fn send_profile_data(
profiler_chan: &ProfilerChan,
start_time: u64,
end_time: u64,
- start_energy: u64,
- end_energy: u64,
) {
- profiler_chan.send(ProfilerMsg::Time(
- (category, meta),
- (start_time, end_time),
- (start_energy, end_energy),
- ));
+ profiler_chan.send(ProfilerMsg::Time((category, meta), (start_time, end_time)));
}
diff --git a/components/servo/Cargo.toml b/components/servo/Cargo.toml
index e7bcc1f352f..1cb332e3da9 100644
--- a/components/servo/Cargo.toml
+++ b/components/servo/Cargo.toml
@@ -14,7 +14,6 @@ crate-type = ["rlib"]
[features]
debugmozjs = ["script/debugmozjs"]
egl = ["mozangle/egl"]
-energy-profiling = ["profile_traits/energy-profiling"]
googlevr = ["webxr/googlevr"]
jitspew = ["script/jitspew"]
js_backtrace = ["script/js_backtrace"]
diff --git a/ports/libsimpleservo/api/Cargo.toml b/ports/libsimpleservo/api/Cargo.toml
index eb5234dc05e..9fd37846f8e 100644
--- a/ports/libsimpleservo/api/Cargo.toml
+++ b/ports/libsimpleservo/api/Cargo.toml
@@ -35,7 +35,6 @@ gl_generator = "0.14"
debugmozjs = ["libservo/debugmozjs"]
default = ["webdriver", "max_log_level"]
egl = ["libservo/egl"]
-energy-profiling = ["libservo/energy-profiling"]
googlevr = ["libservo/googlevr"]
jitspew = ["libservo/jitspew"]
js_backtrace = ["libservo/js_backtrace"]
diff --git a/ports/libsimpleservo/capi/Cargo.toml b/ports/libsimpleservo/capi/Cargo.toml
index db54c674e14..ff481da0672 100644
--- a/ports/libsimpleservo/capi/Cargo.toml
+++ b/ports/libsimpleservo/capi/Cargo.toml
@@ -31,7 +31,6 @@ cbindgen = "0.14"
debugmozjs = ["simpleservo/debugmozjs"]
default = ["webdriver", "max_log_level"]
egl = ["simpleservo/egl"]
-energy-profiling = ["simpleservo/energy-profiling"]
googlevr = ["simpleservo/googlevr"]
jitspew = ["simpleservo/jitspew"]
js_backtrace = ["simpleservo/js_backtrace"]
diff --git a/ports/libsimpleservo/jniapi/Cargo.toml b/ports/libsimpleservo/jniapi/Cargo.toml
index c86f68a9ac2..748653e1894 100644
--- a/ports/libsimpleservo/jniapi/Cargo.toml
+++ b/ports/libsimpleservo/jniapi/Cargo.toml
@@ -30,7 +30,6 @@ cc = "1.0"
debugmozjs = ["simpleservo/debugmozjs"]
default = ["webdriver", "max_log_level"]
egl = ["simpleservo/egl"]
-energy-profiling = ["simpleservo/energy-profiling"]
googlevr = ["simpleservo/googlevr"]
js_backtrace = ["simpleservo/js_backtrace"]
layout-2013 = ["simpleservo/layout-2013"]
diff --git a/ports/winit/Cargo.toml b/ports/winit/Cargo.toml
index 03ec4b4e2ae..1850f8acbdd 100644
--- a/ports/winit/Cargo.toml
+++ b/ports/winit/Cargo.toml
@@ -30,7 +30,6 @@ ProductName = "Servo"
debugmozjs = ["libservo/debugmozjs"]
default = ["webdriver", "max_log_level"]
egl = ["libservo/egl"]
-energy-profiling = ["libservo/energy-profiling"]
jitspew = ["libservo/jitspew"]
js_backtrace = ["libservo/js_backtrace"]
layout-2013 = ["libservo/layout-2013"]