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

add Interest::PRIORITY and ready and ready_mut functions to AsyncFd #5566

Merged
merged 25 commits into from
Jun 6, 2023

Conversation

folkertdev
Copy link
Contributor

@folkertdev folkertdev commented Mar 21, 2023

Motivation

Closes #4885

It was impossible in tokio to await POLLPRI events. These exceptional conditions are raised under certain circumstances on unix systems (e.g. when a new device is mounted, or when a UDP socket receives messages in its error queue).

In version 8.6.0, mio adds Interest::PRIORITY, (for the linux and android operating systems).

Solution

  • bumps Tokio's mio dependency to version 8.6.0
  • exposes (publicly) Interest::PRIORITY
  • adds priority and priority_mut functions to AsyncFd

Next steps

  • I decided not to expose this functionality for other socket-like types for now. If you're working with priority events, you're doing something pretty low-level and likely are using AsyncFd already.
  • I'm not sure how/if this should be tested in tokio itself (or if mio is trusted)
  • I'm not sure what the policy is on bumping dependencies (and specifically mio). Everything looks fine, but I may be missing something.

@folkertdev
Copy link
Contributor Author

folkertdev commented Mar 21, 2023

I'm seeing a weird CI error here, that seems unrelated to the changes that are made. My other PR for which CI ran recently has the same problem

So I'm assuming this is because I rebased on current master?

CI Output
     Running tests/time_delay_queue.rs (target/wasm32-wasi/debug/deps/time_delay_queue-f0c21ef322a44873.wasm)

running 30 tests
test compact_change_deadline ... ok
test compact_expire_empty ... ok
test compact_remove_empty ... ok
test compact_remove_remapped_keys ... ok
test delay_queue_poll_expired_when_empty ... ok
test expire_first_key_when_reset_to_expire_earlier ... ok
test expire_second_key_when_reset_to_expire_earlier ... ok
test expires_before_last_insert ... ok
test insert_after_ready_poll ... ok
test insert_before_first_after_poll ... ok
test insert_in_past_after_poll_fires_immediately ... ok
test insert_in_past_fires_immediately ... ok
test multi_delay_at_start ... ok
test multi_immediate_delays ... ok
test multi_reset ... ok
test remove_after_compact ... ignored, FIXME: Does not seem to work with WASI
test remove_after_compact_poll ... ignored, FIXME: Does not seem to work with WASI
test remove_at_timer_wheel_threshold ... ok
test remove_entry ... ok
test remove_expired_item ... ok
Error: failed to run main module `/home/runner/work/tokio/tokio/target/wasm32-wasi/debug/deps/time_delay_queue-f0c21ef322a44873.wasm`

