Merge "Exclude perf events from simpleperf trace collection" into main
diff --git a/memory_replay/Alloc.cpp b/memory_replay/Alloc.cpp
index e97dca0..f776f0f 100644
--- a/memory_replay/Alloc.cpp
+++ b/memory_replay/Alloc.cpp
@@ -31,6 +31,7 @@
case memory_trace::CALLOC:
case memory_trace::MEMALIGN:
case memory_trace::THREAD_DONE:
+ case memory_trace::UNKNOWN:
return false;
case memory_trace::FREE:
diff --git a/memory_replay/MemoryTrace.cpp b/memory_replay/MemoryTrace.cpp
index e6d21df..c080a07 100644
--- a/memory_replay/MemoryTrace.cpp
+++ b/memory_replay/MemoryTrace.cpp
@@ -141,8 +141,9 @@
return "realloc";
case THREAD_DONE:
return "thread_done";
+ default:
+ return "unknown";
}
- return "unknown";
}
static size_t FormatEntry(const Entry& entry, char* buffer, size_t buffer_len) {
diff --git a/memory_replay/TraceBenchmark.cpp b/memory_replay/TraceBenchmark.cpp
index 1612997..dbc68c4 100644
--- a/memory_replay/TraceBenchmark.cpp
+++ b/memory_replay/TraceBenchmark.cpp
@@ -138,6 +138,7 @@
}
break;
case memory_trace::THREAD_DONE:
+ case memory_trace::UNKNOWN:
break;
}
}
@@ -239,6 +240,7 @@
break;
case memory_trace::THREAD_DONE:
+ case memory_trace::UNKNOWN:
break;
}
}
diff --git a/memory_replay/VerifyTrace.cpp b/memory_replay/VerifyTrace.cpp
index 0094940..e60a213 100644
--- a/memory_replay/VerifyTrace.cpp
+++ b/memory_replay/VerifyTrace.cpp
@@ -129,6 +129,7 @@
}
break;
case memory_trace::THREAD_DONE:
+ case memory_trace::UNKNOWN:
break;
}
diff --git a/memory_replay/include/memory_trace/MemoryTrace.h b/memory_replay/include/memory_trace/MemoryTrace.h
index 108a921..3b2a390 100644
--- a/memory_replay/include/memory_trace/MemoryTrace.h
+++ b/memory_replay/include/memory_trace/MemoryTrace.h
@@ -29,6 +29,7 @@
REALLOC,
FREE,
THREAD_DONE,
+ UNKNOWN,
};
struct Entry {
diff --git a/memory_replay/main.cpp b/memory_replay/main.cpp
index 0f50953..ffa9773 100644
--- a/memory_replay/main.cpp
+++ b/memory_replay/main.cpp
@@ -47,6 +47,7 @@
for (size_t i = 0; i < num_entries; i++) {
switch (entries[i].type) {
case memory_trace::THREAD_DONE:
+ case memory_trace::UNKNOWN:
break;
case memory_trace::MALLOC:
case memory_trace::CALLOC:
diff --git a/profcollectd/binder/com/android/server/profcollect/IProfCollectd.aidl b/profcollectd/binder/com/android/server/profcollect/IProfCollectd.aidl
index 1476768..970c0fa 100644
--- a/profcollectd/binder/com/android/server/profcollect/IProfCollectd.aidl
+++ b/profcollectd/binder/com/android/server/profcollect/IProfCollectd.aidl
@@ -20,8 +20,6 @@
/** {@hide} */
interface IProfCollectd {
- void schedule();
- void terminate();
void trace_system(@utf8InCpp String tag);
void trace_process(@utf8InCpp String tag, @utf8InCpp String processes, float duration);
void process();
diff --git a/profcollectd/libprofcollectd/lib.rs b/profcollectd/libprofcollectd/lib.rs
index 4663e68..741bed1 100644
--- a/profcollectd/libprofcollectd/lib.rs
+++ b/profcollectd/libprofcollectd/lib.rs
@@ -49,14 +49,12 @@
if elapsed < TIMEOUT_TO_COLLECT_BOOT_PROFILE {
trace_system("boot").map_err(err_to_binder_status)?;
}
- schedule().map_err(err_to_binder_status)?;
Ok(())
}
}
-/// Initialise profcollectd service.
-/// * `schedule_now` - Immediately schedule collection after service is initialised.
-pub fn init_service(schedule_now: bool) -> Result<()> {
+/// Initialize profcollectd service.
+pub fn init_service() -> Result<()> {
binder::ProcessState::start_thread_pool();
let profcollect_binder_service = ProfcollectdBinderService::new()?;
@@ -67,13 +65,11 @@
)
.context("Failed to register service.")?;
- if schedule_now {
- let cb = BnProviderStatusCallback::new_binder(
- ProviderStatusCallback { service_start_time: Instant::now() },
- BinderFeatures::default(),
- );
- get_profcollectd_service()?.registerProviderStatusCallback(&cb)?;
- }
+ let cb = BnProviderStatusCallback::new_binder(
+ ProviderStatusCallback { service_start_time: Instant::now() },
+ BinderFeatures::default(),
+ );
+ get_profcollectd_service()?.registerProviderStatusCallback(&cb)?;
binder::ProcessState::join_thread_pool();
Ok(())
@@ -84,18 +80,6 @@
.context("Failed to get profcollectd binder service, is profcollectd running?")
}
-/// Schedule periodic profile collection.
-pub fn schedule() -> Result<()> {
- get_profcollectd_service()?.schedule()?;
- Ok(())
-}
-
-/// Terminate periodic profile collection.
-pub fn terminate() -> Result<()> {
- get_profcollectd_service()?.terminate()?;
- Ok(())
-}
-
/// Immediately schedule a one-off trace.
pub fn trace_system(tag: &str) -> Result<()> {
get_profcollectd_service()?.trace_system(tag)?;
diff --git a/profcollectd/libprofcollectd/scheduler.rs b/profcollectd/libprofcollectd/scheduler.rs
index e37ffe7..9229086 100644
--- a/profcollectd/libprofcollectd/scheduler.rs
+++ b/profcollectd/libprofcollectd/scheduler.rs
@@ -19,7 +19,6 @@
use std::fs;
use std::mem;
use std::path::Path;
-use std::sync::mpsc::{sync_channel, SyncSender};
use std::sync::Arc;
use std::sync::Mutex;
use std::thread;
@@ -27,12 +26,9 @@
use crate::config::{get_sampling_period, Config, LOG_FILE, PROFILE_OUTPUT_DIR, TRACE_OUTPUT_DIR};
use crate::trace_provider::{self, TraceProvider};
-use anyhow::{anyhow, ensure, Context, Result};
+use anyhow::{anyhow, Context, Result};
pub struct Scheduler {
- /// Signal to terminate the periodic collection worker thread, None if periodic collection is
- /// not scheduled.
- termination_ch: Option<SyncSender<()>>,
/// The preferred trace provider for the system.
trace_provider: Arc<Mutex<dyn TraceProvider + Send>>,
provider_ready_callbacks: Arc<Mutex<Vec<Box<dyn FnOnce() + Send>>>>,
@@ -43,57 +39,11 @@
let p = trace_provider::get_trace_provider()?;
p.lock().map_err(|e| anyhow!(e.to_string()))?.set_log_file(&LOG_FILE);
Ok(Scheduler {
- termination_ch: None,
trace_provider: p,
provider_ready_callbacks: Arc::new(Mutex::new(Vec::new())),
})
}
- fn is_scheduled(&self) -> bool {
- self.termination_ch.is_some()
- }
-
- pub fn schedule_periodic(&mut self, config: &Config) -> Result<()> {
- ensure!(!self.is_scheduled(), "Already scheduled.");
-
- let (sender, receiver) = sync_channel(1);
- self.termination_ch = Some(sender);
-
- // Clone config and trace_provider ARC for the worker thread.
- let config = config.clone();
- let trace_provider = self.trace_provider.clone();
-
- thread::spawn(move || {
- loop {
- match receiver.recv_timeout(config.collection_interval) {
- Ok(_) => break,
- Err(_) => {
- // Did not receive a termination signal, initiate trace event.
- if check_space_limit(&TRACE_OUTPUT_DIR, &config).unwrap() {
- trace_provider.lock().unwrap().trace_system(
- &TRACE_OUTPUT_DIR,
- "periodic",
- &get_sampling_period(),
- &config.binary_filter,
- );
- }
- }
- }
- }
- });
- Ok(())
- }
-
- pub fn terminate_periodic(&mut self) -> Result<()> {
- self.termination_ch
- .as_ref()
- .ok_or_else(|| anyhow!("Not scheduled"))?
- .send(())
- .context("Scheduler worker disappeared.")?;
- self.termination_ch = None;
- Ok(())
- }
-
pub fn trace_system(&self, config: &Config, tag: &str) -> Result<()> {
let trace_provider = self.trace_provider.clone();
if check_space_limit(&TRACE_OUTPUT_DIR, config)? {
diff --git a/profcollectd/libprofcollectd/service.rs b/profcollectd/libprofcollectd/service.rs
index 5e3097a..49c5406 100644
--- a/profcollectd/libprofcollectd/service.rs
+++ b/profcollectd/libprofcollectd/service.rs
@@ -51,20 +51,6 @@
impl binder::Interface for ProfcollectdBinderService {}
impl IProfCollectd for ProfcollectdBinderService {
- fn schedule(&self) -> BinderResult<()> {
- let lock = &mut *self.lock();
- lock.scheduler
- .schedule_periodic(&lock.config)
- .context("Failed to schedule collection.")
- .map_err(err_to_binder_status)
- }
- fn terminate(&self) -> BinderResult<()> {
- self.lock()
- .scheduler
- .terminate_periodic()
- .context("Failed to terminate collection.")
- .map_err(err_to_binder_status)
- }
fn trace_system(&self, tag: &str) -> BinderResult<()> {
let lock = &mut *self.lock();
lock.scheduler
diff --git a/profcollectd/profcollectctl.rs b/profcollectd/profcollectctl.rs
index bc22d3b..c533691 100644
--- a/profcollectd/profcollectctl.rs
+++ b/profcollectd/profcollectctl.rs
@@ -25,8 +25,6 @@
Command to control profcollectd behaviour.
command:
- start Schedule periodic collection.
- stop Terminate periodic collection.
trace Request an one-off system-wide trace.
process Convert traces to perf profiles.
report Create a report containing all profiles.
@@ -44,14 +42,6 @@
let action = &args[1];
match action.as_str() {
- "start" => {
- println!("Scheduling profile collection");
- libprofcollectd::schedule().context("Failed to schedule collection.")?;
- }
- "stop" => {
- println!("Terminating profile collection");
- libprofcollectd::terminate().context("Failed to terminate collection.")?;
- }
"trace" => {
println!("Performing system-wide trace");
libprofcollectd::trace_system("manual").context("Failed to trace.")?;
diff --git a/profcollectd/profcollectd.rs b/profcollectd/profcollectd.rs
index 0c2e87d..3ae9121 100644
--- a/profcollectd/profcollectd.rs
+++ b/profcollectd/profcollectd.rs
@@ -22,7 +22,7 @@
const HELP_MSG: &str = r#"
profcollectd background daemon.
usage: profcollectd [command]
- nostart Start daemon but do not schedule profile collection.
+ help Print help message.
"#;
fn main() -> Result<()> {
@@ -33,12 +33,11 @@
bail!("This program only takes one or no argument{}", &HELP_MSG);
}
if args.len() == 1 {
- libprofcollectd::init_service(true)?;
+ libprofcollectd::init_service()?;
}
let action = &args[1];
match action.as_str() {
- "nostart" => libprofcollectd::init_service(false)?,
"help" => println!("{}", &HELP_MSG),
arg => bail!("Unknown argument: {}\n{}", &arg, &HELP_MSG),
}