EmbarkStudios / EmbarkStudios/puffin

Record thread relationships

Open
#174 0 comments 1 reaction 0 assignees View on GitHub
enhancement
Dominant language
Rust
Stars
1.7k
Forks
111
Avg merge
2h 50m
Merged PRs (30d)
1

Description

I'd like to be able to record the relationship between a "parent" thread and the tasks it spawns. Consider this:

```rust
use rayon::prelude::*;

fn do_many_jobs(jobs: &[Jobs]) -> Vec {
puffin::profile_scope!("do_many_jobs")!;
jobs.par_iter().map(|job| {
puffin::profile_scope!("do_job");
do_job(job);
}).collect()
}
```

This will show up as one thread with `do_many_jobs`, and then maybe four worker threads doing `do_job`. In the flamegrpah however, there is no relationship behind them. It would be great if each `do_job` scope had an arrow pointing to it from the `do_many_jobs` scope, showing their connection.

We could maybe accomplish this with something like

```rust
use rayon::prelude::*;

fn do_many_jobs(jobs: &[Jobs]) -> Vec {
puffin::profile_scope!("do_many_jobs")!;
let parent_thread_id = puffin::thread_id();
jobs.par_iter().map(move |job| {
puffin::profile_scope!("do_job", parent=parent_thread_id);
do_job(job);
}).collect()
}
```

In the recording stream, these thread relationships would be rare, but would require some additional dynamic data. For instance, one extra control-byte which, if some bit is set in it, would be followed by a thread id.
We could use another bit in the same control-byte to indicate if there is any dynamic string, saving us a byte again in common cases.

The thread-id could be the `u64` returned by `std::thread::current().id().as_u64`.

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.