Caused by:
    0: failed to invoke command default
    1: error while executing at wasm backtrace:
           0: 0x14360f - <unknown>!__rust_start_panic
           1: 0x142f1d - <unknown>!rust_panic
           2: 0x142ee4 - <unknown>!std::panicking::rust_panic_with_hook::hd6f3df478dab5dc5
           3: 0x1419aa - <unknown>!std::panicking::begin_panic_handler::{{closure}}::h7be61ca999d17a10
           4: 0x1418d4 - <unknown>!std::sys_common::backtrace::__rust_end_short_backtrace::h1c7217a99e6903e8
           5: 0x142552 - <unknown>!rust_begin_unwind
           6: 0x149a0d - <unknown>!core::panicking::panic_fmt::h86214d64a55c1d57
           7: 0x15016d - <unknown>!core::panicking::panic_display::h58fb45e5567db9b3
           8: 0x14fd1d - <unknown>!core::panicking::panic_str::hef6f4fea2c6da56a
           9: 0x14fceb - <unknown>!core::option::expect_failed::he9c7eebda4091106
          10: 0x140db4 - <unknown>!<std::time::Instant as core::ops::arith::Sub<core::time::Duration>>::sub::h9d1ea7149970c4f4
          11: 0xb656b - <unknown>!<tokio::time::instant::Instant as core::ops::arith::Sub<core::time::Duration>>::sub::h8709be5f2824f4d8
          12: 0x1423c - <unknown>!time_delay_queue::repeatedly_reset_entry_inserted_as_expired::{{closure}}::h5113477f19ab55d3
          13: 0x3e836 - <unknown>!<core::pin::Pin<P> as core::future::future::Future>::poll::h4fa8cd4e55f21ac9
          14: 0x3e8ce - <unknown>!<core::pin::Pin<P> as core::future::future::Future>::poll::h642aec97e6dd8367
          15: 0x3c5c7 - <unknown>!tokio::runtime::scheduler::current_thread::CoreGuard::block_on::{{closure}}::{{closure}}::{{closure}}::h1e04fe847e0eed21
          16: 0x3b926 - <unknown>!tokio::runtime::scheduler::current_thread::CoreGuard::block_on::{{closure}}::{{closure}}::hda5894a20edb5dea
          17: 0x3b74d - <unknown>!tokio::runtime::scheduler::current_thread::Context::enter::h0551c0eeeb75cb0b
          18: 0x3bfd4 - <unknown>!tokio::runtime::scheduler::current_thread::CoreGuard::block_on::{{closure}}::h04e2d857a61424cc
          19: 0x3ad99 - <unknown>!tokio::runtime::scheduler::current_thread::CoreGuard::enter::{{closure}}::hefeb9ef4b490f0b0
          20: 0x3aceb - <unknown>!tokio::macros::scoped_tls::ScopedKey<T>::set::h768b6b08d5c1ff74
          21: 0x3bd7c - <unknown>!tokio::runtime::scheduler::current_thread::CoreGuard::enter::h3549fc9053a672ee
          22: 0x3b4a4 - <unknown>!tokio::runtime::scheduler::current_thread::CoreGuard::block_on::h29331f6bd3fa002f
          23: 0x3b0df - <unknown>!tokio::runtime::scheduler::current_thread::CurrentThread::block_on::h252f5d42c4325f40
          24: 0x3aeb2 - <unknown>!tokio::runtime::runtime::Runtime::block_on::hd567519e6c4ccdf2
          25: 0x14000 - <unknown>!time_delay_queue::repeatedly_reset_entry_inserted_as_expired::h2e8d9e0d39e801f8
          26: 0x13e64 - <unknown>!time_delay_queue::repeatedly_reset_entry_inserted_as_expired::{{closure}}::hba3d5e0e60e4e59f
          27: 0x40eae - <unknown>!core::ops::function::FnOnce::call_once::h21770440c4a77129
          28: 0x78844 - <unknown>!test::__rust_begin_short_backtrace::h2f7251cabac8cc17
          29: 0x78824 - <unknown>!core::ops::function::FnOnce::call_once{{vtable.shim}}::h98ae03618d6ef851
          30: 0xa0133 - <unknown>!test::run_test::run_test_inner::hcac225d7d620b63b
          31: 0x8b209 - <unknown>!test::run_test::h2db965a4129a3fb3
          32: 0x871c7 - <unknown>!test::console::run_tests_console::h58c4d5717b25d8bf
          33: 0x9f467 - <unknown>!test::test_main::hc2411b2d7bc2431a
          34: 0x9f6b3 - <unknown>!test::test_main_static::hd744aa7211882b13
          35: 0x2c72f - <unknown>!time_delay_queue::main::h41b7fb16cef306a9
          36: 0x4107d - <unknown>!core::ops::function::FnOnce::call_once::h3c9e1736a43e028c
          37: 0x6f4ba - <unknown>!std::sys_common::backtrace::__rust_begin_short_backtrace::h47e6361a0d37dfca
          38: 0x3a287 - <unknown>!std::rt::lang_start::{{closure}}::h20bb17588a43137f
          39: 0x13a6bf - <unknown>!std::rt::lang_start_internal::h83cbd77d07ad3a3a
          40: 0x3a224 - <unknown>!std::rt::lang_start::h6ec71f408c08c5b2
          41: 0x2c753 - <unknown>!__main_void
          42: 0x1bfa - <unknown>!_start
       note: using the `WASMTIME_BACKTRACE_DETAILS=1` environment variable may show more debugging information
    2: wasm trap: wasm `unreachable` instruction executed

Stack backtrace:
   0: anyhow::error::<impl core::convert::From<E> for anyhow::Error>::from
   1: wasmtime::trap::from_runtime_box
   2: wasmtime::func::Func::call_impl
   3: wasmtime::linker::Linker<T>::module::{{closure}}::{{closure}}
   4: wasmtime::func::Func::invoke
   5: wasmtime::func::Caller<T>::with
   6: wasmtime::trampoline::func::stub_fn
   7: <unknown>
   8: <unknown>
   9: wasmtime_setjmp
  10: wasmtime_runtime::traphandlers::<impl wasmtime_runtime::traphandlers::call_thread_state::CallThreadState>::with
  11: wasmtime_runtime::traphandlers::catch_traps
  12: wasmtime::func::Func::call_impl
  13: wasmtime_cli::commands::run::RunCommand::invoke_func
  14: wasmtime_cli::commands::run::RunCommand::load_main_module
  15: wasmtime_cli::commands::run::RunCommand::execute
  16: wasmtime::main
  17: std::sys_common::backtrace::__rust_begin_short_backtrace
  18: std::rt::lang_start::{{closure}}
  19: core::ops::function::impls::<impl core::ops::function::FnOnce<A> for &F>::call_once
             at /rustc/001a77fac33f6560ff361ff38f661ff5f1c6bf85/library/core/src/ops/function.rs:287:13
  20: std::panicking::try::do_call
             at /rustc/001a77fac33f6560ff361ff38f661ff5f1c6bf85/library/std/src/panicking.rs:483:40
  21: std::panicking::try
             at /rustc/001a77fac33f6560ff361ff38f661ff5f1c6bf85/library/std/src/panicking.rs:447:19
  22: std::panic::catch_unwind
             at /rustc/001a77fac33f6560ff361ff38f661ff5f1c6bf85/library/std/src/panic.rs:140:14
  23: std::rt::lang_start_internal::{{closure}}
             at /rustc/001a77fac33f6560ff361ff38f661ff5f1c6bf85/library/std/src/rt.rs:148:48
  24: std::panicking::try::do_call
             at /rustc/001a77fac33f6560ff361ff38f661ff5f1c6bf85/library/std/src/panicking.rs:483:40
  25: std::panicking::try
             at /rustc/001a77fac33f6560ff361ff38f661ff5f1c6bf85/library/std/src/panicking.rs:447:19
  26: std::panic::catch_unwind
             at /rustc/001a77fac33f6560ff361ff38f661ff5f1c6bf85/library/std/src/panic.rs:140:14
  27: std::rt::lang_start_internal
             at /rustc/001a77fac33f6560ff361ff38f661ff5f1c6bf85/library/std/src/rt.rs:148:20
  28: main
  29: <unknown>
  30: __libc_start_main
  31: <unknown>
error: test failed, to rerun pass `-p tokio-util --test time_delay_queue`

@Darksonn
Copy link
Contributor

I have no idea what's up with the CI issue is, but it isn't your fault.

@Darksonn Darksonn added A-tokio Area: The main tokio crate M-io Module: tokio/io labels Mar 21, 2023
@Darksonn
Copy link
Contributor

Would it be possible to add a test for this?

Copy link
Member

@satakuma satakuma 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 not sure how/if this should be tested in tokio itself

Perhaps you can take a look how mio tests POLLPRI and add a similar test using types from Tokio.

tokio/src/io/async_fd.rs Outdated Show resolved Hide resolved
tokio/src/io/interest.rs Show resolved Hide resolved
@Darksonn
Copy link
Contributor

As a general note, I'm happy that you're taking a stab at this. It has been a long-standing issue.

