Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Move inject queue to tokio::runtime::task #3939

Merged
merged 6 commits into from Jul 12, 2021
Merged

Move inject queue to tokio::runtime::task #3939

merged 6 commits into from Jul 12, 2021

Conversation

Darksonn
Copy link
Contributor

@Darksonn Darksonn commented Jul 7, 2021

This PR moves the inject queue into the tokio::runtime::task module. This is an incremental change towards the goal of isolating the unsafety in the task module and providing a safe API to tokio::runtime::task.

The main two changes in this PR are:

  1. Move the inject queue from src/runtime/queue.rs to src/runtime/task/inject.rs.
  2. Change Inject::push_batch to an iterator-based interface.

The work-stealing local run queue will continue to have unsafe code despite being outside the task module, but its unsafety is going to be unrelated to the invariants of the tokio::task module.

It may be easier to read this change one commit at the time. The first commit performs no changes to the code besides moving it around and running rustfmt.

@Darksonn Darksonn added A-tokio Area: The main tokio crate M-runtime Module: tokio/runtime labels Jul 7, 2021
Copy link
Member

@carllerche carllerche left a comment

Choose a reason for hiding this comment

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

Change looks great to me, no comments. I asked @hawkw to take a look though as well.

Copy link
Member

@hawkw hawkw left a comment

Choose a reason for hiding this comment

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

looks good to me --- i commented on some very minor nits, but no blockers!

Comment on lines 55 to 60
fn make_fixed_size<T>(buffer: Box<[T]>) -> Box<[T; LOCAL_QUEUE_CAPACITY]> {
assert_eq!(buffer.len(), LOCAL_QUEUE_CAPACITY);

// SAFETY: We check that the length is correct.
unsafe { Box::from_raw(Box::into_raw(buffer).cast()) }
}
Copy link
Member

Choose a reason for hiding this comment

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

is this really necessary? is there a reason we can't just replace the Vec::new with a boxed array literal? if we can't do that, it would be nice to have a comment explaining why, IMO.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

This is the alternative:

Box::new([
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
    UnsafeCell::new(MaybeUninit::new()),
])

Copy link
Member

Choose a reason for hiding this comment

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

ah, um. on second thought let's maybe not do that.

tokio/src/runtime/queue.rs Outdated Show resolved Hide resolved
tokio/src/runtime/queue.rs Show resolved Hide resolved

/// Linked-list tail
tail: Option<NonNull<task::Header>>,
buffer: Box<[UnsafeCell<MaybeUninit<task::Notified<T>>>; LOCAL_QUEUE_CAPACITY]>,
Copy link
Member

Choose a reason for hiding this comment

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

i guess the other question re https://github.com/tokio-rs/tokio/pull/3939/files#r667212885 is, does this even need to be boxed anymore, if it has a fixed size? should we save another layer of indirection by removing the Box, or is there a reason for this to live in a separate allocation beyond sizedness?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

It doesn't need to, no. If I am to come up with a reason, then some allocators probably dislike allocations that are slightly larger than 1024 bytes. I don't know what effect this has in practice. I am open to removing the box.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

I guess another reason is that long fixed size arrays are really awkward to construct for non-copy generic types.

@Darksonn Darksonn merged commit 3b38ebd into master Jul 12, 2021
@Darksonn Darksonn deleted the safe-task branch July 12, 2021 08:31
sthagen added a commit to sthagen/tokio-rs-tokio that referenced this pull request Jul 12, 2021
runtime: move inject queue to `tokio::runtime::task` (tokio-rs#3939)
@Darksonn Darksonn mentioned this pull request Jul 16, 2021
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
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

3 participants