Skip to content

Commit a70ec7f

Browse files
committed
fix(log): recored elapsed time rather than duration
1 parent 3c23e2d commit a70ec7f

File tree

5 files changed

+257
-25
lines changed

5 files changed

+257
-25
lines changed

src/cargo/core/compiler/job_queue/mod.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -713,7 +713,7 @@ impl<'gctx> DrainState<'gctx> {
713713
self.tokens.push(token);
714714
}
715715
Message::SectionTiming(id, section) => {
716-
self.timings.unit_section_timing(id, &section);
716+
self.timings.unit_section_timing(build_runner, id, &section);
717717
}
718718
}
719719

@@ -1126,7 +1126,9 @@ impl<'gctx> DrainState<'gctx> {
11261126
let unblocked = self.queue.finish(unit, &artifact);
11271127
match artifact {
11281128
Artifact::All => self.timings.unit_finished(build_runner, id, unblocked),
1129-
Artifact::Metadata => self.timings.unit_rmeta_finished(id, unblocked),
1129+
Artifact::Metadata => self
1130+
.timings
1131+
.unit_rmeta_finished(build_runner, id, unblocked),
11301132
}
11311133
Ok(())
11321134
}

src/cargo/core/compiler/mod.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1108,7 +1108,8 @@ fn add_allow_features(build_runner: &BuildRunner<'_, '_>, cmd: &mut ProcessBuild
11081108
/// [`--error-format`]: https://doc.rust-lang.org/nightly/rustc/command-line-arguments.html#--error-format-control-how-errors-are-produced
11091109
fn add_error_format_and_color(build_runner: &BuildRunner<'_, '_>, cmd: &mut ProcessBuilder) {
11101110
let enable_timings = build_runner.bcx.gctx.cli_unstable().section_timings
1111-
&& !build_runner.bcx.build_config.timing_outputs.is_empty();
1111+
&& (!build_runner.bcx.build_config.timing_outputs.is_empty()
1112+
|| build_runner.bcx.logger.is_some());
11121113
if enable_timings {
11131114
cmd.arg("-Zunstable-options");
11141115
}

src/cargo/core/compiler/timings/mod.rs

Lines changed: 46 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -267,7 +267,12 @@ impl<'gctx> Timings<'gctx> {
267267
}
268268

269269
/// Mark that the `.rmeta` file as generated.
270-
pub fn unit_rmeta_finished(&mut self, id: JobId, unblocked: Vec<&Unit>) {
270+
pub fn unit_rmeta_finished(
271+
&mut self,
272+
build_runner: &BuildRunner<'_, '_>,
273+
id: JobId,
274+
unblocked: Vec<&Unit>,
275+
) {
271276
if !self.enabled {
272277
return;
273278
}
@@ -277,12 +282,21 @@ impl<'gctx> Timings<'gctx> {
277282
let Some(unit_time) = self.active.get_mut(&id) else {
278283
return;
279284
};
280-
let t = self.start.elapsed().as_secs_f64();
281-
unit_time.rmeta_time = Some(t - unit_time.start);
285+
let elapsed = self.start.elapsed().as_secs_f64();
286+
unit_time.rmeta_time = Some(elapsed - unit_time.start);
282287
assert!(unit_time.unblocked_rmeta_units.is_empty());
283288
unit_time
284289
.unblocked_rmeta_units
285290
.extend(unblocked.iter().cloned().cloned());
291+
292+
if let Some(logger) = build_runner.bcx.logger {
293+
let unblocked = unblocked.iter().map(|u| self.unit_to_index[u]).collect();
294+
logger.log(LogMessage::UnitRmetaFinished {
295+
index: self.unit_to_index[&unit_time.unit],
296+
elapsed,
297+
unblocked,
298+
});
299+
}
286300
}
287301

288302
/// Mark that a unit has finished running.
@@ -299,8 +313,8 @@ impl<'gctx> Timings<'gctx> {
299313
let Some(mut unit_time) = self.active.remove(&id) else {
300314
return;
301315
};
302-
let t = self.start.elapsed().as_secs_f64();
303-
unit_time.duration = t - unit_time.start;
316+
let elapsed = self.start.elapsed().as_secs_f64();
317+
unit_time.duration = elapsed - unit_time.start;
304318
assert!(unit_time.unblocked_units.is_empty());
305319
unit_time
306320
.unblocked_units
@@ -321,33 +335,53 @@ impl<'gctx> Timings<'gctx> {
321335
let unblocked = unblocked.iter().map(|u| self.unit_to_index[u]).collect();
322336
logger.log(LogMessage::UnitFinished {
323337
index: self.unit_to_index[&unit_time.unit],
324-
duration: unit_time.duration,
325-
rmeta_time: unit_time.rmeta_time,
326-
sections: unit_time.sections.clone().into_iter().collect(),
338+
elapsed,
327339
unblocked,
328340
});
329341
}
330342
self.unit_times.push(unit_time);
331343
}
332344

333345
/// Handle the start/end of a compilation section.
334-
pub fn unit_section_timing(&mut self, id: JobId, section_timing: &SectionTiming) {
346+
pub fn unit_section_timing(
347+
&mut self,
348+
build_runner: &BuildRunner<'_, '_>,
349+
id: JobId,
350+
section_timing: &SectionTiming,
351+
) {
335352
if !self.enabled {
336353
return;
337354
}
338355
let Some(unit_time) = self.active.get_mut(&id) else {
339356
return;
340357
};
341-
let now = self.start.elapsed().as_secs_f64();
358+
let elapsed = self.start.elapsed().as_secs_f64();
342359

343360
match section_timing.event {
344361
SectionTimingEvent::Start => {
345-
unit_time.start_section(&section_timing.name, now);
362+
unit_time.start_section(&section_timing.name, elapsed);
346363
}
347364
SectionTimingEvent::End => {
348-
unit_time.end_section(&section_timing.name, now);
365+
unit_time.end_section(&section_timing.name, elapsed);
349366
}
350367
}
368+
369+
if let Some(logger) = build_runner.bcx.logger {
370+
let index = self.unit_to_index[&unit_time.unit];
371+
let section = section_timing.name.clone();
372+
logger.log(match section_timing.event {
373+
SectionTimingEvent::Start => LogMessage::UnitSectionStarted {
374+
index,
375+
elapsed,
376+
section,
377+
},
378+
SectionTimingEvent::End => LogMessage::UnitSectionFinished {
379+
index,
380+
elapsed,
381+
section,
382+
},
383+
})
384+
}
351385
}
352386

353387
/// This is called periodically to mark the concurrency of internal structures.

src/cargo/util/log_message.rs

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ use cargo_util_schemas::core::PackageIdSpec;
77
use jiff::Timestamp;
88
use serde::Serialize;
99

10-
use crate::core::compiler::CompilationSection;
1110
use crate::core::compiler::CompileMode;
1211
use crate::core::compiler::fingerprint::DirtyReason;
1312

@@ -36,14 +35,29 @@ pub enum LogMessage {
3635
index: u64,
3736
elapsed: f64,
3837
},
38+
/// Emitted when a section (e.g., rmeta, link) of the compilation unit finishes.
39+
UnitRmetaFinished {
40+
index: u64,
41+
elapsed: f64,
42+
#[serde(skip_serializing_if = "Vec::is_empty")]
43+
unblocked: Vec<u64>,
44+
},
45+
/// Emitted when a section (e.g., rmeta, link) of the compilation unit starts.
46+
UnitSectionStarted {
47+
index: u64,
48+
elapsed: f64,
49+
section: String,
50+
},
51+
/// Emitted when a section (e.g., rmeta, link) of the compilation unit finishes.
52+
UnitSectionFinished {
53+
index: u64,
54+
elapsed: f64,
55+
section: String,
56+
},
3957
/// Emitted when a compilation unit finishes.
4058
UnitFinished {
4159
index: u64,
42-
duration: f64,
43-
#[serde(skip_serializing_if = "Option::is_none")]
44-
rmeta_time: Option<f64>,
45-
#[serde(skip_serializing_if = "Vec::is_empty")]
46-
sections: Vec<(String, CompilationSection)>,
60+
elapsed: f64,
4761
#[serde(skip_serializing_if = "Vec::is_empty")]
4862
unblocked: Vec<u64>,
4963
},

0 commit comments

Comments
 (0)