@folkertdev
Copy link
Contributor Author

I'm happy to, this was a fun journey into the depths of tokio and mio (something I'd wanted to do for a while).

I think I added PRIORITY in all the relevant places now. I added a test case for AsyncFd and for TcpStream, because for those I actually know how to trigger EPOLLPRI. Information on this is kind of scarce. I was under the impression that we could also listen for EPOLLPRI for a UDP socket to receive timestamping information, but I did not get that to work yet.

@folkertdev folkertdev force-pushed the priority-interest branch 2 times, most recently from eec6959 to a2a6f7e Compare March 21, 2023 23:09
tokio/src/io/interest.rs Outdated Show resolved Hide resolved
Copy link
Member

@satakuma satakuma 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, but I would like a +1 from @Darksonn as well.

Copy link

@poeschel poeschel left a comment

Choose a reason for hiding this comment

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

I have done something similar to your work here, but mine is not as "production ready" as your work. It is very well done. Thank you.
You can have a look at my code here: https://github.com/poeschel/tokio/tree/interest_prio
One thing I did differently is, I added direct priority support to the tokio TcpStream. This is maybe worth pulling in here. Priority support for the TcpStream also was in mio version 0.8.6.

And the other thing I did differently is I added a new waker for priority. (which then implies to also add the Direction::Prioriry (which sounds weird)). I thought about this and I am also not shure if it is right. But I think it is. If you have some events in the ready queue and then a priority event arrives, you want this to be handled indepently of the read events, right? This is what "priority" is for, isn't it?

tokio/src/io/interest.rs Outdated Show resolved Hide resolved
tokio/src/io/poll_evented.rs Outdated Show resolved Hide resolved
tokio/src/io/async_fd.rs Outdated Show resolved Hide resolved
tokio/src/io/async_fd.rs Outdated Show resolved Hide resolved
@poeschel
Copy link

poeschel commented Apr 4, 2023

I think I added PRIORITY in all the relevant places now. I added a test case for AsyncFd and for TcpStream, because for those I actually know how to trigger EPOLLPRI. Information on this is kind of scarce. I was under the impression that we could also listen for EPOLLPRI for a UDP socket to receive timestamping information, but I did not get that to work yet.

Regarding a test for AsyncFd with EPOLLPRI events:
Linux gpio sysfs is able to fire EPOLLPRI events, when a gpio is configured to fire interrupts. You do not need real hardware for this, because there is a gpio_mockup driver in Linux. But the whole thing is a bit hard to setup, because most distributions do not have this driver activated, so you have to recompile your kernel and to setup and use it, you have to be a priviledged user.
Is it worth adding a test with these requirements?

@Darksonn
Copy link
Contributor

Darksonn commented Apr 4, 2023

Is it worth adding a test with these requirements?

Eh, maybe not. We wouldn't be able to test that in CI. However, I would like to know whether anyone has tried running the code and seen it work at least once for a sanity check.

@poeschel
Copy link

poeschel commented Apr 4, 2023

Is it worth adding a test with these requirements?

Eh, maybe not. We wouldn't be able to test that in CI. However, I would like to know whether anyone has tried running the code and seen it work at least once for a sanity check.

I can test my use-case and the unit tests I wrote for my fork on this code tomorrow.

tokio/src/io/async_fd.rs Outdated Show resolved Hide resolved
tokio/src/io/async_fd.rs Outdated Show resolved Hide resolved
tokio/src/io/poll_evented.rs Outdated Show resolved Hide resolved
@@ -191,6 +227,11 @@ cfg_io_readiness! {
ready |= Ready::WRITE_CLOSED;
}

