Skip to content

Conversation

@LloydW93
Copy link

In #7197 and #7306, improved capabilities of task hooks were discussed and an initial implementation provided. However, that involved quite wide-reaching changes, modifying every spawn site and introducing a global map to provide the full inheritance capabilities originally proposed.

This is the first part of a more basic version where we only use the existing hooks and provide the capabilities for consumers to be able to implement more complex relationships if needed, just adding an optional user data ref to the task header.

The additional data is 2*usize, and is not enough to result in the struct requiring more than one cache line.

A user is now able to use their own global map to build inheritance capabilities if needed, and this would be made simpler by also exposing the current task user data to the on_task_spawn hook, which a followup will look to do.

Motivation

See #7306. The intent is to allow persistence of context for across evaluations of task hooks, which is potentially also accessible by the task itself.

For example you may want to just know how many poll()s a task took, metrics of each poll duration (or between each poll duration), or to set some flag to track what a task was about to do (e.g. read some bytes from a socket) to identify what a task has become blocked on.

Solution

By adding a fat pointer for task metadata, consumers are able to attack a reference to data of an arbitrary type for a task, which we then expose in hooks. This metadata can be configured at task spawn time, also allowing consumers to maintain some shared reference between the hooks and the task's future itself to maintain knowledge of what is going on.

In tokio-rs#7197 and tokio-rs#7306, improved capabilities of task hooks were
discussed and an initial implementation provided. However, that
involved quite wide-reaching changes, modifying every spawn site
and introducing a global map to provide the full inheritance
capabilities originally proposed.

This is the first part of a more basic version where we only use
the existing hooks and provide the capabilities for consumers to
be able to implement more complex relationships if needed, just
adding an optional user data ref to the task header.

The additional data is 2*usize, and is not enough to result in
the struct requiring more than one cache line.

A user is now able to use their own global map to build inheritance
capabilities if needed, and this would be made simpler by also
exposing the current task user data to the on_task_spawn hook,
which a followup will look to do.
@github-actions github-actions bot added R-loom-current-thread Run loom current-thread tests on this PR R-loom-multi-thread Run loom multi-thread tests on this PR labels Oct 15, 2025
…ast helpers

It's nicer syntactically to be able to directly pass whatever type
and have tokio deal with how the user data is stored, but it
makes on_task_spawn have a horrible wrapper function, so just take
that out to keep things simpler and nicer for now.
@ADD-SP ADD-SP added A-tokio Area: The main tokio crate M-runtime Module: tokio/runtime labels Oct 16, 2025
Copy link
Member

@ADD-SP ADD-SP left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we need to make an agreement on public interface before talking about the implementation details.

I prefer to discuss the public interface and high-level data structure design in the RFC first.

@Darksonn
Copy link
Contributor

Yes, it's useful with an overview of the public API being added.

Addressing PR comments:
- UserData is now `Send + Sync` when using `rt-multi-thread`
- The runtime::Builder docs now signpost to the `task::Builder`
  API for setting user data on a per-task basis rather than
  through the global task spawn hook
- Updated `task::Builder::data` to not consume self to align
  with `task::Builder::name` behaviour
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

A-tokio Area: The main tokio crate M-runtime Module: tokio/runtime R-loom-current-thread Run loom current-thread tests on this PR R-loom-multi-thread Run loom multi-thread tests on this PR

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants