diff --git a/.gitignore b/.gitignore index 2d96fbde73a..19738f1b45d 100644 --- a/.gitignore +++ b/.gitignore @@ -23,6 +23,7 @@ .coverage .DS_Store Servo.app +servo.pftrace .config.mk.last /glfw webrender-captures/ diff --git a/Cargo.lock b/Cargo.lock index 4a2644b43e8..ab30fcf7283 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -782,6 +782,15 @@ dependencies = [ "error-code", ] +[[package]] +name = "cmake" +version = "0.1.51" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb1e43aa7fd152b1f968787f7dbcdeb306d1867ff373c69955211876c053f91a" +dependencies = [ + "cc", +] + [[package]] name = "cocoa" version = "0.25.0" @@ -1798,6 +1807,12 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "86d4de0081402f5e88cdac65c8dcdcc73118c1a7a465e2a05f0da05843a8ea33" +[[package]] +name = "fixedbitset" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" + [[package]] name = "flate2" version = "1.0.33" @@ -4141,6 +4156,15 @@ dependencies = [ "tendril", ] +[[package]] +name = "matchers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +dependencies = [ + "regex-automata 0.1.10", +] + [[package]] name = "matches" version = "0.1.10" @@ -4367,6 +4391,12 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "956787520e75e9bd233246045d19f42fb73242759cc57fba9611d940ae96d4b0" +[[package]] +name = "multimap" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "defc4c55412d89136f966bbb339008b474350e5e6e78d2714439c386b3137a03" + [[package]] name = "naga" version = "22.0.0" @@ -4593,6 +4623,16 @@ dependencies = [ "minimal-lexical", ] +[[package]] +name = "nu-ansi-term" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +dependencies = [ + "overload", + "winapi", +] + [[package]] name = "num-bigint" version = "0.4.6" @@ -4842,6 +4882,12 @@ version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a86ed3f5f244b372d6b1a00b72ef7f8876d0bc6a78a4c9985c53614041512063" +[[package]] +name = "overload" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" + [[package]] name = "owned_ttf_parser" version = "0.24.0" @@ -4932,10 +4978,20 @@ version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c3659d1ee90221741f65dd128d9998311b0e40c5d3c23a62445938214abce4f" dependencies = [ - "fixedbitset", + "fixedbitset 0.1.9", "ordermap", ] +[[package]] +name = "petgraph" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" +dependencies = [ + "fixedbitset 0.4.2", + "indexmap", +] + [[package]] name = "phf" version = "0.10.1" @@ -5134,6 +5190,16 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e8cf8e6a8aa66ce33f63993ffc4ea4271eb5b0530a9002db8455ea6050c77bfa" +[[package]] +name = "prettyplease" +version = "0.2.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479cf940fbbb3426c32c5d5176f62ad57549a0bb84773423ba8be9d089f5faba" +dependencies = [ + "proc-macro2", + "syn", +] + [[package]] name = "proc-macro-crate" version = "3.1.0" @@ -5196,6 +5262,68 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43d84d1d7a6ac92673717f9f6d1518374ef257669c24ebc5ac25d5033828be58" +[[package]] +name = "prost" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "deb1435c188b76130da55f17a466d252ff7b1418b2ad3e037d127b94e3411f29" +dependencies = [ + "bytes", + "prost-derive", +] + +[[package]] +name = "prost-build" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22505a5c94da8e3b7c2996394d1c933236c4d743e81a410bcca4e6989fc066a4" +dependencies = [ + "bytes", + "heck", + "itertools 0.10.5", + "log", + "multimap", + "once_cell", + "petgraph 0.6.5", + "prettyplease", + "prost", + "prost-types", + "regex", + "syn", + "tempfile", +] + +[[package]] +name = "prost-derive" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81bddcdb20abf9501610992b6759a4c888aef7d1a7247ef75e2404275ac24af1" +dependencies = [ + "anyhow", + "itertools 0.10.5", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "prost-types" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9091c90b0a32608e984ff2fa4091273cbdd755d54935c51d520887f4a1dbd5b0" +dependencies = [ + "prost", +] + +[[package]] +name = "protobuf-src" +version = "2.1.0+27.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7edafa3bcc668fa93efafcbdf58d7821bbda0f4b458ac7fae3d57ec0fec8167" +dependencies = [ + "cmake", +] + [[package]] name = "qoi" version = "0.4.1" @@ -5382,7 +5510,16 @@ dependencies = [ "aho-corasick", "memchr", "regex-automata 0.4.7", - "regex-syntax", + "regex-syntax 0.8.4", +] + +[[package]] +name = "regex-automata" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" +dependencies = [ + "regex-syntax 0.6.29", ] [[package]] @@ -5402,9 +5539,15 @@ checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" dependencies = [ "aho-corasick", "memchr", - "regex-syntax", + "regex-syntax 0.8.4", ] +[[package]] +name = "regex-syntax" +version = "0.6.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" + [[package]] name = "regex-syntax" version = "0.8.4" @@ -5896,7 +6039,7 @@ dependencies = [ "log", "num-complex", "num-traits", - "petgraph", + "petgraph 0.4.13", "serde", "serde_derive", "servo-media-derive", @@ -6181,6 +6324,9 @@ dependencies = [ "surfman", "tinyfiledialogs", "tokio", + "tracing", + "tracing-perfetto", + "tracing-subscriber", "url", "vergen", "webxr", @@ -6211,6 +6357,15 @@ dependencies = [ "digest", ] +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + [[package]] name = "shellwords" version = "1.1.0" @@ -6779,6 +6934,26 @@ dependencies = [ "syn", ] +[[package]] +name = "thread-id" +version = "4.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfe8f25bbdd100db7e1d34acf7fd2dc59c4bf8f7483f505eaa7d4f12f76cc0ea" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "thread_local" +version = "1.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" +dependencies = [ + "cfg-if", + "once_cell", +] + [[package]] name = "tiff" version = "0.9.1" @@ -7090,6 +7265,54 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" dependencies = [ "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-perfetto" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd21777b526dfcb57f11f65aa8a2024d83e1db52841993229b6e282e511978b7" +dependencies = [ + "anyhow", + "bytes", + "chrono", + "prost", + "prost-build", + "protobuf-src", + "rand", + "thread-id", + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", ] [[package]] @@ -7276,6 +7499,12 @@ dependencies = [ "serde", ] +[[package]] +name = "valuable" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" + [[package]] name = "vcpkg" version = "0.2.15" diff --git a/Cargo.toml b/Cargo.toml index b59f8f20f41..5a1614fbcd2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -125,6 +125,9 @@ to_shmem = { git = "https://github.com/servo/stylo", branch = "2024-07-16" } tokio = "1" tokio-rustls = "0.24" tungstenite = "0.20" +tracing = "0.1.40" +tracing-subscriber = "0.3.18" +tracing-perfetto = "0.1.1" uluru = "3.0" unicode-bidi = "0.3.15" unicode-properties = { version = "0.1.2", features = ["emoji"] } diff --git a/ports/servoshell/Cargo.toml b/ports/servoshell/Cargo.toml index c898206bda9..5e6ff09800e 100644 --- a/ports/servoshell/Cargo.toml +++ b/ports/servoshell/Cargo.toml @@ -48,6 +48,7 @@ multiview = ["libservo/multiview"] native-bluetooth = ["libservo/native-bluetooth"] profilemozjs = ["libservo/profilemozjs"] refcell_backtrace = ["libservo/refcell_backtrace"] +tracing = ["dep:tracing", "dep:tracing-subscriber", "dep:tracing-perfetto"] webdriver = ["libservo/webdriver"] webgl_backtrace = ["libservo/webgl_backtrace"] @@ -110,6 +111,9 @@ raw-window-handle = "0.6" shellwords = "1.0.0" surfman = { workspace = true, features = ["sm-x11", "sm-raw-window-handle-06"] } tinyfiledialogs = "3.0" +tracing = { workspace = true, optional = true } +tracing-subscriber = { workspace = true, features = ["env-filter"], optional = true } +tracing-perfetto = { workspace = true, optional = true } webxr = { git = "https://github.com/servo/webxr", features = ["ipc", "glwindow", "headless"] } winit = "0.29.10" diff --git a/ports/servoshell/desktop/cli.rs b/ports/servoshell/desktop/cli.rs index cde1cf8ee7a..0fa2bcc8a00 100644 --- a/ports/servoshell/desktop/cli.rs +++ b/ports/servoshell/desktop/cli.rs @@ -8,6 +8,16 @@ use getopts::Options; use log::error; use servo::config::opts::{self, ArgumentParsingResult}; use servo::servo_config::pref; +#[cfg(feature = "tracing")] +use tracing::subscriber::set_global_default; +#[cfg(feature = "tracing")] +use tracing_perfetto::PerfettoLayer; +#[cfg(feature = "tracing")] +use tracing_subscriber::layer::SubscriberExt; +#[cfg(feature = "tracing")] +use tracing_subscriber::util::SubscriberInitExt; +#[cfg(feature = "tracing")] +use tracing_subscriber::EnvFilter; use crate::desktop::app::App; use crate::panic_hook; @@ -15,6 +25,25 @@ use crate::panic_hook; pub fn main() { crate::crash_handler::install(); + #[cfg(feature = "tracing")] + { + let file = std::fs::File::create("servo.pftrace").unwrap(); + let perfetto_layer = PerfettoLayer::new(std::sync::Mutex::new(file)); + + // Set up a custom tracing subscriber and PerfettoLayer for performance tracing. + // The servo.pftrace file can be uploaded to https://ui.perfetto.dev for analysis. + let env_filter_layer = EnvFilter::from_default_env(); + let subscriber = tracing_subscriber::registry() + .with(env_filter_layer) + .with(perfetto_layer); + + // Set the subscriber as the global default for tracing. This means it will be used + // throughout the entire program unless a thread-local subscriber is set. + // Can only be set once; subsequent attempts will fail. + // + set_global_default(subscriber).expect("Failed to set global default subscriber"); + } + crate::resources::init(); // Parse the command line options and store them globally diff --git a/servo-tidy.toml b/servo-tidy.toml index eb2c57fe4d8..406e5aec717 100644 --- a/servo-tidy.toml +++ b/servo-tidy.toml @@ -15,6 +15,7 @@ rand = [ "quickcheck", # Only used in tests "servo_rand", "tungstenite", + "tracing-perfetto", ] [ignore] @@ -64,8 +65,23 @@ packages = [ "phf_generator", "phf_shared", + # petgraph uses old version + "fixedbitset", + + # servo-media-audio uses old version + "petgraph", + # icu (from mozjs) uses old version + # tracing-subscriber (tokio-rs/tracing#3033) uses old version + # regex -> regex-automata 0.4.7 + # icu_list -> regex-automata 0.2.0 + # tracing-subscriber -> matchers -> regex-automata 0.1.0 "regex-automata", + + # tracing-subscriber (tokio-rs/tracing#3033) uses old version + # regex [-> regex-automata 0.4.7] -> regex-syntax 0.8.4 + # tracing-subscriber -> matchers -> regex-automata 0.1.0 -> regex-syntax 0.6.29 + "regex-syntax", ] # Files that are ignored for all tidy and lint checks. files = [