#[cfg(any(target_os = "linux", target_os = "android"))]
if interest.is_priority() {
ready |= Ready::PRIORITY;
Copy link
Contributor Author

Choose a reason for hiding this comment

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

note for the future: if we add the Ready::READ_CLOSED to mask above, we should also add it here

tokio/src/io/interest.rs Outdated Show resolved Hide resolved
@folkertdev
Copy link
Contributor Author

thanks for your input @poeschel!

re. pulling in more stuff: I'm open to it, but also think a separate later PR would be fine.

@poeschel
Copy link

poeschel commented Apr 5, 2023

Is it worth adding a test with these requirements?

Eh, maybe not. We wouldn't be able to test that in CI. However, I would like to know whether anyone has tried running the code and seen it work at least once for a sanity check.

I can test my use-case and the unit tests I wrote for my fork on this code tomorrow.

As promised, I tested today with my unit test and gpio sysfs in linux and my real world use-case with video4linux and both do work in principle. But I think we really should have a seperate worker for priority events:

  1. The tcp stream use-case: The linux tcp stack supports sending things over a tcp connection with MSG_OOB set. On the receiving side this is then received over the same tcp connection, but is priorized and with POLLPRI set. This is an urgent message, that will arrive ahead of the normal buffered tcp stream actual in transit. By reusing the read waker for priority events in tokio, the priority mechanism will not work anymore. You will receive the message, but later than possible if we had another independent waker.
  2. The video4linux use case: Linux does support POLLPRI events on certain video4linux devices. There are different events to receive, like frame sync, resolution changed or motion detected or something like that. That means POLLPRI is used like a second channel on the same video device. You receive your video pixel data by reading from the video device and you receive interesing events over POLLPRI. These should not be intermixed. This will not work very well with tokio when we reuse the read waker for priority events.

I think it is better to add a seperate priority waker, or am I missing something?

@poeschel
Copy link

poeschel commented Apr 5, 2023

re. pulling in more stuff: I'm open to it, but also think a separate later PR would be fine.

You are right! This is about AsyncFd here. The TcpStream can be another PR.

@Darksonn
Copy link
Contributor

Adding a separate waker for priority events makes sense to me.

@folkertdev
Copy link
Contributor Author

@poeschel I've been looking at this. One thing I don't see is how the current example would use this new priority direction/waker. You seem to be using it in a custom Stream implementation.

what are the consequences of adding the custom waker for the functionality in this PR so far? or is it really a primitive that is needed for e.g. TCP?

@carllerche
Copy link
Member

  1. The tcp stream use-case: The linux tcp stack supports sending things over a tcp connection with MSG_OOB set. On the receiving side this is then received over the same tcp connection, but is priorized and with POLLPRI set. This is an urgent message, that will arrive ahead of the normal buffered tcp stream actual in transit. By reusing the read waker for priority events in tokio, the priority mechanism will not work anymore. You will receive the message, but later than possible if we had another independent waker.

I'm not following this. Tokio has a Ready struct. If priority is exposed there, one could await readiness, check if priority is set, and process priority events first, if needed. I don't think you need a special waker.

It may be that AsyncFd is missing a method that returns the current readiness.

@folkertdev
Copy link
Contributor Author

here's what I understand:

Because we don't have async traits, traits that deal with async often have functions that return Poll<T>. @poeschel 's branch has an example using futures::stream::Stream, but I think tokio's AsyncRead and AsyncWrite are similar.

impl Stream for AsyncV4l2EventHandle {
    type Item = io::Result<i32>;

    fn poll_next(mut self: Pin<&mut Self>, cx: &mut Context) -> Poll<Option<Self::Item>> {
        loop {
            let blah = self.asyncfd.poll_priority_ready_mut(cx);
            let mut guard = ready!(blah)?;
            let res = guard.try_io(|inner| inner.get_mut().get_event());
            guard.clear_ready();
            match res {
                Err(TryIoError { .. }) => {
                    continue;
                },
                Ok(Ok(event)) => {
                    return Poll::Ready(Some(Ok(event)));
                },
                Ok(Err(err)) => {
                    return Poll::Ready(Some(Err(err.into())));
                }
            }
        }
    }
}

The poll_priority_ready_mut function is analogous to poll_read_ready. I believe the Stream implementation above runs into exactly the reason that these poll_ functions exist, from their docs:

This method is intended for cases where creating and pinning a future
via [readable] is not feasible. Where possible, using [readable] is
preferred, as this supports polling from multiple tasks at once.

There is nowhere to pin a future in that impl (right?)


So assuming that we want poll_priority_ready_mut, it needs to be implemented. This is how poll_read_ready_mut works

impl AsyncFd<T> {
    pub fn poll_read_ready_mut<'a>(
        &'a mut self,
        cx: &mut Context<'_>,
    ) -> Poll<io::Result<AsyncFdReadyMutGuard<'a, T>>> {
        let event = ready!(self.registration.poll_read_ready(cx))?;

        Ok(AsyncFdReadyMutGuard {
            async_fd: self,
            event: Some(event),
        })
        .into()
    }
}

