aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_prof
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_prof')
-rw-r--r--crates/ra_prof/src/lib.rs25
1 files changed, 14 insertions, 11 deletions
diff --git a/crates/ra_prof/src/lib.rs b/crates/ra_prof/src/lib.rs
index 2d4f68f5e..d95ad3107 100644
--- a/crates/ra_prof/src/lib.rs
+++ b/crates/ra_prof/src/lib.rs
@@ -26,11 +26,18 @@ pub use crate::memory_usage::{Bytes, MemoryUsage};
26#[global_allocator] 26#[global_allocator]
27static ALLOC: jemallocator::Jemalloc = jemallocator::Jemalloc; 27static ALLOC: jemallocator::Jemalloc = jemallocator::Jemalloc;
28 28
29/// Filtering syntax
30/// env RA_PROFILE=* // dump everything
31/// env RA_PROFILE=foo|bar|baz // enabled only selected entries
32/// env RA_PROFILE=*@3>10 // dump everything, up to depth 3, if it takes more than 10 ms
29pub fn init() { 33pub fn init() {
30 set_filter(match std::env::var("RA_PROFILE") { 34 let spec = std::env::var("RA_PROFILE").unwrap_or_default();
31 Ok(spec) => Filter::from_spec(&spec), 35 init_from(&spec);
32 Err(_) => Filter::disabled(), 36}
33 }); 37
38pub fn init_from(spec: &str) {
39 let filter = if spec.is_empty() { Filter::disabled() } else { Filter::from_spec(spec) };
40 set_filter(filter);
34} 41}
35 42
36/// Set profiling filter. It specifies descriptions allowed to profile. 43/// Set profiling filter. It specifies descriptions allowed to profile.
@@ -43,7 +50,7 @@ pub fn init() {
43/// let f = Filter::from_spec("profile1|profile2@2"); 50/// let f = Filter::from_spec("profile1|profile2@2");
44/// set_filter(f); 51/// set_filter(f);
45/// ``` 52/// ```
46pub fn set_filter(f: Filter) { 53fn set_filter(f: Filter) {
47 PROFILING_ENABLED.store(f.depth > 0, Ordering::SeqCst); 54 PROFILING_ENABLED.store(f.depth > 0, Ordering::SeqCst);
48 let set: HashSet<_> = f.allowed.iter().cloned().collect(); 55 let set: HashSet<_> = f.allowed.iter().cloned().collect();
49 let mut old = FILTER.write().unwrap(); 56 let mut old = FILTER.write().unwrap();
@@ -127,18 +134,14 @@ impl Profiler {
127 } 134 }
128} 135}
129 136
130pub struct Filter { 137struct Filter {
131 depth: usize, 138 depth: usize,
132 allowed: Vec<String>, 139 allowed: Vec<String>,
133 longer_than: Duration, 140 longer_than: Duration,
134} 141}
135 142
136impl Filter { 143impl Filter {
137 // Filtering syntax 144 fn from_spec(mut spec: &str) -> Filter {
138 // env RA_PROFILE=* // dump everything
139 // env RA_PROFILE=foo|bar|baz // enabled only selected entries
140 // env RA_PROFILE=*@3>10 // dump everything, up to depth 3, if it takes more than 10 ms
141 pub fn from_spec(mut spec: &str) -> Filter {
142 let longer_than = if let Some(idx) = spec.rfind('>') { 145 let longer_than = if let Some(idx) = spec.rfind('>') {
143 let longer_than = spec[idx + 1..].parse().expect("invalid profile longer_than"); 146 let longer_than = spec[idx + 1..].parse().expect("invalid profile longer_than");
144 spec = &spec[..idx]; 147 spec = &spec[..idx];