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

net: add types for named Unix pipes #5351

Merged
merged 40 commits into from
Feb 27, 2023
Merged

Conversation

satakuma
Copy link
Member

@satakuma satakuma commented Jan 5, 2023

Motivation

This change provides types to asynchronously read and write to named Unix pipes (FIFOs). Currently, the only way to use named pipes is either using tokio::fs::File, which spawns blocking tasks, or using AsyncFd, which does not implement AsyncRead and AsyncWrite.

See also #5318.

Solution

This change exposes a new module: tokio::net::pipe with Sender and Receiver types, which represent a writing end and a reading end of a Unix pipe, respectively. Both types encapsulate corresponding Sender and Receiver types from mio, which in turn use std::fs::File underneath to handle reads and writes.

Sender is AsyncWrite and Receiver is AsyncRead. Following the pattern of other types from net such as ReadHalf/WriteHalf for socket streams, Receiver additionally has:

  • poll_read_ready
  • readable
  • ready
  • try_read
  • try_read_vectored
  • try_read_buf

and Sender has:

  • poll_write_ready
  • writable
  • ready
  • try_write
  • try_write_vectored

I considered omitting ready methods, since the communication is already one-way and there are readable/writable functions for waiting for readiness. However, ready method allows inspecting readiness events and distinguishing READ_CLOSED from READABLE events, what might be the reason why types such as OwnedReadHalf have ready functions in the first place. Therefore, I decided to follow the pattern and include ready methods as well.

Opening a FIFO

Creating a pipe from a FIFO file is done by opening the file with a proper access mode flag, see fifo(7). open methods on Sender/Receiver types open FIFO files for writing/reading in non-blocking mode and register them in the event loop.

However, there is a requirement that the reading end has to be opened before any writing end. If a Sender opens a FIFO with no readers, the open will immediately fail with ENXIO. For that reason, docs for Sender::open include an example presenting how to wait for the reading end by sleeping in a loop.

On Linux, it is also possible to open a FIFO file in access mode for both reading and writing. Such open will never fail and can be used as a workaround to this problem. For Linux users Sender::open_rw can open a FIFO file in the O_RDWR access mode. Note that the reading access won't be used in practice, as Sender has no methods/traits to read from a pipe and is not registered in the event loop with interest for read events.

Sender/Receiver also have from_file methods which handle conversion from std Files holding a file descriptor to a pipe. from_file is necessary for users which are not sure whether a file is a special FIFO file that can be opened with the open method. In such case they can use File methods to inspect file's metadata and then convert it to a pipe.

Next steps

Since on a Unix system anonymous pipes and named pipes (FIFOs) are only different in the way they are created (pipe() syscall vs. mkfifo + open), Sender/Receiver types can provide one abstraction for both cases. Usage of anonymous pipes is almost exclusively restricted to communication with spawned processes, and for that there already is an async interface in tokio::process with types like ChildStdin etc. A user may wish to have one type for pipes used to communicate with children processes and for pipes created from FIFO files in a filesystem. I think it's reasonable to add integration with types from tokio::process. This can be done in the following way:

  1. Construct a single, internal type backing pipe operations, for example in tokio::io::unix. This type can be done the same way as ChildStdio i.e. use SourceFd instead of types from mio::unix::pipe.
  2. Refactor the code to use the same type internally for named pipes in net and for anonymous pipes in process.
  3. Implement From<ChildStdin> for Sender and From<ChildStdout>,From<ChildStderr> for Receiver. This conversion can be infallible since the pipe is already registered in the event loop.

@NobodyXu
Copy link
Contributor

NobodyXu commented Jan 5, 2023

Thanks for the great work!

Usage of anonymous pipes is almost exclusively restricted to communication with spawned processes, and for that there already is an async interface in tokio::process with types like ChildStdin etc.

I would definitely love to see annoymous pipe support in tokio, if this PR is merged.
Support for annoymous pipe would be really easy with this PR.

Also, if you check the dependents of tokio-pipe, a crate for annoymous pipe only, you can find quite some crates dependent on it.

tokio-pipe also provides splice/tee support in addition to write/read.

@satakuma
Copy link
Member Author

satakuma commented Jan 6, 2023

It might be worthwhile to rethink whether net is the right place for types from this PR, especially if tokio plans to support anonymous pipes with them. Unix pipes are quite different from net types such as Unix domain sockets and windows named pipe in the sense that there is no connect and no client/server structure. tokio::io::unix::pipe looks reasonable to me, next to the AsyncFd.

Basic support for anonymous pipes probably boils down to just adding the new_pair function like this:

fn new_pair() -> io::Result<(Sender, Receiver)>

Additional support like splice/tee from tokio-pipe can be done later if needed.

@NobodyXu
Copy link
Contributor

NobodyXu commented Jan 6, 2023

tokio::io::unix::pipe looks reasonable to me, next to the AsyncFd.

I agree, I think that's the right place for unix pipes.

If someone want to provide portable named pipe over unix and windows named pipe, then can simply provide an abstraction in tokio::net later.

Basic support for anonymous pipes probably boils down to just adding the new_pair function like this:

That's probably enough, but would be great if we can also set flags such as O_CLOEXEC.

Additional support like splice/tee from tokio-pipe can be done later if needed.

👍

@Noah-Kennedy
Copy link
Contributor

I need to take some time to go through this.

