Skip to content

Commit 3813164

Browse files
committed
Wait for 'perf record' to finish
1 parent fb135b5 commit 3813164

File tree

3 files changed

+50
-2
lines changed

3 files changed

+50
-2
lines changed

src/data.rs

+19
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,13 @@ impl DataType {
139139
Ok(())
140140
}
141141

142+
pub fn finish_data_collection(&mut self) -> Result<()> {
143+
trace!("Finish data collection...");
144+
self.data
145+
.finish_data_collection(self.collector_params.clone())?;
146+
Ok(())
147+
}
148+
142149
pub fn after_data_collection(&mut self) -> Result<()> {
143150
trace!("Running post collection actions...");
144151
self.data
@@ -202,6 +209,14 @@ macro_rules! data {
202209
Ok(())
203210
}
204211

212+
fn finish_data_collection(&mut self, params: CollectorParams) -> Result<()> {
213+
match self {
214+
$(
215+
Data::$x(ref mut value) => value.finish_data_collection(params)?,
216+
)*
217+
}
218+
Ok(())
219+
}
205220
fn after_data_collection(&mut self, params: CollectorParams) -> Result<()> {
206221
match self {
207222
$(
@@ -301,6 +316,10 @@ pub trait CollectData {
301316
noop!();
302317
Ok(())
303318
}
319+
fn finish_data_collection(&mut self, _params: CollectorParams) -> Result<()> {
320+
noop!();
321+
Ok(())
322+
}
304323
fn after_data_collection(&mut self, _params: CollectorParams) -> Result<()> {
305324
noop!();
306325
Ok(())

src/data/perf_profile.rs

+28-2
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,15 @@ use ctor::ctor;
88
use log::{error, trace};
99
use serde::{Deserialize, Serialize};
1010
use std::io::ErrorKind;
11-
use std::process::Command;
11+
use std::process::{Child, Command};
12+
use std::sync::Mutex;
1213

1314
pub static PERF_PROFILE_FILE_NAME: &str = "perf_profile";
1415

16+
lazy_static! {
17+
pub static ref PERF_CHILD: Mutex<Option<Child>> = Mutex::new(None);
18+
}
19+
1520
#[derive(Serialize, Deserialize, Debug, Clone)]
1621
pub struct PerfProfileRaw {
1722
pub data: String,
@@ -55,14 +60,35 @@ impl CollectData for PerfProfileRaw {
5560
}
5661
error!("Skipping Perf profile collection.");
5762
}
58-
Ok(_) => trace!("Recording Perf profiling data."),
63+
Ok(child) => {
64+
trace!("Recording Perf profiling data.");
65+
*PERF_CHILD.lock().unwrap() = Some(child);
66+
}
5967
}
6068
Ok(())
6169
}
6270

6371
fn collect_data(&mut self) -> Result<()> {
6472
Ok(())
6573
}
74+
75+
fn finish_data_collection(&mut self, _params: CollectorParams) -> Result<()> {
76+
let mut child = PERF_CHILD.lock().unwrap();
77+
match child.as_ref() {
78+
None => return Ok(()),
79+
Some(_) => {}
80+
}
81+
82+
trace!("Waiting for perf profile collection to complete...");
83+
match child.as_mut().unwrap().wait() {
84+
Err(e) => {
85+
error!("'perf' did not exit successfully: {}", e);
86+
return Ok(());
87+
}
88+
Ok(_) => trace!("'perf record' executed successfully."),
89+
}
90+
Ok(())
91+
}
6692
}
6793

6894
#[derive(Serialize, Deserialize, Debug, Clone)]

src/lib.rs

+3
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,9 @@ impl PerformanceData {
214214
let data_collection_time = time::Instant::now() - current;
215215
debug!("Collection time: {:?}", data_collection_time);
216216
}
217+
for (_name, datatype) in self.collectors.iter_mut() {
218+
datatype.finish_data_collection()?;
219+
}
217220
for (_name, datatype) in self.collectors.iter_mut() {
218221
datatype.after_data_collection()?;
219222
}

0 commit comments

Comments
 (0)