-
-
Notifications
You must be signed in to change notification settings - Fork 2.6k
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 async_io for AsyncFd #5542
add async_io for AsyncFd #5542
Conversation
there is one other idea I had. The implementation could instead be pub async fn async_io<R>(
&self,
interest: Interest,
mut f: impl FnMut(&T) -> io::Result<R>,
) -> io::Result<R> {
self.registration
.async_io(interest, || f(self.get_ref()))
.await
} which changes usage to let output = async_fd
.async_io(Interest::WRITABLE, |inner| inner.send(buf))
.await; this makes the type signature inconsistent with the one for other types (but the same is already true for the signature of I'm not sure how to weigh these concerns: should the api be consistent, or is it better to deviate slightly if it is nicer for a particular type? |
e648d1e
to
87c864f
Compare
after thinking about it for a while, I think that second API I suggested is the better approach. It just makes using the API for this type more convenient, and the signature changes in a predictable way ( |
This raises the question of whether we want an |
hmm, that would require two functions (so adding I'm inclined to revert to the old api. thoughts? |
87c864f
to
63bfac0
Compare
Sorry for the delay. All of the other methods are duplicated, so I think it's fine for this one to be too. |
63bfac0
to
58452b5
Compare
ok, added it. Two questions from my side
|
58452b5
to
0f27d2a
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You can fix the FreeBSD ci failure by merging in master.
0f27d2a
to
feffc67
Compare
feffc67
to
0475cf8
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Just one more comment, then I think this is ready to be merged.
/// The `async_io` method is a convenience utility that waits for the file | ||
/// descriptor to become ready, and then executes the provided IO operation. | ||
/// Since file descriptors may be marked ready spuriously, the closure will | ||
/// be called repeatedly until it returns something other than a | ||
/// [`WouldBlock`] error. This is done using the following loop: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The documentation of a function should start with a short, single line description of what it does.
You can use the same one as the one on async_io_mut
.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
done
0475cf8
to
7fd3974
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks. LGTM.
This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [tokio](https://tokio.rs) ([source](https://github.com/tokio-rs/tokio)) | dependencies | minor | `1.27.0` -> `1.28.0` | | [tokio](https://tokio.rs) ([source](https://github.com/tokio-rs/tokio)) | dev-dependencies | minor | `1.27.0` -> `1.28.0` | --- ### Release Notes <details> <summary>tokio-rs/tokio</summary> ### [`v1.28.0`](https://github.com/tokio-rs/tokio/releases/tag/tokio-1.28.0): Tokio v1.28.0 [Compare Source](tokio-rs/tokio@tokio-1.27.0...tokio-1.28.0) ##### 1.28.0 (April 25th, 2023) ##### Added - io: add `AsyncFd::async_io` ([#​5542]) - io: impl BufMut for ReadBuf ([#​5590]) - net: add `recv_buf` for `UdpSocket` and `UnixDatagram` ([#​5583]) - sync: add `OwnedSemaphorePermit::semaphore` ([#​5618]) - sync: add `same_channel` to broadcast channel ([#​5607]) - sync: add `watch::Receiver::wait_for` ([#​5611]) - task: add `JoinSet::spawn_blocking` and `JoinSet::spawn_blocking_on` ([#​5612]) ##### Changed - deps: update windows-sys to 0.48 ([#​5591]) - io: make `read_to_end` not grow unnecessarily ([#​5610]) - macros: make entrypoints more efficient ([#​5621]) - sync: improve Debug impl for `RwLock` ([#​5647]) - sync: reduce contention in `Notify` ([#​5503]) ##### Fixed - net: support `get_peer_cred` on AIX ([#​5065]) - sync: avoid deadlocks in `broadcast` with custom wakers ([#​5578]) ##### Documented - sync: fix typo in `Semaphore::MAX_PERMITS` ([#​5645]) - sync: fix typo in `tokio::sync::watch::Sender` docs ([#​5587]) [#​5065]: tokio-rs/tokio#5065 [#​5503]: tokio-rs/tokio#5503 [#​5542]: tokio-rs/tokio#5542 [#​5578]: tokio-rs/tokio#5578 [#​5583]: tokio-rs/tokio#5583 [#​5587]: tokio-rs/tokio#5587 [#​5590]: tokio-rs/tokio#5590 [#​5591]: tokio-rs/tokio#5591 [#​5607]: tokio-rs/tokio#5607 [#​5610]: tokio-rs/tokio#5610 [#​5611]: tokio-rs/tokio#5611 [#​5612]: tokio-rs/tokio#5612 [#​5618]: tokio-rs/tokio#5618 [#​5621]: tokio-rs/tokio#5621 [#​5645]: tokio-rs/tokio#5645 [#​5647]: tokio-rs/tokio#5647 </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:eyJjcmVhdGVkSW5WZXIiOiIzNS42My4xIiwidXBkYXRlZEluVmVyIjoiMzUuNjQuMCJ9--> Co-authored-by: cabr2-bot <[email protected]> Reviewed-on: https://codeberg.org/Calciumdibromid/CaBr2/pulls/1875 Reviewed-by: crapStone <[email protected]> Co-authored-by: Calciumdibromid Bot <[email protected]> Co-committed-by: Calciumdibromid Bot <[email protected]>
Motivation
In #5512,
async_io
was exposed on various socket types. However, for our work on ntpd-rs we would like this function to also be available onAsyncFd
. We do some low-level epoll configuration there (specifically, listening forlibc::EPOLLPRI
on a separate file descriptor), so all we have is a file descriptor.Solution
Expose the
registration
'sasync_io
. The implementation is a single line. I believe that the implementation ofRegistration::async_io
correctly clears the readiness flag, and that therefore use ofAsyncFdReadyGuard
is not needed here.