/// The runtime is usually set implicitly when this function is called
/// from a future driven by a tokio runtime, otherwise runtime can be set
/// explicitly with [`Runtime::enter`](crate::runtime::Runtime::enter) function.
pub fn from_file(file: File) -> io::Result<Sender> {
Copy link
Contributor

Choose a reason for hiding this comment

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

I suggest that we could add some extra checks on whether it's writeable and actually a pipe fd here, similar to how tokio_pipe::PipeFd::from_raw_fd_checked performs the check.

Copy link
Contributor

Choose a reason for hiding this comment

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

I'm not really sure that this is necessary.

Copy link
Contributor

Choose a reason for hiding this comment

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

I'm not really sure that this is necessary.

While it's not absolutely necessary, checking it will rule out some stupid mistakes, e.g. user opened a regular file and passed it to Sender::from_file, or they opened the read end of a pipe and passed it here.

It's still runtime error, but better than no error.

Copy link
Contributor

Choose a reason for hiding this comment

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

Also, I think it would be better to use OwnedFd here instead of File:

fn from_owned_fd(fd: Into<OwnedFd>) -> io::Result<Sender>;

since impl From<File> for OwnedFd makes it possible to create OwnedFd from File.

There are also From<ChildStdin>, From<ChildStdOut> and From<ChildStdErr> implementation, which would makes this function more useful.

Copy link
Contributor

Choose a reason for hiding this comment

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

I think it would be best to do both File and OwnedFd separately. For now I don't think we can support OwnedFd though due to MSRV.

Regarding the check, I'm hesitant as I've seen plenty of weird cases before where people use different weird linux APIs and then open them as tokio types which use the same system calls under the hood for interaction. I could totally see people trying to use this to open different things that aren't strictly pipes but are readable or writable only. Do we want to disqualify this use case?

If we decide to do a check now, it will be a breaking change to remove it, so we need to think this through.

Copy link
Contributor

Choose a reason for hiding this comment

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

I could totally see people trying to use this to open different things that aren't strictly pipes but are readable or writable only. Do we want to disqualify this use case?

They already have AsyncFd for that and tokio also provides unix socket, tcp/udp socket, etc.

I don't see why people would want to create Sender from File, since regular file are blocking, other special files mostly the same.

The only thing that I can think of is people trying to open a named unix socket, but it is already taken care of by UnixStream::connect, not to mentio that Sender does not provide several functions that is available in UnixStream and functionalities that will be included (e.g. send fd over unix socket).

Copy link
Contributor

Choose a reason for hiding this comment

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

I think it would be best to do both File and OwnedFd separately. For now I don't think we can support OwnedFd though due to MSRV.

Oops, then it makes sense to have two separate functions.
It's a shame we can't just have one from_owned_fd function.

Copy link
Member Author

Choose a reason for hiding this comment

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

The same argument about the extra checks can be made against open methods, since they also don't check if the file is a FIFO file. My problem with such validation is that it costs additional syscalls, which are probably unnecessary most of the time. At first, I wanted to make a pair of open/open_unchecked functions for each type like here, but now I think it would be better to avoid syscall overhead by default. The purpose of adding from_file was to let the user do all sort of checks with a FIFO file if they need to, and then do the conversion. It's not possible to do those checks independently before calling Sender::open because of TOCTTOU.

Note that the docs for from_file warn users to make sure the access mode is correct etc. Maybe this should be more emphasized, or it should be renamed to from_file_unchecked and then we can add a from_file variant with checks.

Copy link
Contributor

Choose a reason for hiding this comment

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

It's not possible to do those checks independently before calling Sender::open because of TOCTTOU.

That's true, it's only possible after the file is opened.

Maybe this should be more emphasized, or it should be renamed to from_file_unchecked and then we can add a from_file variant with checks.

IMHO renaming it to from_file_unchecked and adding a new from_file would be better.

/// The runtime is usually set implicitly when this function is called
/// from a future driven by a tokio runtime, otherwise runtime can be set
/// explicitly with [`Runtime::enter`](crate::runtime::Runtime::enter) function.
pub fn from_file(file: File) -> io::Result<Receiver> {
Copy link
Contributor

Choose a reason for hiding this comment

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

Same suggestion as Sender::from_file.

unsafe { &mut *(dst as *mut _ as *mut [std::mem::MaybeUninit<u8>] as *mut [u8]) };

// Safety: We trust `mio_pipe::Receiver::read` to have filled up `n` bytes in the
// buffer.
Copy link
Contributor

Choose a reason for hiding this comment

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

Note that since dst is [MaybeUninit<u8>], we should also add that we trsut mio_pipe::Receiver::read to not read from dst.

Copy link
Contributor

@Noah-Kennedy Noah-Kennedy left a comment

Choose a reason for hiding this comment

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

I'm gonna take another look tomorrow before I approve, but this looks great. I think it's probably fine to merge as is.

/// The runtime is usually set implicitly when this function is called
/// from a future driven by a tokio runtime, otherwise runtime can be set
/// explicitly with [`Runtime::enter`](crate::runtime::Runtime::enter) function.
pub fn open_rw<P>(path: P) -> io::Result<Sender>
Copy link
Contributor

Choose a reason for hiding this comment

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

Why not lock this behind #[cfg(linux)]?

Copy link
Member Author

@satakuma satakuma Jan 6, 2023

Choose a reason for hiding this comment

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

It's probably a good idea, but while only Linux explicitly allows using FIFOs in O_RDWR access mode, it may also be possible on other systems. For example, it seems possible on FreeBSD, but it's lacking documentation or I couldn't find it. So, an experienced user may want to use open_rw on other systems than Linux.

But I think locking it to Linux is the better choice since it will probably prevent more mistakes, I will change it in the next iteration.

Copy link
Contributor

Choose a reason for hiding this comment

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

We could also start with Linux and allow this on other platforms as we find out more

/// The runtime is usually set implicitly when this function is called
/// from a future driven by a tokio runtime, otherwise runtime can be set
/// explicitly with [`Runtime::enter`](crate::runtime::Runtime::enter) function.
pub fn from_file(file: File) -> io::Result<Sender> {
Copy link
Contributor

Choose a reason for hiding this comment

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

I'm not really sure that this is necessary.

/// The runtime is usually set implicitly when this function is called
/// from a future driven by a tokio runtime, otherwise runtime can be set
/// explicitly with [`Runtime::enter`](crate::runtime::Runtime::enter) function.
pub fn from_file(file: File) -> io::Result<Sender> {
Copy link
Contributor

Choose a reason for hiding this comment

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

I'm not really sure that this is necessary.

While it's not absolutely necessary, checking it will rule out some stupid mistakes, e.g. user opened a regular file and passed it to Sender::from_file, or they opened the read end of a pipe and passed it here.

It's still runtime error, but better than no error.

/// The runtime is usually set implicitly when this function is called
/// from a future driven by a tokio runtime, otherwise runtime can be set
/// explicitly with [`Runtime::enter`](crate::runtime::Runtime::enter) function.
pub fn from_file(file: File) -> io::Result<Sender> {
Copy link
Contributor

Choose a reason for hiding this comment

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

Also, I think it would be better to use OwnedFd here instead of File:

fn from_owned_fd(fd: Into<OwnedFd>) -> io::Result<Sender>;

since impl From<File> for OwnedFd makes it possible to create OwnedFd from File.

There are also From<ChildStdin>, From<ChildStdOut> and From<ChildStdErr> implementation, which would makes this function more useful.

@satakuma
Copy link
Member Author

satakuma commented Jan 6, 2023

It may be a good idea to also add the open_rw method to the Receiver. For Sender, the use case for this method is to open a FIFO without waiting for readers in a sleeping loop. For Receiver the use case is something called resilient named pipes, here is a pretty good explanation.

As an example, consider a scenario where a reader wants to receive commands from a named pipe, which are periodically sent by a writer. If it is done like this:

let mut reader = pipe::Receiver::open(path)?;
loop {
    let mut buf = vec![0; 0x100];
    reader.read_exact(&mut buf)?;
    /* handle the command */
}

and the writer closes the file, then the reader will fail in the next iteration with UnexpectedEof because once the writing end has been closed, read operations will keep returning 0 bytes read until the next writer opens the FIFO file. To recover from this the reader has to either re-open the FIFO file or use a sleeping loop to wait for the next writer.

If the reader is opened in the read-write access mode, then he also holds an open writing end and therefore there won't be any EOF. The reader can asynchronously wait for the next writer to open the file without sleeping loops and re-opening the file. Note that this is a Linux-specific solution.

renovate bot added a commit to smartive/zitadel-rust that referenced this pull request May 2, 2024
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [tokio](https://tokio.rs)
([source](https://github.com/tokio-rs/tokio)) | dev-dependencies |
minor | `1` -> `1.37.0` |
| [tokio](https://tokio.rs)
([source](https://github.com/tokio-rs/tokio)) | dependencies | minor |
`1` -> `1.37.0` |

---

### Release Notes

<details>
<summary>tokio-rs/tokio (tokio)</summary>

###
[`v1.37.0`](https://github.com/tokio-rs/tokio/releases/tag/tokio-1.37.0):
Tokio v1.37.0

[Compare
Source](https://github.com/tokio-rs/tokio/compare/tokio-1.36.0...tokio-1.37.0)

### 1.37.0 (March 28th, 2024)

##### Added

-   fs: add `set_max_buf_size` to `tokio::fs::File` ([#&#8203;6411])
- io: add `try_new` and `try_with_interest` to `AsyncFd`
([#&#8203;6345])
-   sync: add `forget_permits` method to semaphore ([#&#8203;6331])
- sync: add `is_closed`, `is_empty`, and `len` to mpsc receivers
([#&#8203;6348])
- sync: add a `rwlock()` method to owned `RwLock` guards
([#&#8203;6418])
- sync: expose strong and weak counts of mpsc sender handles
([#&#8203;6405])
-   sync: implement `Clone` for `watch::Sender` ([#&#8203;6388])
-   task: add `TaskLocalFuture::take_value` ([#&#8203;6340])
-   task: implement `FromIterator` for `JoinSet` ([#&#8203;6300])

##### Changed

- io: make `io::split` use a mutex instead of a spinlock
([#&#8203;6403])

##### Fixed

-   docs: fix docsrs build without net feature ([#&#8203;6360])
-   macros: allow select with only else branch ([#&#8203;6339])
- runtime: fix leaking registration entries when os registration fails
([#&#8203;6329])

##### Documented

- io: document cancel safety of `AsyncBufReadExt::fill_buf`
([#&#8203;6431])
- io: document cancel safety of `AsyncReadExt`'s primitive read
functions ([#&#8203;6337])
- runtime: add doc link from `Runtime` to `#[tokio::main]`
([#&#8203;6366])
-   runtime: make the `enter` example deterministic ([#&#8203;6351])
- sync: add Semaphore example for limiting the number of outgoing
requests ([#&#8203;6419])
-   sync: fix missing period in broadcast docs ([#&#8203;6377])
- sync: mark `mpsc::Sender::downgrade` with `#[must_use]`
([#&#8203;6326])
-   sync: reorder `const_new` before `new_with` ([#&#8203;6392])
-   sync: update watch channel docs ([#&#8203;6395])
-   task: fix documentation links ([#&#8203;6336])

##### Changed (unstable)

-   runtime: include task `Id` in taskdumps ([#&#8203;6328])
- runtime: panic if `unhandled_panic` is enabled when not supported
([#&#8203;6410])

[#&#8203;6300]: https://github.com/tokio-rs/tokio/pull/6300

[#&#8203;6326]: https://github.com/tokio-rs/tokio/pull/6326

[#&#8203;6328]: https://github.com/tokio-rs/tokio/pull/6328

[#&#8203;6329]: https://github.com/tokio-rs/tokio/pull/6329

[#&#8203;6331]: https://github.com/tokio-rs/tokio/pull/6331

[#&#8203;6336]: https://github.com/tokio-rs/tokio/pull/6336

[#&#8203;6337]: https://github.com/tokio-rs/tokio/pull/6337

[#&#8203;6339]: https://github.com/tokio-rs/tokio/pull/6339

[#&#8203;6340]: https://github.com/tokio-rs/tokio/pull/6340

[#&#8203;6345]: https://github.com/tokio-rs/tokio/pull/6345

[#&#8203;6348]: https://github.com/tokio-rs/tokio/pull/6348

[#&#8203;6351]: https://github.com/tokio-rs/tokio/pull/6351

[#&#8203;6360]: https://github.com/tokio-rs/tokio/pull/6360

[#&#8203;6366]: https://github.com/tokio-rs/tokio/pull/6366

[#&#8203;6377]: https://github.com/tokio-rs/tokio/pull/6377

[#&#8203;6388]: https://github.com/tokio-rs/tokio/pull/6388

[#&#8203;6392]: https://github.com/tokio-rs/tokio/pull/6392

[#&#8203;6395]: https://github.com/tokio-rs/tokio/pull/6395

[#&#8203;6403]: https://github.com/tokio-rs/tokio/pull/6403

[#&#8203;6405]: https://github.com/tokio-rs/tokio/pull/6405

[#&#8203;6410]: https://github.com/tokio-rs/tokio/pull/6410

[#&#8203;6411]: https://github.com/tokio-rs/tokio/pull/6411

[#&#8203;6418]: https://github.com/tokio-rs/tokio/pull/6418

[#&#8203;6419]: https://github.com/tokio-rs/tokio/pull/6419

[#&#8203;6431]: https://github.com/tokio-rs/tokio/pull/6431

###
[`v1.36.0`](https://github.com/tokio-rs/tokio/releases/tag/tokio-1.36.0):
Tokio v1.36.0

[Compare
Source](https://github.com/tokio-rs/tokio/compare/tokio-1.35.1...tokio-1.36.0)

### 1.36.0 (February 2nd, 2024)

##### Added

-   io: add `tokio::io::Join` ([#&#8203;6220])
-   io: implement `AsyncWrite` for `Empty` ([#&#8203;6235])
-   net: add support for anonymous unix pipes ([#&#8203;6127])
-   net: add `UnixSocket` ([#&#8203;6290])
-   net: expose keepalive option on `TcpSocket` ([#&#8203;6311])
- sync: add `{Receiver,UnboundedReceiver}::poll_recv_many`
([#&#8203;6236])
-   sync: add `Sender::{try_,}reserve_many` ([#&#8203;6205])
-   sync: add `watch::Receiver::mark_unchanged` ([#&#8203;6252])
-   task: add `JoinSet::try_join_next` ([#&#8203;6280])

##### Changed

-   io: make `copy` cooperative ([#&#8203;6265])
-   io: make `repeat` and `sink` cooperative ([#&#8203;6254])
-   io: simplify check for empty slice ([#&#8203;6293])
-   process: use pidfd on Linux when available ([#&#8203;6152])
-   sync: use AtomicBool in broadcast channel future ([#&#8203;6298])

##### Documented

-   io: clarify `clear_ready` docs ([#&#8203;6304])
- net: document that `*Fd` traits on `TcpSocket` are unix-only
([#&#8203;6294])
- sync: document FIFO behavior of `tokio::sync::Mutex` ([#&#8203;6279])
-   chore: typographic improvements ([#&#8203;6262])
-   runtime: remove obsolete comment ([#&#8203;6303])
-   task: fix typo ([#&#8203;6261])

[#&#8203;6220]: https://github.com/tokio-rs/tokio/pull/6220

[#&#8203;6235]: https://github.com/tokio-rs/tokio/pull/6235

[#&#8203;6127]: https://github.com/tokio-rs/tokio/pull/6127

[#&#8203;6290]: https://github.com/tokio-rs/tokio/pull/6290

[#&#8203;6311]: https://github.com/tokio-rs/tokio/pull/6311

[#&#8203;6236]: https://github.com/tokio-rs/tokio/pull/6236

[#&#8203;6205]: https://github.com/tokio-rs/tokio/pull/6205

[#&#8203;6252]: https://github.com/tokio-rs/tokio/pull/6252

[#&#8203;6280]: https://github.com/tokio-rs/tokio/pull/6280

[#&#8203;6265]: https://github.com/tokio-rs/tokio/pull/6265

[#&#8203;6254]: https://github.com/tokio-rs/tokio/pull/6254

[#&#8203;6293]: https://github.com/tokio-rs/tokio/pull/6293

[#&#8203;6238]: https://github.com/tokio-rs/tokio/pull/6238

[#&#8203;6152]: https://github.com/tokio-rs/tokio/pull/6152

[#&#8203;6298]: https://github.com/tokio-rs/tokio/pull/6298

[#&#8203;6262]: https://github.com/tokio-rs/tokio/pull/6262

[#&#8203;6303]: https://github.com/tokio-rs/tokio/pull/6303

[#&#8203;6261]: https://github.com/tokio-rs/tokio/pull/6261

[#&#8203;6304]: https://github.com/tokio-rs/tokio/pull/6304

[#&#8203;6294]: https://github.com/tokio-rs/tokio/pull/6294

[#&#8203;6279]: https://github.com/tokio-rs/tokio/pull/6279

###
[`v1.35.1`](https://github.com/tokio-rs/tokio/releases/tag/tokio-1.35.1):
Tokio v1.35.1

[Compare
Source](https://github.com/tokio-rs/tokio/compare/tokio-1.35.0...tokio-1.35.1)

### 1.35.1 (December 19, 2023)

This is a forward part of a change that was backported to 1.25.3.

##### Fixed

- io: add budgeting to `tokio::runtime::io::registration::async_io`
([#&#8203;6221])

[#&#8203;6221]: https://github.com/tokio-rs/tokio/pull/6221

###
[`v1.35.0`](https://github.com/tokio-rs/tokio/releases/tag/tokio-1.35.0):
Tokio v1.35.0

[Compare
Source](https://github.com/tokio-rs/tokio/compare/tokio-1.34.0...tokio-1.35.0)

### 1.35.0 (December 8th, 2023)

##### Added

-   net: add Apple watchOS support ([#&#8203;6176])

##### Changed

- io: drop the `Sized` requirements from `AsyncReadExt.read_buf`
([#&#8203;6169])
-   runtime: make `Runtime` unwind safe ([#&#8203;6189])
-   runtime: reduce the lock contention in task spawn ([#&#8203;6001])
-   tokio: update nix dependency to 0.27.1 ([#&#8203;6190])

##### Fixed

-   chore: make `--cfg docsrs` work without net feature ([#&#8203;6166])
-   chore: use relaxed load for `unsync_load` on miri ([#&#8203;6179])
-   runtime: handle missing context on wake ([#&#8203;6148])
-   taskdump: fix taskdump cargo config example ([#&#8203;6150])
-   taskdump: skip notified tasks during taskdumps ([#&#8203;6194])
- tracing: avoid creating resource spans with current parent, use a None
parent instead ([#&#8203;6107])
-   tracing: make task span explicit root ([#&#8203;6158])

##### Documented

-   io: flush in `AsyncWriteExt` examples ([#&#8203;6149])
- runtime: document fairness guarantees and current behavior
([#&#8203;6145])
- task: document cancel safety of `LocalSet::run_until` ([#&#8203;6147])

[#&#8203;6001]: https://github.com/tokio-rs/tokio/pull/6001

[#&#8203;6107]: https://github.com/tokio-rs/tokio/pull/6107

[#&#8203;6144]: https://github.com/tokio-rs/tokio/pull/6144

[#&#8203;6145]: https://github.com/tokio-rs/tokio/pull/6145

[#&#8203;6147]: https://github.com/tokio-rs/tokio/pull/6147

[#&#8203;6148]: https://github.com/tokio-rs/tokio/pull/6148

[#&#8203;6149]: https://github.com/tokio-rs/tokio/pull/6149

[#&#8203;6150]: https://github.com/tokio-rs/tokio/pull/6150

[#&#8203;6158]: https://github.com/tokio-rs/tokio/pull/6158

[#&#8203;6166]: https://github.com/tokio-rs/tokio/pull/6166

[#&#8203;6169]: https://github.com/tokio-rs/tokio/pull/6169

[#&#8203;6176]: https://github.com/tokio-rs/tokio/pull/6176

[#&#8203;6179]: https://github.com/tokio-rs/tokio/pull/6179

[#&#8203;6189]: https://github.com/tokio-rs/tokio/pull/6189

[#&#8203;6190]: https://github.com/tokio-rs/tokio/pull/6190

[#&#8203;6194]: https://github.com/tokio-rs/tokio/pull/6194

###
[`v1.34.0`](https://github.com/tokio-rs/tokio/releases/tag/tokio-1.34.0):
Tokio v1.34.0

[Compare
Source](https://github.com/tokio-rs/tokio/compare/tokio-1.33.0...tokio-1.34.0)

##### Fixed

- io: allow `clear_readiness` after io driver shutdown ([#&#8203;6067])
-   io: fix integer overflow in `take` ([#&#8203;6080])
-   io: fix I/O resource hang ([#&#8203;6134])
-   sync: fix `broadcast::channel` link ([#&#8203;6100])

##### Changed

- macros: use `::core` qualified imports instead of `::std` inside
`tokio::test` macro ([#&#8203;5973])

##### Added

- fs: update cfg attr in `fs::read_dir` to include `aix`
([#&#8203;6075])
-   sync: add `mpsc::Receiver::recv_many` ([#&#8203;6010])
-   tokio: added vita target support ([#&#8203;6094])

[#&#8203;5973]: https://github.com/tokio-rs/tokio/pull/5973

[#&#8203;6067]: https://github.com/tokio-rs/tokio/pull/6067

[#&#8203;6080]: https://github.com/tokio-rs/tokio/pull/6080

[#&#8203;6134]: https://github.com/tokio-rs/tokio/pull/6134

[#&#8203;6100]: https://github.com/tokio-rs/tokio/pull/6100

[#&#8203;6075]: https://github.com/tokio-rs/tokio/pull/6075

[#&#8203;6010]: https://github.com/tokio-rs/tokio/pull/6010

[#&#8203;6094]: https://github.com/tokio-rs/tokio/pull/6094

###
[`v1.33.0`](https://github.com/tokio-rs/tokio/releases/tag/tokio-1.33.0):
Tokio v1.33.0

[Compare
Source](https://github.com/tokio-rs/tokio/compare/tokio-1.32.1...tokio-1.33.0)

### 1.33.0 (October 9, 2023)

##### Fixed

-   io: mark `Interest::add` with `#[must_use]` ([#&#8203;6037])
-   runtime: fix cache line size for RISC-V ([#&#8203;5994])
- sync: prevent lock poisoning in `watch::Receiver::wait_for`
([#&#8203;6021])
-   task: fix `spawn_local` source location ([#&#8203;5984])

##### Changed

- sync: use Acquire/Release orderings instead of SeqCst in `watch`
([#&#8203;6018])

##### Added

-   fs: add vectored writes to `tokio::fs::File` ([#&#8203;5958])
-   io: add `Interest::remove` method ([#&#8203;5906])
-   io: add vectored writes to `DuplexStream` ([#&#8203;5985])
-   net: add Apple tvOS support ([#&#8203;6045])
- sync: add `?Sized` bound to `{MutexGuard,OwnedMutexGuard}::map`
([#&#8203;5997])
- sync: add `watch::Receiver::mark_unseen` ([#&#8203;5962],
[#&#8203;6014], [#&#8203;6017])
-   sync: add `watch::Sender::new` ([#&#8203;5998])
-   sync: add const fn `OnceCell::from_value` ([#&#8203;5903])

##### Removed

-   remove unused `stats` feature ([#&#8203;5952])

##### Documented

- add missing backticks in code examples ([#&#8203;5938],
[#&#8203;6056])
-   fix typos ([#&#8203;5988], [#&#8203;6030])
-   process: document that `Child::wait` is cancel safe ([#&#8203;5977])
- sync: add examples for `Semaphore` ([#&#8203;5939], [#&#8203;5956],
[#&#8203;5978], [#&#8203;6031], [#&#8203;6032], [#&#8203;6050])
- sync: document that `broadcast` capacity is a lower bound
([#&#8203;6042])
-   sync: document that `const_new` is not instrumented ([#&#8203;6002])
- sync: improve cancel-safety documentation for `mpsc::Sender::send`
([#&#8203;5947])
-   sync: improve docs for `watch` channel ([#&#8203;5954])
-   taskdump: render taskdump documentation on docs.rs ([#&#8203;5972])

##### Unstable

-   taskdump: fix potential deadlock ([#&#8203;6036])

[#&#8203;5903]: https://github.com/tokio-rs/tokio/pull/5903

[#&#8203;5906]: https://github.com/tokio-rs/tokio/pull/5906

[#&#8203;5938]: https://github.com/tokio-rs/tokio/pull/5938

[#&#8203;5939]: https://github.com/tokio-rs/tokio/pull/5939

[#&#8203;5947]: https://github.com/tokio-rs/tokio/pull/5947

[#&#8203;5952]: https://github.com/tokio-rs/tokio/pull/5952

[#&#8203;5954]: https://github.com/tokio-rs/tokio/pull/5954

[#&#8203;5956]: https://github.com/tokio-rs/tokio/pull/5956

[#&#8203;5958]: https://github.com/tokio-rs/tokio/pull/5958

[#&#8203;5960]: https://github.com/tokio-rs/tokio/pull/5960

[#&#8203;5962]: https://github.com/tokio-rs/tokio/pull/5962

[#&#8203;5971]: https://github.com/tokio-rs/tokio/pull/5971

[#&#8203;5972]: https://github.com/tokio-rs/tokio/pull/5972

[#&#8203;5977]: https://github.com/tokio-rs/tokio/pull/5977

[#&#8203;5978]: https://github.com/tokio-rs/tokio/pull/5978

[#&#8203;5984]: https://github.com/tokio-rs/tokio/pull/5984

[#&#8203;5985]: https://github.com/tokio-rs/tokio/pull/5985

[#&#8203;5988]: https://github.com/tokio-rs/tokio/pull/5988

[#&#8203;5994]: https://github.com/tokio-rs/tokio/pull/5994

[#&#8203;5997]: https://github.com/tokio-rs/tokio/pull/5997

[#&#8203;5998]: https://github.com/tokio-rs/tokio/pull/5998

[#&#8203;6002]: https://github.com/tokio-rs/tokio/pull/6002

[#&#8203;6014]: https://github.com/tokio-rs/tokio/pull/6014

[#&#8203;6017]: https://github.com/tokio-rs/tokio/pull/6017

[#&#8203;6018]: https://github.com/tokio-rs/tokio/pull/6018

[#&#8203;6021]: https://github.com/tokio-rs/tokio/pull/6021

[#&#8203;6030]: https://github.com/tokio-rs/tokio/pull/6030

[#&#8203;6031]: https://github.com/tokio-rs/tokio/pull/6031

[#&#8203;6032]: https://github.com/tokio-rs/tokio/pull/6032

[#&#8203;6036]: https://github.com/tokio-rs/tokio/pull/6036

[#&#8203;6037]: https://github.com/tokio-rs/tokio/pull/6037

[#&#8203;6042]: https://github.com/tokio-rs/tokio/pull/6042

[#&#8203;6045]: https://github.com/tokio-rs/tokio/pull/6045

[#&#8203;6050]: https://github.com/tokio-rs/tokio/pull/6050

[#&#8203;6056]: https://github.com/tokio-rs/tokio/pull/6056

[#&#8203;6058]: https://github.com/tokio-rs/tokio/pull/6058

###
[`v1.32.1`](https://github.com/tokio-rs/tokio/releases/tag/tokio-1.32.1):
Tokio v1.32.1

[Compare
Source](https://github.com/tokio-rs/tokio/compare/tokio-1.32.0...tokio-1.32.1)

### 1.32.1 (December 19, 2023)

This is a forward part of a change that was backported to 1.25.3.

##### Fixed

- io: add budgeting to `tokio::runtime::io::registration::async_io`
([#&#8203;6221])

[#&#8203;6221]: https://github.com/tokio-rs/tokio/pull/6221

###
[`v1.32.0`](https://github.com/tokio-rs/tokio/releases/tag/tokio-1.32.0):
Tokio v1.32.0

[Compare
Source](https://github.com/tokio-rs/tokio/compare/tokio-1.31.0...tokio-1.32.0)

##### Fixed

- sync: fix potential quadratic behavior in `broadcast::Receiver`
([#&#8203;5925])

##### Added

-   process: stabilize `Command::raw_arg` ([#&#8203;5930])
-   io: enable awaiting error readiness ([#&#8203;5781])

##### Unstable

- rt(alt): improve the scalability of alt runtime as the number of cores
grows ([#&#8203;5935])

[#&#8203;5925]: https://github.com/tokio-rs/tokio/pull/5925

[#&#8203;5930]: https://github.com/tokio-rs/tokio/pull/5930

[#&#8203;5781]: https://github.com/tokio-rs/tokio/pull/5781

[#&#8203;5935]: https://github.com/tokio-rs/tokio/pull/5935

###
[`v1.31.0`](https://github.com/tokio-rs/tokio/releases/tag/tokio-1.31.0):
Tokio v1.31.0

[Compare
Source](https://github.com/tokio-rs/tokio/compare/tokio-1.30.0...tokio-1.31.0)

##### Fixed

-   io: delegate `WriteHalf::poll_write_vectored` ([#&#8203;5914])

##### Unstable

- rt(unstable): fix memory leak in unstable next-gen scheduler prototype
([#&#8203;5911])
-   rt: expose mean task poll time metric ([#&#8203;5927])

[#&#8203;5914]: https://github.com/tokio-rs/tokio/pull/5914

[#&#8203;5911]: https://github.com/tokio-rs/tokio/pull/5911

[#&#8203;5927]: https://github.com/tokio-rs/tokio/pull/5927

###
[`v1.30.0`](https://github.com/tokio-rs/tokio/releases/tag/tokio-1.30.0):
Tokio v1.30.0

[Compare
Source](https://github.com/tokio-rs/tokio/compare/tokio-1.29.1...tokio-1.30.0)

### 1.30.0 (August 9, 2023)

This release bumps the MSRV of Tokio to 1.63. ([#&#8203;5887])

##### Changed

-   tokio: reduce LLVM code generation ([#&#8203;5859])
- io: support `--cfg mio_unsupported_force_poll_poll` flag
([#&#8203;5881])
-   sync: make `const_new` methods always available ([#&#8203;5885])
-   sync: avoid false sharing in mpsc channel ([#&#8203;5829])
-   rt: pop at least one task from inject queue ([#&#8203;5908])

##### Added

-   sync: add `broadcast::Sender::new` ([#&#8203;5824])
-   net: implement `UCred` for espidf ([#&#8203;5868])
-   fs: add `File::options()` ([#&#8203;5869])
-   time: implement extra reset variants for `Interval` ([#&#8203;5878])
-   process: add `{ChildStd*}::into_owned_{fd, handle}` ([#&#8203;5899])

##### Removed

-   tokio: removed unused `tokio_*` cfgs ([#&#8203;5890])
-   remove build script to speed up compilation ([#&#8203;5887])

##### Documented

-   sync: mention lagging in docs for `broadcast::send` ([#&#8203;5820])
-   runtime: expand on sharing runtime docs ([#&#8203;5858])
- io: use vec in example for `AsyncReadExt::read_exact` ([#&#8203;5863])
-   time: mark `Sleep` as `!Unpin` in docs ([#&#8203;5916])
-   process: fix `raw_arg` not showing up in docs ([#&#8203;5865])

##### Unstable

-   rt: add runtime ID ([#&#8203;5864])
-   rt: initial implementation of new threaded runtime ([#&#8203;5823])

[#&#8203;5820]: https://github.com/tokio-rs/tokio/pull/5820

[#&#8203;5823]: https://github.com/tokio-rs/tokio/pull/5823

[#&#8203;5824]: https://github.com/tokio-rs/tokio/pull/5824

[#&#8203;5829]: https://github.com/tokio-rs/tokio/pull/5829

[#&#8203;5858]: https://github.com/tokio-rs/tokio/pull/5858

[#&#8203;5859]: https://github.com/tokio-rs/tokio/pull/5859

[#&#8203;5863]: https://github.com/tokio-rs/tokio/pull/5863

[#&#8203;5864]: https://github.com/tokio-rs/tokio/pull/5864

[#&#8203;5865]: https://github.com/tokio-rs/tokio/pull/5865

[#&#8203;5868]: https://github.com/tokio-rs/tokio/pull/5868

[#&#8203;5869]: https://github.com/tokio-rs/tokio/pull/5869

[#&#8203;5878]: https://github.com/tokio-rs/tokio/pull/5878

[#&#8203;5881]: https://github.com/tokio-rs/tokio/pull/5881

[#&#8203;5885]: https://github.com/tokio-rs/tokio/pull/5885

[#&#8203;5887]: https://github.com/tokio-rs/tokio/pull/5887

[#&#8203;5890]: https://github.com/tokio-rs/tokio/pull/5890

[#&#8203;5899]: https://github.com/tokio-rs/tokio/pull/5899

[#&#8203;5908]: https://github.com/tokio-rs/tokio/pull/5908

[#&#8203;5916]: https://github.com/tokio-rs/tokio/pull/5916

###
[`v1.29.1`](https://github.com/tokio-rs/tokio/releases/tag/tokio-1.29.1):
Tokio v1.29.1

[Compare
Source](https://github.com/tokio-rs/tokio/compare/tokio-1.29.0...tokio-1.29.1)

##### Fixed

- rt: fix nesting two `block_in_place` with a `block_on` between
([#&#8203;5837])

[#&#8203;5837]: https://github.com/tokio-rs/tokio/pull/5837

###
[`v1.29.0`](https://github.com/tokio-rs/tokio/releases/tag/tokio-1.29.0):
Tokio v1.29.0

[Compare
Source](https://github.com/tokio-rs/tokio/compare/tokio-1.28.2...tokio-1.29.0)

Technically a breaking change, the `Send` implementation is removed from
`runtime::EnterGuard`. This change fixes a bug and should not impact
most users.

##### Breaking

-   rt: `EnterGuard` should not be `Send` ([#&#8203;5766])

##### Fixed

-   fs: reduce blocking ops in `fs::read_dir` ([#&#8203;5653])
-   rt: fix possible starvation ([#&#8203;5686], [#&#8203;5712])
-   rt: fix stacked borrows issue in `JoinSet` ([#&#8203;5693])
-   rt: panic if `EnterGuard` dropped incorrect order ([#&#8203;5772])
-   time: do not overflow to signal value ([#&#8203;5710])
-   fs: wait for in-flight ops before cloning `File` ([#&#8203;5803])

##### Changed

- rt: reduce time to poll tasks scheduled from outside the runtime
([#&#8203;5705], [#&#8203;5720])

##### Added

-   net: add uds doc alias for unix sockets ([#&#8203;5659])
-   rt: add metric for number of tasks ([#&#8203;5628])
-   sync: implement more traits for channel errors ([#&#8203;5666])
-   net: add nodelay methods on TcpSocket ([#&#8203;5672])
-   sync: add `broadcast::Receiver::blocking_recv` ([#&#8203;5690])
-   process: add `raw_arg` method to `Command` ([#&#8203;5704])
-   io: support PRIORITY epoll events ([#&#8203;5566])
-   task: add `JoinSet::poll_join_next` ([#&#8203;5721])
-   net: add support for Redox OS ([#&#8203;5790])

##### Unstable

- rt: add the ability to dump task backtraces ([#&#8203;5608],
[#&#8203;5676], [#&#8203;5708], [#&#8203;5717])
-   rt: instrument task poll times with a histogram ([#&#8203;5685])

[#&#8203;5766]: https://github.com/tokio-rs/tokio/pull/5766

[#&#8203;5653]: https://github.com/tokio-rs/tokio/pull/5653

[#&#8203;5686]: https://github.com/tokio-rs/tokio/pull/5686

[#&#8203;5712]: https://github.com/tokio-rs/tokio/pull/5712

[#&#8203;5693]: https://github.com/tokio-rs/tokio/pull/5693

[#&#8203;5772]: https://github.com/tokio-rs/tokio/pull/5772

[#&#8203;5710]: https://github.com/tokio-rs/tokio/pull/5710

[#&#8203;5803]: https://github.com/tokio-rs/tokio/pull/5803

[#&#8203;5705]: https://github.com/tokio-rs/tokio/pull/5705

[#&#8203;5720]: https://github.com/tokio-rs/tokio/pull/5720

[#&#8203;5659]: https://github.com/tokio-rs/tokio/pull/5659

[#&#8203;5628]: https://github.com/tokio-rs/tokio/pull/5628

[#&#8203;5666]: https://github.com/tokio-rs/tokio/pull/5666

[#&#8203;5672]: https://github.com/tokio-rs/tokio/pull/5672

[#&#8203;5690]: https://github.com/tokio-rs/tokio/pull/5690

[#&#8203;5704]: https://github.com/tokio-rs/tokio/pull/5704

[#&#8203;5566]: https://github.com/tokio-rs/tokio/pull/5566

[#&#8203;5721]: https://github.com/tokio-rs/tokio/pull/5721

[#&#8203;5790]: https://github.com/tokio-rs/tokio/pull/5790

[#&#8203;5608]: https://github.com/tokio-rs/tokio/pull/5608

[#&#8203;5676]: https://github.com/tokio-rs/tokio/pull/5676

[#&#8203;5708]: https://github.com/tokio-rs/tokio/pull/5708

[#&#8203;5717]: https://github.com/tokio-rs/tokio/pull/5717

[#&#8203;5685]: https://github.com/tokio-rs/tokio/pull/5685

###
[`v1.28.2`](https://github.com/tokio-rs/tokio/releases/tag/tokio-1.28.2):
Tokio v1.28.2

[Compare
Source](https://github.com/tokio-rs/tokio/compare/tokio-1.28.1...tokio-1.28.2)

### 1.28.2 (May 28, 2023)

Forward ports 1.18.6 changes.

##### Fixed

-   deps: disable default features for mio ([#&#8203;5728])

[#&#8203;5728]: https://github.com/tokio-rs/tokio/pull/5728

###
[`v1.28.1`](https://github.com/tokio-rs/tokio/releases/tag/tokio-1.28.1):
Tokio v1.28.1

[Compare
Source](https://github.com/tokio-rs/tokio/compare/tokio-1.28.0...tokio-1.28.1)

### 1.28.1 (May 10th, 2023)

This release fixes a mistake in the build script that makes `AsFd`
implementations unavailable on Rust 1.63. ([#&#8203;5677])

[#&#8203;5677]: https://github.com/tokio-rs/tokio/pull/5677

###
[`v1.28.0`](https://github.com/tokio-rs/tokio/releases/tag/tokio-1.28.0):
Tokio v1.28.0

[Compare
Source](https://github.com/tokio-rs/tokio/compare/tokio-1.27.0...tokio-1.28.0)

### 1.28.0 (April 25th, 2023)

##### Added

-   io: add `AsyncFd::async_io` ([#&#8203;5542])
-   io: impl BufMut for ReadBuf ([#&#8203;5590])
- net: add `recv_buf` for `UdpSocket` and `UnixDatagram`
([#&#8203;5583])
-   sync: add `OwnedSemaphorePermit::semaphore` ([#&#8203;5618])
-   sync: add `same_channel` to broadcast channel ([#&#8203;5607])
-   sync: add `watch::Receiver::wait_for` ([#&#8203;5611])
- task: add `JoinSet::spawn_blocking` and `JoinSet::spawn_blocking_on`
([#&#8203;5612])

##### Changed

-   deps: update windows-sys to 0.48 ([#&#8203;5591])
-   io: make `read_to_end` not grow unnecessarily ([#&#8203;5610])
-   macros: make entrypoints more efficient ([#&#8203;5621])
-   sync: improve Debug impl for `RwLock` ([#&#8203;5647])
-   sync: reduce contention in `Notify` ([#&#8203;5503])

##### Fixed

-   net: support `get_peer_cred` on AIX ([#&#8203;5065])
- sync: avoid deadlocks in `broadcast` with custom wakers
([#&#8203;5578])

##### Documented

-   sync: fix typo in `Semaphore::MAX_PERMITS` ([#&#8203;5645])
-   sync: fix typo in `tokio::sync::watch::Sender` docs ([#&#8203;5587])

[#&#8203;5065]: https://github.com/tokio-rs/tokio/pull/5065

[#&#8203;5503]: https://github.com/tokio-rs/tokio/pull/5503

[#&#8203;5542]: https://github.com/tokio-rs/tokio/pull/5542

[#&#8203;5578]: https://github.com/tokio-rs/tokio/pull/5578

[#&#8203;5583]: https://github.com/tokio-rs/tokio/pull/5583

[#&#8203;5587]: https://github.com/tokio-rs/tokio/pull/5587

[#&#8203;5590]: https://github.com/tokio-rs/tokio/pull/5590

[#&#8203;5591]: https://github.com/tokio-rs/tokio/pull/5591

[#&#8203;5607]: https://github.com/tokio-rs/tokio/pull/5607

[#&#8203;5610]: https://github.com/tokio-rs/tokio/pull/5610

[#&#8203;5611]: https://github.com/tokio-rs/tokio/pull/5611

[#&#8203;5612]: https://github.com/tokio-rs/tokio/pull/5612

[#&#8203;5618]: https://github.com/tokio-rs/tokio/pull/5618

[#&#8203;5621]: https://github.com/tokio-rs/tokio/pull/5621

[#&#8203;5645]: https://github.com/tokio-rs/tokio/pull/5645

[#&#8203;5647]: https://github.com/tokio-rs/tokio/pull/5647

###
[`v1.27.0`](https://github.com/tokio-rs/tokio/releases/tag/tokio-1.27.0):
Tokio v1.27.0

[Compare
Source](https://github.com/tokio-rs/tokio/compare/tokio-1.26.0...tokio-1.27.0)

### 1.27.0 (March 27th, 2023)

This release bumps the MSRV of Tokio to 1.56. ([#&#8203;5559])

##### Added

-   io: add `async_io` helper method to sockets ([#&#8203;5512])
- io: add implementations of `AsFd`/`AsHandle`/`AsSocket`
([#&#8203;5514], [#&#8203;5540])
-   net: add `UdpSocket::peek_sender()` ([#&#8203;5520])
- sync: add `RwLockWriteGuard::{downgrade_map, try_downgrade_map}`
([#&#8203;5527])
-   task: add `JoinHandle::abort_handle` ([#&#8203;5543])

##### Changed

-   io: use `memchr` from `libc` ([#&#8203;5558])
- macros: accept path as crate rename in `#[tokio::main]`
([#&#8203;5557])
-   macros: update to syn 2.0.0 ([#&#8203;5572])
- time: don't register for a wakeup when `Interval` returns `Ready`
([#&#8203;5553])

##### Fixed

-   fs: fuse std iterator in `ReadDir` ([#&#8203;5555])
-   tracing: fix `spawn_blocking` location fields ([#&#8203;5573])
-   time: clean up redundant check in `Wheel::poll()` ([#&#8203;5574])

##### Documented

-   macros: define cancellation safety ([#&#8203;5525])
-   io: add details to docs of `tokio::io::copy[_buf]` ([#&#8203;5575])
- io: refer to `ReaderStream` and `StreamReader` in module docs
([#&#8203;5576])

[#&#8203;5512]: https://github.com/tokio-rs/tokio/pull/5512

[#&#8203;5514]: https://github.com/tokio-rs/tokio/pull/5514

[#&#8203;5520]: https://github.com/tokio-rs/tokio/pull/5520

[#&#8203;5525]: https://github.com/tokio-rs/tokio/pull/5525

[#&#8203;5527]: https://github.com/tokio-rs/tokio/pull/5527

[#&#8203;5540]: https://github.com/tokio-rs/tokio/pull/5540

[#&#8203;5543]: https://github.com/tokio-rs/tokio/pull/5543

[#&#8203;5553]: https://github.com/tokio-rs/tokio/pull/5553

[#&#8203;5555]: https://github.com/tokio-rs/tokio/pull/5555

[#&#8203;5557]: https://github.com/tokio-rs/tokio/pull/5557

[#&#8203;5558]: https://github.com/tokio-rs/tokio/pull/5558

[#&#8203;5559]: https://github.com/tokio-rs/tokio/pull/5559

[#&#8203;5572]: https://github.com/tokio-rs/tokio/pull/5572

[#&#8203;5573]: https://github.com/tokio-rs/tokio/pull/5573

[#&#8203;5574]: https://github.com/tokio-rs/tokio/pull/5574

[#&#8203;5575]: https://github.com/tokio-rs/tokio/pull/5575

[#&#8203;5576]: https://github.com/tokio-rs/tokio/pull/5576

###
[`v1.26.0`](https://github.com/tokio-rs/tokio/releases/tag/tokio-1.26.0):
Tokio v1.26.0

[Compare
Source](https://github.com/tokio-rs/tokio/compare/tokio-1.25.3...tokio-1.26.0)

##### Fixed

- macros: fix empty `join!` and `try_join!`
([[https://github.com/tokio-rs/tokio/pull/5504](https://github.com/tokio-rs/tokio/pull/5504)])
- sync: don't leak tracing spans in mutex guards
([[https://github.com/tokio-rs/tokio/pull/5469](https://github.com/tokio-rs/tokio/pull/5469)])
- sync: drop wakers after unlocking the mutex in Notify
([[https://github.com/tokio-rs/tokio/pull/5471](https://github.com/tokio-rs/tokio/pull/5471)])
- sync: drop wakers outside lock in semaphore
([[https://github.com/tokio-rs/tokio/pull/5475](https://github.com/tokio-rs/tokio/pull/5475)])

##### Added

- fs: add `fs::try_exists`
([[https://github.com/tokio-rs/tokio/pull/4299](https://github.com/tokio-rs/tokio/pull/4299)])
- net: add types for named unix pipes
([[https://github.com/tokio-rs/tokio/pull/5351](https://github.com/tokio-rs/tokio/pull/5351)])
- sync: add `MappedOwnedMutexGuard`
([[https://github.com/tokio-rs/tokio/pull/5474](https://github.com/tokio-rs/tokio/pull/5474)])

##### Changed

- chore: update windows-sys to 0.45
([[https://github.com/tokio-rs/tokio/pull/5386](https://github.com/tokio-rs/tokio/pull/5386)])
- net: use Message Read Mode for named pipes
([[https://github.com/tokio-rs/tokio/pull/5350](https://github.com/tokio-rs/tokio/pull/5350)])
- sync: mark lock guards with `#[clippy::has_significant_drop]`
([[https://github.com/tokio-rs/tokio/pull/5422](https://github.com/tokio-rs/tokio/pull/5422)])
- sync: reduce contention in watch channel
([[https://github.com/tokio-rs/tokio/pull/5464](https://github.com/tokio-rs/tokio/pull/5464)])
- time: remove cache padding in timer entries
([[https://github.com/tokio-rs/tokio/pull/5468](https://github.com/tokio-rs/tokio/pull/5468)])
- time: Improve `Instant::now()` perf with test-util
([[https://github.com/tokio-rs/tokio/pull/5513](https://github.com/tokio-rs/tokio/pull/5513)])

##### Internal Changes

- io: use `poll_fn` in `copy_bidirectional`
([[https://github.com/tokio-rs/tokio/pull/5486](https://github.com/tokio-rs/tokio/pull/5486)])
- net: refactor named pipe builders to not use bitfields
([[https://github.com/tokio-rs/tokio/pull/5477](https://github.com/tokio-rs/tokio/pull/5477)])
- rt: remove Arc from Clock
([[https://github.com/tokio-rs/tokio/pull/5434](https://github.com/tokio-rs/tokio/pull/5434)])
- sync: make `notify_waiters` calls atomic
([[https://github.com/tokio-rs/tokio/pull/5458](https://github.com/tokio-rs/tokio/pull/5458)])
- time: don't store deadline twice in sleep entries
([[https://github.com/tokio-rs/tokio/pull/5410](https://github.com/tokio-rs/tokio/pull/5410)])

##### Unstable

- metrics: add a new metric for budget exhaustion yields
([[https://github.com/tokio-rs/tokio/pull/5517](https://github.com/tokio-rs/tokio/pull/5517)])

##### Documented

- io: improve AsyncFd example
([[https://github.com/tokio-rs/tokio/pull/5481](https://github.com/tokio-rs/tokio/pull/5481)])
- runtime: document the nature of the main future
([[https://github.com/tokio-rs/tokio/pull/5494](https://github.com/tokio-rs/tokio/pull/5494)])
- runtime: remove extra period in docs
([[https://github.com/tokio-rs/tokio/pull/5511](https://github.com/tokio-rs/tokio/pull/5511)])
- signal: updated Documentation for Signals
([[https://github.com/tokio-rs/tokio/pull/5459](https://github.com/tokio-rs/tokio/pull/5459)])
- sync: add doc aliases for `blocking_*` methods
([[https://github.com/tokio-rs/tokio/pull/5448](https://github.com/tokio-rs/tokio/pull/5448)])
- sync: fix docs for Send/Sync bounds in broadcast
([[https://github.com/tokio-rs/tokio/pull/5480](https://github.com/tokio-rs/tokio/pull/5480)])
- sync: document drop behavior for channels
([[https://github.com/tokio-rs/tokio/pull/5497](https://github.com/tokio-rs/tokio/pull/5497)])
- task: clarify what happens to spawned work during runtime shutdown
([[https://github.com/tokio-rs/tokio/pull/5394](https://github.com/tokio-rs/tokio/pull/5394)])
- task: clarify `process::Command` docs
([[https://github.com/tokio-rs/tokio/pull/5413](https://github.com/tokio-rs/tokio/pull/5413)])
- task: fix wording with 'unsend'
([[https://github.com/tokio-rs/tokio/pull/5452](https://github.com/tokio-rs/tokio/pull/5452)])
- time: document immediate completion guarantee for timeouts
([[https://github.com/tokio-rs/tokio/pull/5509](https://github.com/tokio-rs/tokio/pull/5509)])
- tokio: document supported platforms
([[https://github.com/tokio-rs/tokio/pull/5483](https://github.com/tokio-rs/tokio/pull/5483)])

[https://github.com/tokio-rs/tokio/pull/4299]:
https://github.com/tokio-rs/tokio/pull/4299

[https://github.com/tokio-rs/tokio/pull/5350]:
https://github.com/tokio-rs/tokio/pull/5350

[https://github.com/tokio-rs/tokio/pull/5351]:
https://github.com/tokio-rs/tokio/pull/5351

[https://github.com/tokio-rs/tokio/pull/5386]:
https://github.com/tokio-rs/tokio/pull/5386

[https://github.com/tokio-rs/tokio/pull/5394]:
https://github.com/tokio-rs/tokio/pull/5394

[https://github.com/tokio-rs/tokio/pull/5410]:
https://github.com/tokio-rs/tokio/pull/5410

[https://github.com/tokio-rs/tokio/pull/5413]:
https://github.com/tokio-rs/tokio/pull/5413

[https://github.com/tokio-rs/tokio/pull/5422]:
https://github.com/tokio-rs/tokio/pull/5422

[https://github.com/tokio-rs/tokio/pull/5434]:
https://github.com/tokio-rs/tokio/pull/5434

[https://github.com/tokio-rs/tokio/pull/5448]:
https://github.com/tokio-rs/tokio/pull/5448

[https://github.com/tokio-rs/tokio/pull/5452]:
https://github.com/tokio-rs/tokio/pull/5452

[https://github.com/tokio-rs/tokio/pull/5458]:
https://github.com/tokio-rs/tokio/pull/5458

[https://github.com/tokio-rs/tokio/pull/5459]:
https://github.com/tokio-rs/tokio/pull/5459

[https://github.com/tokio-rs/tokio/pull/5464]:
https://github.com/tokio-rs/tokio/pull/5464

[https://github.com/tokio-rs/tokio/pull/5468]:
https://github.com/tokio-rs/tokio/pull/5468

[https://github.com/tokio-rs/tokio/pull/5469]:
https://github.com/tokio-rs/tokio/pull/5469

[https://github.com/tokio-rs/tokio/pull/5471]:
https://github.com/tokio-rs/tokio/pull/5471

[https://github.com/tokio-rs/tokio/pull/5474]:
https://github.com/tokio-rs/tokio/pull/5474

[https://github.com/tokio-rs/tokio/pull/5475]:
https://github.com/tokio-rs/tokio/pull/5475

[https://github.com/tokio-rs/tokio/pull/5477]:
https://github.com/tokio-rs/tokio/pull/5477

[https://github.com/tokio-rs/tokio/pull/5480]:
https://github.com/tokio-rs/tokio/pull/5480

[https://github.com/tokio-rs/tokio/pull/5481]:
https://github.com/tokio-rs/tokio/pull/5481

[https://github.com/tokio-rs/tokio/pull/5483]:
https://github.com/tokio-rs/tokio/pull/5483

[https://github.com/tokio-rs/tokio/pull/5486]:
https://github.com/tokio-rs/tokio/pull/5486

[https://github.com/tokio-rs/tokio/pull/5494]:
https://github.com/tokio-rs/tokio/pull/5494

[https://github.com/tokio-rs/tokio/pull/5497]:
https://github.com/tokio-rs/tokio/pull/5497

[https://github.com/tokio-rs/tokio/pull/5504]:
https://github.com/tokio-rs/tokio/pull/5504

[https://github.com/tokio-rs/tokio/pull/5509]:
https://github.com/tokio-rs/tokio/pull/5509

[https://github.com/tokio-rs/tokio/pull/5511]:
https://github.com/tokio-rs/tokio/pull/5511

[https://github.com/tokio-rs/tokio/pull/5513]:
https://github.com/tokio-rs/tokio/pull/5513

[https://github.com/tokio-rs/tokio/pull/5517]:
https://github.com/tokio-rs/tokio/pull/5517

###
[`v1.25.3`](https://github.com/tokio-rs/tokio/releases/tag/tokio-1.25.3):
Tokio v1.25.3

[Compare
Source](https://github.com/tokio-rs/tokio/compare/tokio-1.25.2...tokio-1.25.3)

### 1.25.3 (December 17th, 2023)

##### Fixed

- io: add budgeting to `tokio::runtime::io::registration::async_io`
([#&#8203;6221])

[#&#8203;6221]: https://github.com/tokio-rs/tokio/pull/6221

###
[`v1.25.2`](https://github.com/tokio-rs/tokio/releases/tag/tokio-1.25.2):
Tokio v1.25.2

[Compare
Source](https://github.com/tokio-rs/tokio/compare/tokio-1.25.1...tokio-1.25.2)

### 1.25.2 (September 22, 2023)

Forward ports 1.20.6 changes.

##### Changed

-   io: use `memchr` from `libc` ([#&#8203;5960])

[#&#8203;5960]: https://github.com/tokio-rs/tokio/pull/5960

###
[`v1.25.1`](https://github.com/tokio-rs/tokio/releases/tag/tokio-1.25.1):
Tokio v1.25.1

[Compare
Source](https://github.com/tokio-rs/tokio/compare/tokio-1.25.0...tokio-1.25.1)

### 1.25.1 (May 28, 2023)

Forward ports 1.18.6 changes.

##### Fixed

-   deps: disable default features for mio ([#&#8203;5728])

[#&#8203;5728]: https://github.com/tokio-rs/tokio/pull/5728

###
[`v1.25.0`](https://github.com/tokio-rs/tokio/releases/tag/tokio-1.25.0):
Tokio v1.25.0

### 1.25.0 (January 28, 2023)

##### Fixed

-   rt: fix runtime metrics reporting ([#&#8203;5330])

##### Added

-   sync: add `broadcast::Sender::len` ([#&#8203;5343])

##### Changed

-   fs: increase maximum read buffer size to 2MiB ([#&#8203;5397])

[#&#8203;5330]: https://github.com/tokio-rs/tokio/pull/5330

[#&#8203;5343]: https://github.com/tokio-rs/tokio/pull/5343

[#&#8203;5397]: https://github.com/tokio-rs/tokio/pull/5397

###
[`v1.24.1`](https://github.com/tokio-rs/tokio/releases/tag/tokio-1.24.1):
Tokio v1.24.1

[Compare
Source](https://github.com/tokio-rs/tokio/compare/tokio-1.24.0...tokio-1.24.1)

This release fixes a compilation failure on targets without `AtomicU64`
when using rustc older than 1.63. ([#&#8203;5356])

[#&#8203;5356]: https://github.com/tokio-rs/tokio/pull/5356

###
[`v1.24.0`](https://github.com/tokio-rs/tokio/releases/tag/tokio-1.24.0):
Tokio v1.24.0

[Compare
Source](https://github.com/tokio-rs/tokio/compare/tokio-1.23.1...tokio-1.24.0)

The highlight of this release is the reduction of lock contention for
all I/O operations
([#&#8203;5300](https://github.com/tokio-rs/tokio/issues/5300)). We
have received reports of up to a 20% improvement in CPU utilization and
increased throughput for real-world I/O heavy applications.

##### Fixed

-   rt: improve native `AtomicU64` support detection ([#&#8203;5284])

##### Added

- rt: add configuration option for max number of I/O events polled from
the OS
    per tick ([#&#8203;5186])
- rt: add an environment variable for configuring the default number of
worker
    threads per runtime instance ([#&#8203;4250])

##### Changed

-   sync: reduce MPSC channel stack usage ([#&#8203;5294])
-   io: reduce lock contention in I/O operations  ([#&#8203;5300])
-   fs: speed up `read_dir()` by chunking operations ([#&#8203;5309])
-   rt: use internal `ThreadId` implementation ([#&#8203;5329])
- test: don't auto-advance time when a `spawn_blocking` task is running
([#&#8203;5115])

[#&#8203;5186]: https://github.com/tokio-rs/tokio/pull/5186

[#&#8203;5294]: https://github.com/tokio-rs/tokio/pull/5294

[#&#8203;5284]: https://github.com/tokio-rs/tokio/pull/5284

[#&#8203;4250]: https://github.com/tokio-rs/tokio/pull/4250

[#&#8203;5300]: https://github.com/tokio-rs/tokio/pull/5300

[#&#8203;5329]: https://github.com/tokio-rs/tokio/pull/5329

[#&#8203;5115]: https://github.com/tokio-rs/tokio/pull/5115

[#&#8203;5309]: https://github.com/tokio-rs/tokio/pull/5309

###
[`v1.23.1`](https://github.com/tokio-rs/tokio/releases/tag/tokio-1.23.1):
Tokio v1.23.1

[Compare
Source](https://github.com/tokio-rs/tokio/compare/tokio-1.23.0...tokio-1.23.1)

This release forward ports changes from 1.18.4.

##### Fixed

- net: fix Windows named pipe server builder to maintain option when
toggling
    pipe mode ([#&#8203;5336]).

[#&#8203;5336]: https://github.com/tokio-rs/tokio/pull/5336

###
[`v1.23.0`](https://github.com/tokio-rs/tokio/releases/tag/tokio-1.23.0):
Tokio v1.23.0

[Compare
Source](https://github.com/tokio-rs/tokio/compare/tokio-1.22.0...tokio-1.23.0)

##### Fixed

-   net: fix Windows named pipe connect ([#&#8203;5208])
-   io: support vectored writes for `ChildStdin` ([#&#8203;5216])
- io: fix `async fn ready()` false positive for OS-specific events
([#&#8203;5231])

##### Changed

- runtime: `yield_now` defers task until after driver poll
([#&#8203;5223])
- runtime: reduce amount of codegen needed per spawned task
([#&#8203;5213])
- windows: replace `winapi` dependency with `windows-sys`
([#&#8203;5204])

[#&#8203;5208]: https://github.com/tokio-rs/tokio/pull/5208

[#&#8203;5216]: https://github.com/tokio-rs/tokio/pull/5216

[#&#8203;5213]: https://github.com/tokio-rs/tokio/pull/5213

[#&#8203;5204]: https://github.com/tokio-rs/tokio/pull/5204

[#&#8203;5223]: https://github.com/tokio-rs/tokio/pull/5223

[#&#8203;5231]: https://github.com/tokio-rs/tokio/pull/5231

###
[`v1.22.0`](https://github.com/tokio-rs/tokio/releases/tag/tokio-1.22.0):
Tokio v1.22.0

[Compare
Source](https://github.com/tokio-rs/tokio/compare/tokio-1.21.2...tokio-1.22.0)

##### Added

-   runtime: add `Handle::runtime_flavor` ([#&#8203;5138])
-   sync: add `Mutex::blocking_lock_owned` ([#&#8203;5130])
-   sync: add `Semaphore::MAX_PERMITS` ([#&#8203;5144])
-   sync: add `merge()` to semaphore permits ([#&#8203;4948])
-   sync: add `mpsc::WeakUnboundedSender` ([#&#8203;5189])

##### Added (unstable)

-   process: add `Command::process_group` ([#&#8203;5114])
- runtime: export metrics about the blocking thread pool
([#&#8203;5161])
-   task: add `task::id()` and `task::try_id()` ([#&#8203;5171])

##### Fixed

-   macros: don't take ownership of futures in macros ([#&#8203;5087])
- runtime: fix Stacked Borrows violation in `LocalOwnedTasks`
([#&#8203;5099])
- runtime: mitigate ABA with 32-bit queue indices when possible
([#&#8203;5042])
- task: wake local tasks to the local queue when woken by the same
thread ([#&#8203;5095])
- time: panic in release mode when `mark_pending` called illegally
([#&#8203;5093])
-   runtime: fix typo in expect message ([#&#8203;5169])
-   runtime: fix `unsync_load` on atomic types ([#&#8203;5175])
- task: elaborate safety comments in task deallocation ([#&#8203;5172])
-   runtime: fix `LocalSet` drop in thread local ([#&#8203;5179])
-   net: remove libc type leakage in a public API ([#&#8203;5191])
-   runtime: update the alignment of `CachePadded` ([#&#8203;5106])

##### Changed

- io: make `tokio::io::copy` continue filling the buffer when writer
stalls ([#&#8203;5066])
- runtime: remove `coop::budget` from `LocalSet::run_until`
([#&#8203;5155])
-   sync: make `Notify` panic safe ([#&#8203;5154])

##### Documented

-   io: fix doc for `write_i8` to use signed integers ([#&#8203;5040])
- net: fix doc typos for TCP and UDP `set_tos` methods ([#&#8203;5073])
- net: fix function name in `UdpSocket::recv` documentation
([#&#8203;5150])
- sync: typo in `TryLockError` for `RwLock::try_write` ([#&#8203;5160])
- task: document that spawned tasks execute immediately ([#&#8203;5117])
-   time: document return type of `timeout` ([#&#8203;5118])
- time: document that `timeout` checks only before poll ([#&#8203;5126])
- sync: specify return type of `oneshot::Receiver` in docs
([#&#8203;5198])

##### Internal changes

-   runtime: use const `Mutex::new` for globals ([#&#8203;5061])
- runtime: remove `Option` around `mio::Events` in io driver
([#&#8203;5078])
-   runtime: remove a conditional compilation clause ([#&#8203;5104])
-   runtime: remove a reference to internal time handle ([#&#8203;5107])
-   runtime: misc time driver cleanup ([#&#8203;5120])
-   runtime: move signal driver to runtime module ([#&#8203;5121])
-   runtime: signal driver now uses I/O driver directly ([#&#8203;5125])
-   runtime: start decoupling I/O driver and I/O handle ([#&#8203;5127])
- runtime: switch `io::handle` refs with scheduler:Handle
([#&#8203;5128])
-   runtime: remove Arc from I/O driver ([#&#8203;5134])
- runtime: use signal driver handle via `scheduler::Handle`
([#&#8203;5135])
-   runtime: move internal clock fns out of context ([#&#8203;5139])
-   runtime: remove `runtime::context` module ([#&#8203;5140])
-   runtime: keep driver cfgs in `driver.rs` ([#&#8203;5141])
- runtime: add `runtime::context` to unify thread-locals
([#&#8203;5143])
- runtime: rename some confusing internal variables/fns ([#&#8203;5151])
-   runtime: move `coop` mod into `runtime` ([#&#8203;5152])
-   runtime: move budget state to context thread-local ([#&#8203;5157])
-   runtime: move park logic into runtime module ([#&#8203;5158])
-   runtime: move `Runtime` into its own file ([#&#8203;5159])
- runtime: unify entering a runtime with `Handle::enter`
([#&#8203;5163])
- runtime: remove handle reference from each scheduler ([#&#8203;5166])
-   runtime: move `enter` into `context` ([#&#8203;5167])
-   runtime: combine context and entered thread-locals ([#&#8203;5168])
-   runtime: fix accidental unsetting of current handle ([#&#8203;5178])
-   runtime: move `CoreStage` methods to `Core` ([#&#8203;5182])
-   sync: name mpsc semaphore types ([#&#8203;5146])

[#&#8203;4948]: https://github.com/tokio-rs/tokio/pull/4948

[#&#8203;5040]: https://github.com/tokio-rs/tokio/pull/5040

[#&#8203;5042]: https://github.com/tokio-rs/tokio/pull/5042

[#&#8203;5061]: https://github.com/tokio-rs/tokio/pull/5061

[#&#8203;5066]: https://github.com/tokio-rs/tokio/pull/5066

[#&#8203;5073]: https://github.com/tokio-rs/tokio/pull/5073

[#&#8203;5078]: https://github.com/tokio-rs/tokio/pull/5078

[#&#8203;5087]: https://github.com/tokio-rs/tokio/pull/5087

[#&#8203;5093]: https://github.com/tokio-rs/tokio/pull/5093

[#&#8203;5095]: https://github.com/tokio-rs/tokio/pull/5095

[#&#8203;5099]: https://github.com/tokio-rs/tokio/pull/5099

[#&#8203;5104]: https://github.com/tokio-rs/tokio/pull/5104

[#&#8203;5106]: https://github.com/tokio-rs/tokio/pull/5106

[#&#8203;5107]: https://github.com/tokio-rs/tokio/pull/5107

[#&#8203;5114]: https://github.com/tokio-rs/tokio/pull/5114

[#&#8203;5117]: https://github.com/tokio-rs/tokio/pull/5117

[#&#8203;5118]: https://github.com/tokio-rs/tokio/pull/5118

[#&#8203;5120]: https://github.com/tokio-rs/tokio/pull/5120

[#&#8203;5121]: https://github.com/tokio-rs/tokio/pull/5121

[#&#8203;5125]: https://github.com/tokio-rs/tokio/pull/5125

[#&#8203;5126]: https://github.com/tokio-rs/tokio/pull/5126

[#&#8203;5127]: https://github.com/tokio-rs/tokio/pull/5127

[#&#8203;5128]: https://github.com/tokio-rs/tokio/pull/5128

[#&#8203;5130]: https://github.com/tokio-rs/tokio/pull/5130

[#&#8203;5134]: https://github.com/tokio-rs/tokio/pull/5134

[#&#8203;5135]: https://github.com/tokio-rs/tokio/pull/5135

[#&#8203;5138]: https://github.com/tokio-rs/tokio/pull/5138

[#&#8203;5138]: https://github.com/tokio-rs/tokio/pull/5138

[#&#8203;5139]: https://github.com/tokio-rs/tokio/pull/5139

[#&#8203;5140]: https://github.com/tokio-rs/tokio/pull/5140

[#&#8203;5141]: https://github.com/tokio-rs/tokio/pull/5141

[#&#8203;5143]: https://github.com/tokio-rs/tokio/pull/5143

[#&#8203;5144]: https://github.com/tokio-rs/tokio/pull/5144

[#&#8203;5144]: https://github.com/tokio-rs/tokio/pull/5144

[#&#8203;5146]: https://github.com/tokio-rs/tokio/pull/5146

[#&#8203;5150]: https://github.com/tokio-rs/tokio/pull/5150

[#&#8203;5151]: https://github.com/tokio-rs/tokio/pull/5151

[#&#8203;5152]: https://github.com/tokio-rs/tokio/pull/5152

[#&#8203;5154]: https://github.com/tokio-rs/tokio/pull/5154

[#&#8203;5155]: https://github.com/tokio-rs/tokio/pull/5155

[#&#8203;5157]: https://github.com/tokio-rs/tokio/pull/5157

[#&#8203;5158]: https://github.com/tokio-rs/tokio/pull/5158

[#&#8203;5159]: https://github.com/tokio-rs/tokio/pull/5159

[#&#8203;5160]: https://github.com/tokio-rs/tokio/pull/5160

[#&#8203;5161]: https://github.com/tokio-rs/tokio/pull/5161

[#&#8203;5163]: https://github.com/tokio-rs/tokio/pull/5163

[#&#8203;5166]: https://github.com/tokio-rs/tokio/pull/5166

[#&#8203;5167]: https://github.com/tokio-rs/tokio/pull/5167

[#&#8203;5168]: https://github.com/tokio-rs/tokio/pull/5168

[#&#8203;5169]: https://github.com/tokio-rs/tokio/pull/5169

[#&#8203;5171]: https://github.com/tokio-rs/tokio/pull/5171

[#&#8203;5172]: https://github.com/tokio-rs/tokio/pull/5172

[#&#8203;5175]: https://github.com/tokio-rs/tokio/pull/5175

[#&#8203;5178]: https://github.com/tokio-rs/tokio/pull/5178

[#&#8203;5179]: https://github.com/tokio-rs/tokio/pull/5179

[#&#8203;5182]: https://github.com/tokio-rs/tokio/pull/5182

[#&#8203;5189]: https://github.com/tokio-rs/tokio/pull/5189

[#&#8203;5191]: https://github.com/tokio-rs/tokio/pull/5191

[#&#8203;5198]: https://github.com/tokio-rs/tokio/pull/5198

###
[`v1.21.2`](https://github.com/tokio-rs/tokio/releases/tag/tokio-1.21.2):
Tokio v1.21.2

[Compare
Source](https://github.com/tokio-rs/tokio/compare/tokio-1.21.1...tokio-1.21.2)

### 1.21.2 (September 27, 2022)

This release removes the dependency on the `once_cell` crate to restore
the MSRV of 1.21.x, which is the latest minor version at the time of
release. ([#&#8203;5048])

[#&#8203;5048]: https://github.com/tokio-rs/tokio/pull/5048

###
[`v1.21.1`](https://github.com/tokio-rs/tokio/releases/tag/tokio-1.21.1):
Tokio v1.21.1

[Compare
Source](https://github.com/tokio-rs/tokio/compare/tokio-1.21.0...tokio-1.21.1)

### 1.21.1 (September 13, 2022)

##### Fixed

-   net: fix dependency resolution for socket2 ([#&#8203;5000])
-   task: ignore failure to set TLS in `LocalSet` Drop ([#&#8203;4976])

[#&#8203;4976]: https://github.com/tokio-rs/tokio/pull/4976

[#&#8203;5000]: https://github.com/tokio-rs/tokio/pull/5000

###
[`v1.21.0`](https://github.com/tokio-rs/tokio/releases/tag/tokio-1.21.0):
Tokio v1.21.0

[Compare
Source](https://github.com/tokio-rs/tokio/compare/tokio-1.20.6...tokio-1.21.0)

### 1.21.0 (September 2, 2022)

This release is the first release of Tokio to intentionally support
WASM. The `sync,macros,io-util,rt,time` features are stabilized on WASM.
Additionally the wasm32-wasi target is given unstable support for the
`net` feature.

##### Added

- net: add `device` and `bind_device` methods to TCP/UDP sockets
([#&#8203;4882])
- net: add `tos` and `set_tos` methods to TCP and UDP sockets
([#&#8203;4877])
- net: add security flags to named pipe `ServerOptions` ([#&#8203;4845])
-   signal: add more windows signal handlers ([#&#8203;4924])
-   sync: add `mpsc::Sender::max_capacity` method ([#&#8203;4904])
-   sync: implement Weak version of `mpsc::Sender` ([#&#8203;4595])
-   task: add `LocalSet::enter` ([#&#8203;4765])
-   task: stabilize `JoinSet` and `AbortHandle` ([#&#8203;4920])
- tokio: add `track_caller` to public APIs ([#&#8203;4805],
[#&#8203;4848], [#&#8203;4852])
-   wasm: initial support for `wasm32-wasi` target ([#&#8203;4716])

##### Fixed

- miri: improve miri compatibility by avoiding temporary references in
`linked_list::Link` impls ([#&#8203;4841])
- signal: don't register write interest on signal pipe ([#&#8203;4898])
-   sync: add `#[must_use]` to lock guards ([#&#8203;4886])
- sync: fix hang when calling `recv` on closed and reopened broadcast
channel ([#&#8203;4867])
-   task: propagate attributes on task-locals ([#&#8203;4837])

##### Changed

-   fs: change panic to error in `File::start_seek` ([#&#8203;4897])
-   io: reduce syscalls in `poll_read` ([#&#8203;4840])
- process: use blocking threadpool for child stdio I/O ([#&#8203;4824])
-   signal: make `SignalKind` methods const ([#&#8203;4956])

##### Internal changes

-   rt: extract `basic_scheduler::Config` ([#&#8203;4935])
-   rt: move I/O driver into `runtime` module ([#&#8203;4942])
-   rt: rename internal scheduler types ([#&#8203;4945])

##### Documented

- chore: fix typos and grammar ([#&#8203;4858], [#&#8203;4894],
[#&#8203;4928])
-   io: fix typo in `AsyncSeekExt::rewind` docs ([#&#8203;4893])
- net: add documentation to `try_read()` for zero-length buffers
([#&#8203;4937])
- runtime: remove incorrect panic section for `Builder::worker_threads`
([#&#8203;4849])
-   sync: doc of `watch::Sender::send` improved ([#&#8203;4959])
-   task: add cancel safety docs to `JoinHandle` ([#&#8203;4901])
-   task: expand on cancellation of `spawn_blocking` ([#&#8203;4811])
- time: clarify that the first tick of `Interval::tick` happens
immediately ([#&#8203;4951])

##### Unstable

-   rt: add unstable option to disable the LIFO slot ([#&#8203;4936])
- task: fix incorrect signature in `Builder::spawn_on` ([#&#8203;4953])
-   task: make `task::Builder::spawn*` methods fallible ([#&#8203;4823])

[#&#8203;4595]: https://github.com/tokio-rs/tokio/pull/4595

[#&#8203;4716]: https://github.com/tokio-rs/tokio/pull/4716

[#&#8203;4765]: https://github.com/tokio-rs/tokio/pull/4765

[#&#8203;4805]: https://github.com/tokio-rs/tokio/pull/4805

[#&#8203;4811]: https://github.com/tokio-rs/tokio/pull/4811

[#&#8203;4823]: https://github.com/tokio-rs/tokio/pull/4823

[#&#8203;4824]: https://github.com/tokio-rs/tokio/pull/4824

[#&#8203;4837]: https://github.com/tokio-rs/tokio/pull/4837

[#&#8203;4840]: https://github.com/tokio-rs/tokio/pull/4840

[#&#8203;4841]: https://github.com/tokio-rs/tokio/pull/4841

[#&#8203;4845]: https://github.com/tokio-rs/tokio/pull/4845

[#&#8203;4848]: https://github.com/tokio-rs/tokio/pull/4848

[#&#8203;4849]: https://github.com/tokio-rs/tokio/pull/4849

[#&#8203;4852]: https://github.com/tokio-rs/tokio/pull/4852

[#&#8203;4858]: https://github.com/tokio-rs/tokio/pull/4858

[#&#8203;4867]: https://github.com/tokio-rs/tokio/pull/4867

[#&#8203;4877]: https://github.com/tokio-rs/tokio/pull/4877

[#&#8203;4882]: https://github.com/tokio-rs/tokio/pull/4882

[#&#8203;4886]: https://github.com/tokio-rs/tokio/pull/4886

[#&#8203;4893]: https://github.com/tokio-rs/tokio/pull/4893

[#&#8203;4894]: https://github.com/tokio-rs/tokio/pull/4894

[#&#8203;4897]: https://github.com/tokio-rs/tokio/pull/4897

[#&#8203;4898]: https://github.com/tokio-rs/tokio/pull/4898

[#&#8203;4901]: https://github.com/tokio-rs/tokio/pull/4901

[#&#8203;4904]: https://github.com/tokio-rs/tokio/pull/4904

[#&#8203;4920]: https://github.com/tokio-rs/tokio/pull/4920

[#&#8203;4924]: https://github.com/tokio-rs/tokio/pull/4924

[#&#8203;4928]: https://github.com/tokio-rs/tokio/pull/4928

[#&#8203;4935]: https://github.com/tokio-rs/tokio/pull/4935

[#&#8203;4936]: https://github.com/tokio-rs/tokio/pull/4936

[#&#8203;4937]: https://github.com/tokio-rs/tokio/pull/4937

[#&#8203;4942]: https://github.com/tokio-rs/tokio/pull/4942

[#&#8203;4945]: https://github.com/tokio-rs/tokio/pull/4945

[#&#8203;4951]: https://github.com/tokio-rs/tokio/pull/4951

[#&#8203;4953]: https://github.com/tokio-rs/tokio/pull/4953

[#&#8203;4956]: https://github.com/tokio-rs/tokio/pull/4956

[#&#8203;4959]: https://github.com/tokio-rs/tokio/pull/4959

###
[`v1.20.6`](https://github.com/tokio-rs/tokio/releases/tag/tokio-1.20.6):
Tokio v1.20.6

[Compare
Source](https://github.com/tokio-rs/tokio/compare/tokio-1.20.5...tokio-1.20.6)

### 1.20.6 (September 22, 2023)

This is a backport of a change from 1.27.0.

##### Changed

-   io: use `memchr` from `libc` ([#&#8203;5960])

[#&#8203;5960]: https://github.com/tokio-rs/tokio/pull/5960

###
[`v1.20.5`](https://github.com/tokio-rs/tokio/releases/tag/tokio-1.20.5):
Tokio v1.20.5

[Compare
Source](https://github.com/tokio-rs/tokio/compare/tokio-1.20.4...tokio-1.20.5)

### 1.20.5 (May 28, 2023)

Forward ports 1.18.6 changes.

##### Fixed

-   deps: disable default features for mio ([#&#8203;5728])

[#&#8203;5728]: https://github.com/tokio-rs/tokio/pull/5728

###
[`v1.20.4`](https://github.com/tokio-rs/tokio/compare/tokio-1.20.3...tokio-1.20.4)

[Compare
Source](https://github.com/tokio-rs/tokio/compare/tokio-1.20.3...tokio-1.20.4)

###
[`v1.20.3`](https://github.com/tokio-rs/tokio/compare/tokio-1.20.2...tokio-1.20.3)

[Compare
Source](https://github.com/tokio-rs/tokio/compare/tokio-1.20.2...tokio-1.20.3)

###
[`v1.20.2`](https://github.com/tokio-rs/tokio/releases/tag/tokio-1.20.2):
Tokio v1.20.2

[Compare
Source](https://github.com/tokio-rs/tokio/compare/tokio-1.20.1...tokio-1.20.2)

### 1.20.2 (September 27, 2022)

This release removes the dependency on the `once_cell` crate to restore
the MSRV of the 1.20.x LTS release. ([#&#8203;5048])

[#&#8203;5048]: https://github.com/tokio-rs/tokio/pull/5048

###
[`v1.20.1`](https://github.com/tokio-rs/tokio/releases/tag/tokio-1.20.1):
Tokio v1.20.1

[Compare
Source](https://github.com/tokio-rs/tokio/compare/tokio-1.20.0...tokio-1.20.1)

### 1.20.1 (July 25, 2022)

##### Fixed

-   chore: fix version detection in build script ([#&#8203;4860])

[#&#8203;4860]: https://github.com/tokio-rs/tokio/pull/4860

###
[`v1.20.0`](https://github.com/tokio-rs/tokio/releases/tag/tokio-1.20.0):
Tokio v1.20.0

[Compare
Source](https://github.com/tokio-rs/tokio/compare/tokio-1.19.2...tokio-1.20.0)

### 1.20.0 (July 12, 2022)

##### Added

- tokio: add track_caller to public APIs ([#&#8203;4772],
[#&#8203;4791], [#&#8203;4793], [#&#8203;4806], [#&#8203;4808])
-   sync: Add `has_changed` method to `watch::Ref` ([#&#8203;4758])

##### Changed

-   time: remove `src/time/driver/wheel/stack.rs` ([#&#8203;4766])
-   rt: clean up arguments passed to basic scheduler ([#&#8203;4767])
-   net: be more specific about winapi features ([#&#8203;4764])
- tokio: use const initialized thread locals where possible
([#&#8203;4677])
-   task: various small improvements to LocalKey ([#&#8203;4795])

##### Fixed

##### Documented

-   fs: warn about performance pitfall ([#&#8203;4762])
-   chore: fix spelling ([#&#8203;4769])
-   sync: document spurious failures in oneshot ([#&#8203;4777])
-   sync: add warning for watch in non-Send futures ([#&#8203;4741])
-   chore: fix typo ([#&#8203;4798])

##### Unstable

-   joinset: rename `join_one` to `join_next` ([#&#8203;4755])
-   rt: unhandled panic conf

</details>

---

### Configuration

📅 **Schedule**: Branch creation - "after 9pm,before 6am" in timezone
Europe/Zurich, Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about these
updates again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR has been generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View
repository job log
[here](https://developer.mend.io/github/smartive/zitadel-rust).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy4zMzEuMCIsInVwZGF0ZWRJblZlciI6IjM3LjMzMS4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJkZXBlbmRlbmNpZXMiXX0=-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
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-net Module: tokio/net
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants