mirror of https://github.com/smol-rs/polling
parent
1c16a1e4af
commit
9e46c8455c
|
@ -81,15 +81,16 @@ jobs:
|
|||
fail-fast: false
|
||||
matrix:
|
||||
os: [ubuntu-latest, macos-latest]
|
||||
rust: [nightly, stable]
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Install Rust
|
||||
run: rustup update stable
|
||||
run: rustup update ${{ matrix.rust }}
|
||||
- name: Install cross
|
||||
uses: taiki-e/install-action@cross
|
||||
- name: Add rust-src
|
||||
if: startsWith(matrix.rust, 'nightly')
|
||||
run: rustup component add rust-src
|
||||
run: rustup +nightly component add rust-src
|
||||
# We don't test BSDs, since we already test them in Cirrus.
|
||||
- name: Android
|
||||
if: startsWith(matrix.os, 'ubuntu')
|
||||
|
@ -121,11 +122,13 @@ jobs:
|
|||
cargo check --target x86_64-unknown-redox
|
||||
- name: HermitOS
|
||||
if: startsWith(matrix.rust, 'nightly') && matrix.os == 'ubuntu-latest'
|
||||
run: |
|
||||
cargo -Zbuild-std check --target x86_64-unknown-hermit
|
||||
run: cargo +nightly check -Z build-std --target x86_64-unknown-hermit
|
||||
- name: Check haiku
|
||||
if: startsWith(matrix.rust, 'nightly') && matrix.os == 'ubuntu-latest'
|
||||
run: cargo check -Z build-std --target x86_64-unknown-haiku
|
||||
run: cargo +nightly check -Z build-std --target x86_64-unknown-haiku
|
||||
- name: Check vita
|
||||
if: startsWith(matrix.rust, 'nightly') && matrix.os == 'ubuntu-latest'
|
||||
run: cargo +nightly check -Z build-std --target armv7-sony-vita-newlibeabihf
|
||||
|
||||
wine:
|
||||
runs-on: ubuntu-22.04
|
||||
|
|
|
@ -55,4 +55,6 @@ socket2 = "0.5.5"
|
|||
|
||||
[target.'cfg(unix)'.dev-dependencies]
|
||||
libc = "0.2"
|
||||
|
||||
[target.'cfg(all(unix, not(target_os="vita")))'.dev-dependencies]
|
||||
signal-hook = "0.3.17"
|
||||
|
|
|
@ -402,7 +402,7 @@ impl Event {
|
|||
|
||||
/// Tells if this event is the result of a connection failure.
|
||||
///
|
||||
/// This function checks if an error exist,particularlly useful in detecting if TCP connection failed. It corresponds to the `EPOLLERR` event in Linux
|
||||
/// This function checks if an error exist, particularly useful in detecting if TCP connection failed. It corresponds to the `EPOLLERR` event in Linux
|
||||
/// and `CONNECT_FAILED` event in Windows IOCP.
|
||||
///
|
||||
/// ## Caveats
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
//! Functionality that is only availale for IOCP-based platforms.
|
||||
//! Functionality that is only available for IOCP-based platforms.
|
||||
|
||||
pub use crate::sys::CompletionPacket;
|
||||
|
||||
|
|
24
src/poll.rs
24
src/poll.rs
|
@ -685,7 +685,7 @@ mod notify {
|
|||
self.read_pipe.as_fd()
|
||||
}
|
||||
|
||||
/// Provides the poll flags to be used when registering the read half of the botify pipe with the `Poller`.
|
||||
/// Provides the poll flags to be used when registering the read half of the notify pipe with the `Poller`.
|
||||
pub(super) fn poll_flags(&self) -> PollFlags {
|
||||
PollFlags::RDNORM
|
||||
}
|
||||
|
@ -699,7 +699,25 @@ mod notify {
|
|||
|
||||
/// Pops a notification (if any) from the pipe.
|
||||
pub(super) fn pop_notification(&self) -> Result<(), io::Error> {
|
||||
read(&self.read_pipe, &mut [0; 1])?;
|
||||
// Pipes on Vita do not guarantee that after `write` call succeeds, the
|
||||
// data becomes immediately available for reading on the other side of the pipe.
|
||||
// To ensure that the notification is not lost, the read side of the pipe is temporarily
|
||||
// switched to blocking for a single `read` call.
|
||||
#[cfg(target_os = "vita")]
|
||||
rustix::fs::fcntl_setfl(
|
||||
&self.read_pipe,
|
||||
rustix::fs::fcntl_getfl(&self.read_pipe)? & !rustix::fs::OFlags::NONBLOCK,
|
||||
)?;
|
||||
|
||||
let result = read(&self.read_pipe, &mut [0; 1]);
|
||||
|
||||
#[cfg(target_os = "vita")]
|
||||
rustix::fs::fcntl_setfl(
|
||||
&self.read_pipe,
|
||||
rustix::fs::fcntl_getfl(&self.read_pipe)? | rustix::fs::OFlags::NONBLOCK,
|
||||
)?;
|
||||
|
||||
result?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
@ -729,7 +747,7 @@ mod notify {
|
|||
|
||||
/// A notification pipe.
|
||||
///
|
||||
/// This implementation uses ther `eventfd` syscall to send notifications.
|
||||
/// This implementation uses the `eventfd` syscall to send notifications.
|
||||
#[derive(Debug)]
|
||||
pub(super) struct Notify {
|
||||
/// The file descriptor of the eventfd object. This is also stored as the first
|
||||
|
|
|
@ -76,7 +76,7 @@ fn concurrent_modify() -> io::Result<()> {
|
|||
Ok(())
|
||||
}
|
||||
|
||||
#[cfg(unix)]
|
||||
#[cfg(all(unix, not(target_os = "vita")))]
|
||||
#[test]
|
||||
fn concurrent_interruption() -> io::Result<()> {
|
||||
struct MakeItSend<T>(T);
|
||||
|
|
Loading…
Reference in New Issue