Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Fix inverted flamegraph width
The inverted view used thread presence as a proxy for self time.
This missed self samples on C-level wrapper frames like _run_code,
where the node's thread always appears in its children too. Those
samples were silently dropped, causing the chart to render narrower
than full width. Now uses the explicit self field on each node
instead of the thread heuristic.
  • Loading branch information
ivonastojanovic committed Apr 14, 2026
commit 2df739439812c0a2cf8dba5769119275c39cdefe
15 changes: 5 additions & 10 deletions Lib/profiling/sampling/_flamegraph_assets/flamegraph.js
Original file line number Diff line number Diff line change
Expand Up @@ -1063,11 +1063,7 @@ function populateStats(data) {
funcname = funcname || 'unknown';

if (filename !== 'unknown' && funcname !== 'unknown' && node.value > 0) {
let childrenValue = 0;
if (node.children) {
childrenValue = node.children.reduce((sum, child) => sum + child.value, 0);
}
const directSamples = Math.max(0, node.value - childrenValue);
const directSamples = node.self || 0;

const funcKey = `${filename}:${node.lineno || '?'}:${funcname}`;

Expand Down Expand Up @@ -1345,14 +1341,13 @@ function processLeaf(invertedRoot, path, leafNode, isDifferential) {
}

function traverseInvert(path, currentNode, invertedRoot, isDifferential) {
const children = currentNode.children || [];
const childThreads = new Set(children.flatMap(c => c.threads || []));
const selfThreads = (currentNode.threads || []).filter(t => !childThreads.has(t));
const selfValue = currentNode.self || 0;

if (selfThreads.length > 0) {
processLeaf(invertedRoot, path, { ...currentNode, threads: selfThreads }, isDifferential);
if (selfValue > 0) {
processLeaf(invertedRoot, path, { ...currentNode, value: selfValue }, isDifferential);
}

const children = currentNode.children || [];
children.forEach(child => traverseInvert(path.concat([child]), child, invertedRoot, isDifferential));
}

Expand Down
Loading