Refactor the memory profiler code to return the struct. (#37155)

Refactor the memory profiler code to return the struct and handle the
serializing in servointernal page.
This allows other users of the memory profiler to see the whole report
without parsing json.

Testing: I do not know if the memory page is covered by tests.

---------

Signed-off-by: Narfinger <Narfinger@users.noreply.github.com>
This commit is contained in:
Narfinger 2025-05-28 02:58:05 +02:00 committed by GitHub
parent ac06b1cfcf
commit 2d3a7c87c2
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 21 additions and 18 deletions

View file

@ -12,9 +12,9 @@ use ipc_channel::ipc::{self, IpcReceiver};
use ipc_channel::router::ROUTER;
use log::debug;
use profile_traits::mem::{
MemoryReportResult, ProfilerChan, ProfilerMsg, Report, Reporter, ReporterRequest, ReportsChan,
MemoryReport, MemoryReportResult, ProfilerChan, ProfilerMsg, Report, Reporter, ReporterRequest,
ReportsChan,
};
use serde::Serialize;
use crate::system_reporter;
@ -100,28 +100,18 @@ impl Profiler {
ProfilerMsg::Report(sender) => {
let main_pid = std::process::id();
#[derive(Serialize)]
struct JsonReport {
pid: u32,
#[serde(rename = "isMainProcess")]
is_main_process: bool,
reports: Vec<Report>,
}
let reports = self.collect_reports();
// Turn the pid -> reports map into a vector and add the
// hint to find the main process.
let json_reports: Vec<JsonReport> = reports
let results: Vec<MemoryReport> = reports
.into_iter()
.map(|(pid, reports)| JsonReport {
.map(|(pid, reports)| MemoryReport {
pid,
reports,
is_main_process: pid == main_pid,
})
.collect();
let content = serde_json::to_string(&json_reports)
.unwrap_or_else(|_| "{ error: \"failed to create memory report\"}".to_owned());
let _ = sender.send(MemoryReportResult { content });
let _ = sender.send(MemoryReportResult { results });
true
},

View file

@ -59,7 +59,9 @@ impl ServoInternalsMethods<crate::DomTypeHolder> for ServoInternals {
impl RoutedPromiseListener<MemoryReportResult> for ServoInternals {
fn handle_response(&self, response: MemoryReportResult, promise: &Rc<Promise>, can_gc: CanGc) {
promise.resolve_native(&response.content, can_gc);
let stringified = serde_json::to_string(&response.results)
.unwrap_or_else(|_| "{ error: \"failed to create memory report\"}".to_owned());
promise.resolve_native(&stringified, can_gc);
}
}

View file

@ -247,8 +247,19 @@ macro_rules! path {
/// The results produced by the memory reporter.
#[derive(Debug, Deserialize, Serialize)]
pub struct MemoryReportResult {
/// The stringified output.
pub content: String,
/// All the results from the MemoryReports
pub results: Vec<MemoryReport>,
}
#[derive(Debug, Deserialize, Serialize)]
/// A simple memory report
pub struct MemoryReport {
/// The pid of the report
pub pid: u32,
/// Is this the main process
pub is_main_process: bool,
/// All the reports for this pid
pub reports: Vec<Report>,
}
/// Messages that can be sent to the memory profiler thread.