Skip to content

Commit 1c09c8d

Browse files
committed
Avoid some string clones when serializing response JSON.
1 parent 43f5d64 commit 1c09c8d

File tree

4 files changed

+246
-262
lines changed

4 files changed

+246
-262
lines changed

samply-api/src/hex.rs

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,20 +6,6 @@ where
66
serializer.collect_str(&format_args!("{field:#x}"))
77
}
88

9-
pub fn as_optional_hex_string<S, T>(
10-
field: &Option<T>,
11-
serializer: S,
12-
) -> std::result::Result<S::Ok, S::Error>
13-
where
14-
S: serde::Serializer,
15-
T: std::fmt::LowerHex,
16-
{
17-
match field {
18-
Some(field) => serializer.collect_str(&format_args!("{field:#x}")),
19-
None => serializer.serialize_none(),
20-
}
21-
}
22-
239
pub fn from_prefixed_hex_str<'de, D>(deserializer: D) -> Result<u32, D::Error>
2410
where
2511
D: serde::Deserializer<'de>,

samply-api/src/symbolicate/mod.rs

Lines changed: 10 additions & 110 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,17 @@
11
use std::collections::HashMap;
2-
use std::num::NonZeroU32;
32

43
use samply_symbols::{
54
FileAndPathHelper, FramesLookupResult, LibraryInfo, LookupAddress, SymbolManager,
65
};
76

8-
use crate::api_file_path::to_api_file_path;
97
use crate::error::Error;
108
use crate::to_debug_id;
119

1210
pub mod looked_up_addresses;
1311
pub mod request_json;
1412
pub mod response_json;
1513

16-
use looked_up_addresses::{AddressResults, LookedUpAddresses};
14+
use looked_up_addresses::LookedUpAddresses;
1715
use request_json::Lib;
1816
use serde_json::json;
1917

