summaryrefslogtreecommitdiffstats
path: root/crates/runner/src/task.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/runner/src/task.rs')
-rw-r--r--crates/runner/src/task.rs31
1 files changed, 25 insertions, 6 deletions
diff --git a/crates/runner/src/task.rs b/crates/runner/src/task.rs
index 7bf1fda..5c27e78 100644
--- a/crates/runner/src/task.rs
+++ b/crates/runner/src/task.rs
@@ -11,7 +11,7 @@ use capctl::prctl;
use nix::{
mount::{self, MsFlags},
sched::{unshare, CloneFlags},
- sys::wait,
+ sys::{resource, time::TimeVal, wait},
unistd::{self, Gid, Uid},
};
use serde::Serialize;
@@ -568,6 +568,26 @@ fn save_cached(input_hash: &InputHash, output: &TaskOutput) -> Result<()> {
Ok(())
}
+trait AsSecsF32 {
+ fn as_secs_f32(&self) -> f32;
+}
+
+impl AsSecsF32 for TimeVal {
+ fn as_secs_f32(&self) -> f32 {
+ self.tv_sec() as f32 + 1e-6 * (self.tv_usec() as f32)
+ }
+}
+
+fn get_usage(total: f32) -> String {
+ let usage = resource::getrusage(resource::UsageWho::RUSAGE_CHILDREN).expect("getrusage()");
+
+ let user = usage.user_time().as_secs_f32();
+ let system = usage.system_time().as_secs_f32();
+ let cpu = (100.0 * (user + system) / total).round();
+
+ format!("{user:.2}s user {system:.2}s system {cpu:.0}% cpu")
+}
+
pub fn handle(task: Task, jobserver: &mut Jobserver) -> Result<TaskOutput> {
let input_hash = input_hash(&task);
@@ -596,12 +616,11 @@ pub fn handle(task: Task, jobserver: &mut Jobserver) -> Result<TaskOutput> {
save_cached(&input_hash, &task_output)?;
- let duration = Instant::now().duration_since(start_time);
+ let duration = Instant::now().duration_since(start_time).as_secs_f32();
+ let usage = get_usage(duration);
println!(
- "Finished task {} ({}) in {}",
- task.label,
- input_hash,
- duration.as_secs_f32()
+ "Finished task {} ({}) in {:.2}s ({})",
+ task.label, input_hash, duration, usage,
);
if let Ok(cached_output) = cached_output {