...

impl Registration {
    // Uses the poll path, requiring the caller to ensure mutual exclusion for
    // correctness. Only the last task to call this function is notified.
    pub(crate) fn poll_read_ready(&self, cx: &mut Context<'_>) -> Poll<io::Result<ReadyEvent>> {
        self.poll_ready(cx, Direction::Read)
    }
}

so working by analogy, we need some Direction::Priority to pass to poll_ready. and that ultimately needs an extra waker for priority events.


The above makes sense to me, and the conclusion seems to be that for correct behavior, an extra waker for priority events is needed. But maybe I'm missing something here?

@github-actions github-actions bot added the R-loom Run loom tests on this PR label Apr 20, 2023
@carllerche
Copy link
Member

To avoid the waker issue, I would not expose priority via a "poll" method. The async fns do not need a waker per readiness type. You can always convert a future returned by an async fn to a nameable future by doing Box<dyn Future<...>>.

@carllerche
Copy link
Member

It seems to me the key issue here is AsyncFd does not have an async fn ready like TcpStream does (here). Let's start with a PR that adds that.

Then, we can add "priority" to Interest, and the way to listen for priority events is to call fd.ready(Interest::PRIORITY).await (or whatever).

@folkertdev
Copy link
Contributor Author

this PR already adds

pub async fn priority_ready<'a>(&'a self) -> io::Result<AsyncFdReadyGuard<'a, T>> {

which is follows the pattern of

pub async fn readable<'a>(&'a self) -> io::Result<AsyncFdReadyGuard<'a, T>> {

and then adds a PRIORITY variant to Interest. All of that works fine.


implementing ready looks like a nice addition, but I think you run into issues when an IO operation blocks. At that point you need to clear the readiness and with just a Ready value that is not possible.

The AsyncFdReadyGuard returned by readable and friends has only an Option<ReadyEvent>, and therefore cannot always give you a Ready value (given the current implementation)


I'm not sure how boxing helps in the example above. The problem is that there is no way to hold on to a future between calls to poll_next. The code below would compile

fn poll_next(mut self: Pin<&mut Self>, cx: &mut Context) -> Poll<Option<Self::Item>> {
    loop {
        let fut = self.asyncfd.priority_ready();
        let mut guard = ready!(fut)?;

        ...
    }
}

but the call to priority_ready re-creates the future every time. I'm assuming that has performance downsides, but maybe it's fine.


all in all, I'd suggest that we declare polling out-of-scope for this PR, and focus just on the two functions from the title, priority_ready and priority_ready_mut.

folkertdev added 15 commits May 29, 2023 14:05
priority is really a special kind of read; we want to know when no more data will come
it only uses the readable and writable interests. AsyncFd::with_interest can be used for e.g. the priority interest, or for exclusively read or write readiness.
ready really the old readiness function, which has now been made public and renamed to just `ready` for consistency with e.g. TcpStream
it is important to clear only the readiness corresponding to an operation that was actually observed to block, especially when using combined interests
@folkertdev folkertdev force-pushed the priority-interest branch from 3cec780 to 81cb2bb Compare May 29, 2023 19:29
@folkertdev
Copy link
Contributor Author

wasm/wasi CI fails with

