Refactor the memory profiler code to not just return a json string but

the proper struct. This allows other consumers to easily get memory
reports.
I don't think the memory report page is currently covered by tests.

Signed-off-by: Narfinger <Narfinger@users.noreply.github.com>
This commit is contained in:
Narfinger 2025-05-27 16:07:37 +02:00
parent 324196351e
commit 505bb0406e
3 changed files with 20 additions and 18 deletions

View file

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

View file

@ -59,7 +59,8 @@ impl ServoInternalsMethods<crate::DomTypeHolder> for ServoInternals {
impl RoutedPromiseListener<MemoryReportResult> for ServoInternals { impl RoutedPromiseListener<MemoryReportResult> for ServoInternals {
fn handle_response(&self, response: MemoryReportResult, promise: &Rc<Promise>, can_gc: CanGc) { 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();
promise.resolve_native(&stringified, can_gc);
} }
} }

View file

@ -247,8 +247,19 @@ macro_rules! path {
/// The results produced by the memory reporter. /// The results produced by the memory reporter.
#[derive(Debug, Deserialize, Serialize)] #[derive(Debug, Deserialize, Serialize)]
pub struct MemoryReportResult { pub struct MemoryReportResult {
/// The stringified output. /// All the results from the MemoryReports
pub content: String, 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. /// Messages that can be sent to the memory profiler thread.