@@ -36,15 +34,15 @@ impl<'a, H: FileAndPathHelper> SymbolicateApi<'a, H> {
3634

3735
pub async fn query_api_fallible_json(&self, request_json: &str) -> Result<String, Error> {
3836
let request: request_json::Request = serde_json::from_str(request_json)?;
39-
let response = self.query_api(&request).await?;
37+
let response = self.query_api(request).await?;
4038
Ok(serde_json::to_string(&response)?)
4139
}
4240

4341
pub async fn query_api(
4442
&self,
45-
request: &request_json::Request,
43+
request: request_json::Request,
4644
) -> Result<response_json::Response, Error> {
47-
let requested_addresses = gather_requested_addresses(request)?;
45+
let requested_addresses = gather_requested_addresses(&request)?;
4846
let symbolicated_addresses = self
4947
.symbolicate_requested_addresses(requested_addresses)
5048
.await;
@@ -157,111 +155,13 @@ fn gather_requested_addresses(
157155
}
158156

159157
fn create_response(
160-
request: &request_json::Request,
158+
request: request_json::Request,
161159
symbolicated_addresses: HashMap<Lib, Result<LookedUpAddresses, samply_symbols::Error>>,
162160
) -> response_json::Response {
163-
use response_json::{DebugInfo, FrameDebugInfo, Response, Stack, StackFrame, Symbol};
161+
use response_json::{Response, Results};
164162

165-
fn result_for_job(
166-
job: &request_json::Job,
167-
symbolicated_addresses: &HashMap<Lib, Result<LookedUpAddresses, samply_symbols::Error>>,
168-
) -> response_json::Result {
169-
let mut found_modules = HashMap::new();
170-
let mut module_errors = HashMap::new();
171-
let mut symbols_by_module_index = HashMap::new();
172-
for (module_index, lib) in job.memory_map.iter().enumerate() {
173-
if let Some(symbol_result) = symbolicated_addresses.get(lib) {
174-
let module_key = format!("{}/{}", lib.debug_name, lib.breakpad_id);
175-
match symbol_result {
176-
Ok(symbols) => {
177-
symbols_by_module_index
178-
.insert(module_index as u32, &symbols.address_results);
179-
}
180-
Err(err) => {
181-
module_errors.insert(module_key.clone(), vec![err.into()]);
182-
}
183-
}
184-
found_modules.insert(module_key, symbol_result.is_ok());
185-
}
186-
}
187-
188-
let stacks = job.stacks.iter().map(|stack| {
189-
response_stack_for_request_stack(stack, &job.memory_map, &symbols_by_module_index)
190-
});
191-
192-
response_json::Result {
193-
stacks: stacks.collect(),
194-
found_modules,
195-
module_errors,
196-
}
197-
}
198-
199-
fn response_stack_for_request_stack(
200-
stack: &request_json::Stack,
201-
memory_map: &[Lib],
202-
symbols_by_module_index: &HashMap<u32, &AddressResults>,
203-
) -> Stack {
204-
let frames = stack.0.iter().enumerate().map(|(frame_index, frame)| {
205-
response_frame_for_request_frame(
206-
frame,
207-
frame_index as u32,
208-
memory_map,
209-
symbols_by_module_index,
210-
)
211-
});
212-
Stack(frames.collect())
213-
}
214-
215-
fn response_frame_for_request_frame(
216-
frame: &request_json::StackFrame,
217-
frame_index: u32,
218-
memory_map: &[Lib],
219-
symbols_by_module_index: &HashMap<u32, &AddressResults>,
220-
) -> StackFrame {
221-
let symbol = symbols_by_module_index
222-
.get(&frame.module_index)
223-
.and_then(|symbol_map| {
224-
// If we have a symbol table for this library, then we know that
225-
// this address is present in it.
226-
symbol_map
227-
.get(&frame.address)
228-
.unwrap()
229-
.as_ref()
230-
.map(|address_result| Symbol {
231-
function: address_result.symbol_name.clone(),
232-
function_offset: frame.address - address_result.symbol_address,
233-
function_size: address_result.function_size,
234-
debug_info: address_result.inline_frames.as_ref().map(|frames| {
235-
let (outer, inlines) = frames
236-
.split_last()
237-
.expect("inline_frames should always have at least one element");
238-
DebugInfo {
239-
file: outer.file_path.as_ref().map(to_api_file_path),
240-
line: outer.line_number.and_then(NonZeroU32::new),
241-
inlines: inlines
242-
.iter()
243-
.map(|inline_frame| FrameDebugInfo {
244-
function: inline_frame.function.clone(),
245-
file: inline_frame.file_path.as_ref().map(to_api_file_path),
246-
line: inline_frame.line_number.and_then(NonZeroU32::new),
247-
})
248-
.collect(),
249-
}
250-
}),
251-
})
252-
});
253-
StackFrame {
254-
frame: frame_index,
255-
module_offset: frame.address,
256-
module: memory_map[frame.module_index as usize].debug_name.clone(),
257-
symbol,
258-
}
259-
}
260-
261-
Response {
262-
results: request
263-
.jobs()
264-
.map(|job| result_for_job(job, &symbolicated_addresses))
265-
.collect(),
266-
}
163+
Response(Results {
164+
request,
165+
symbolicated_addresses,
166+
})
267167
}

samply-api/src/symbolicate/request_json.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ impl Request {
2020
#[serde(rename_all = "camelCase")]
2121
pub struct Job {
2222
pub memory_map: Vec<Lib>,
23-
pub stacks: Vec<Stack>,
23+
pub stacks: Vec<RequestStack>,
2424
}
2525

2626
#[derive(Deserialize, Debug, PartialEq, Eq, Hash, Clone)]
@@ -30,10 +30,10 @@ pub struct Lib {
3030
}
3131

3232
#[derive(Deserialize, Debug)]
33-
pub struct Stack(pub Vec<StackFrame>);
33+
pub struct RequestStack(pub Vec<RequestFrame>);
3434

3535
#[derive(Deserialize, Debug)]
36-
pub struct StackFrame {
36+
pub struct RequestFrame {
3737
/// index into memory_map
3838
pub module_index: u32,
3939
/// lib-relative memory offset

0 commit comments

Comments
 (0)