error[E0433]: failed to resolve: use of undeclared crate or module `log`
  --> /home/runner/.cargo/registry/src/index.crates.io-6f17d[22](https://github.com/tokio-rs/tokio/actions/runs/5114795867/jobs/9195428801?pr=5566#step:10:23)bba15001f/mio-0.8.7/src/sys/wasi/mod.rs:82:13
   |
82 |             log::warn!(
   |             ^^^ use of undeclared crate or module `log`

which is weird. In the Cargo.toml I specify we now use version 0.8.6 of mio, but the Cargo.lock file does actually show 0.8.7. Maybe something with feature flags changed in that version of mio?

@Darksonn
Copy link
Contributor

Darksonn commented Jun 1, 2023

The mio issue has been fixed upstream. I reran ci and it should pass now.

@folkertdev folkertdev requested a review from carllerche June 1, 2023 10:35
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.

LGTM, thanks

Copy link
Contributor

@Darksonn Darksonn left a comment

Choose a reason for hiding this comment

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

One nit, otherwise LGTM.

tokio/Cargo.toml Outdated Show resolved Hide resolved
Co-authored-by: Alice Ryhl <[email protected]>
@carllerche carllerche merged commit 7b24b22 into tokio-rs:master Jun 6, 2023
@carllerche
Copy link
Member

Awesome, thanks for the work!

@folkertdev
Copy link
Contributor Author

thanks for all the review/help, I really like where this ended up!

@poeschel
Copy link

poeschel commented Jun 6, 2023

Also, thank you very much from my side for your work!

crapStone pushed a commit to Calciumdibromid/CaBr2 that referenced this pull request Jul 6, 2023
This PR contains the following updates:

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

---

### Release Notes

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

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

[Compare Source](tokio-rs/tokio@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]: tokio-rs/tokio#5837

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

[Compare Source](tokio-rs/tokio@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]: tokio-rs/tokio#5766

#&#8203;5653]: tokio-rs/tokio#5653

#&#8203;5686]: tokio-rs/tokio#5686

#&#8203;5712]: tokio-rs/tokio#5712

#&#8203;5693]: tokio-rs/tokio#5693

#&#8203;5772]: tokio-rs/tokio#5772

#&#8203;5710]: tokio-rs/tokio#5710

#&#8203;5803]: tokio-rs/tokio#5803

#&#8203;5705]: tokio-rs/tokio#5705

#&#8203;5720]: tokio-rs/tokio#5720

#&#8203;5659]: tokio-rs/tokio#5659

#&#8203;5628]: tokio-rs/tokio#5628

#&#8203;5666]: tokio-rs/tokio#5666

#&#8203;5672]: tokio-rs/tokio#5672

#&#8203;5690]: tokio-rs/tokio#5690

#&#8203;5704]: tokio-rs/tokio#5704

#&#8203;5566]: tokio-rs/tokio#5566

#&#8203;5721]: tokio-rs/tokio#5721

#&#8203;5790]: tokio-rs/tokio#5790

#&#8203;5608]: tokio-rs/tokio#5608

#&#8203;5676]: tokio-rs/tokio#5676

#&#8203;5708]: tokio-rs/tokio#5708

#&#8203;5717]: tokio-rs/tokio#5717

#&#8203;5685]: tokio-rs/tokio#5685

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **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 [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNi4wLjAiLCJ1cGRhdGVkSW5WZXIiOiIzNi4wLjAiLCJ0YXJnZXRCcmFuY2giOiJkZXZlbG9wIn0=-->

Co-authored-by: cabr2-bot <[email protected]>
Reviewed-on: https://codeberg.org/Calciumdibromid/CaBr2/pulls/1958
Reviewed-by: crapStone <[email protected]>
Co-authored-by: Calciumdibromid Bot <[email protected]>
Co-committed-by: Calciumdibromid Bot <[email protected]>
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-io Module: tokio/io R-loom Run loom tests on this PR
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Support waiting on POLLPRI events on Linux
6 participants