Skip to content

Commit 7cea902

Browse files
committed
std::net: update tcp deferaccept delay type to Duration.
1 parent efcbb94 commit 7cea902

File tree

3 files changed

+28
-15
lines changed

3 files changed

+28
-15
lines changed

library/std/src/os/net/linux_ext/tcp.rs

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
55
use crate::sealed::Sealed;
66
use crate::sys_common::AsInner;
7+
use crate::time::Duration;
78
use crate::{io, net};
89

910
/// Os-specific extensions for [`TcpStream`]
@@ -60,6 +61,8 @@ pub trait TcpStreamExt: Sealed {
6061
/// connections without data to process.
6162
/// Contrary to other platforms `SO_ACCEPTFILTER` feature equivalent, there is
6263
/// no necessity to set it after the `listen` call.
64+
/// Note that the delay is expressed as Duration from user's perspective
65+
/// the call rounds it to its nearest second.
6366
///
6467
/// See [`man 7 tcp`](https://man7.org/linux/man-pages/man7/tcp.7.html)
6568
///
@@ -69,14 +72,15 @@ pub trait TcpStreamExt: Sealed {
6972
/// #![feature(tcp_deferaccept)]
7073
/// use std::net::TcpStream;
7174
/// use std::os::linux::net::TcpStreamExt;
75+
/// use std::time::Duration;
7276
///
7377
/// let stream = TcpStream::connect("127.0.0.1:8080")
7478
/// .expect("Couldn't connect to the server...");
75-
/// stream.set_deferaccept(1).expect("set_deferaccept call failed");
79+
/// stream.set_deferaccept(Duration::from_secs(1u64)).expect("set_deferaccept call failed");
7680
/// ```
7781
#[unstable(feature = "tcp_deferaccept", issue = "119639")]
7882
#[cfg(target_os = "linux")]
79-
fn set_deferaccept(&self, accept: u32) -> io::Result<()>;
83+
fn set_deferaccept(&self, accept: Duration) -> io::Result<()>;
8084

8185
/// Gets the accept delay value (in seconds) of the `TCP_DEFER_ACCEPT` option.
8286
///
@@ -88,15 +92,16 @@ pub trait TcpStreamExt: Sealed {
8892
/// #![feature(tcp_deferaccept)]
8993
/// use std::net::TcpStream;
9094
/// use std::os::linux::net::TcpStreamExt;
95+
/// use std::time::Duration;
9196
///
9297
/// let stream = TcpStream::connect("127.0.0.1:8080")
9398
/// .expect("Couldn't connect to the server...");
94-
/// stream.set_deferaccept(1).expect("set_deferaccept call failed");
95-
/// assert_eq!(stream.deferaccept().unwrap_or(0), 1);
99+
/// stream.set_deferaccept(Duration::from_secs(1u64)).expect("set_deferaccept call failed");
100+
/// assert_eq!(stream.deferaccept().unwrap(), Duration::from_secs(1u64));
96101
/// ```
97102
#[unstable(feature = "tcp_deferaccept", issue = "119639")]
98103
#[cfg(target_os = "linux")]
99-
fn deferaccept(&self) -> io::Result<u32>;
104+
fn deferaccept(&self) -> io::Result<Duration>;
100105
}
101106

102107
#[unstable(feature = "tcp_quickack", issue = "96256")]
@@ -113,12 +118,12 @@ impl TcpStreamExt for net::TcpStream {
113118
}
114119

115120
#[cfg(target_os = "linux")]
116-
fn set_deferaccept(&self, accept: u32) -> io::Result<()> {
121+
fn set_deferaccept(&self, accept: Duration) -> io::Result<()> {
117122
self.as_inner().as_inner().set_deferaccept(accept)
118123
}
119124

120125
#[cfg(target_os = "linux")]
121-
fn deferaccept(&self) -> io::Result<u32> {
126+
fn deferaccept(&self) -> io::Result<Duration> {
122127
self.as_inner().as_inner().deferaccept()
123128
}
124129
}

library/std/src/os/net/linux_ext/tests.rs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ fn deferaccept() {
3232
use crate::net::test::next_test_ip4;
3333
use crate::net::{TcpListener, TcpStream};
3434
use crate::os::net::linux_ext::tcp::TcpStreamExt;
35+
use crate::time::Duration;
3536

3637
macro_rules! t {
3738
($e:expr) => {
@@ -43,10 +44,12 @@ fn deferaccept() {
4344
}
4445

4546
let addr = next_test_ip4();
47+
let one = Duration::from_secs(1u64);
48+
let zero = Duration::from_secs(0u64);
4649
let _listener = t!(TcpListener::bind(&addr));
4750
let stream = t!(TcpStream::connect(&("localhost", addr.port())));
48-
stream.set_deferaccept(1).expect("set_deferaccept failed");
49-
assert_eq!(stream.deferaccept().unwrap(), 1);
50-
stream.set_deferaccept(0).expect("set_deferaccept failed");
51-
assert_eq!(stream.deferaccept().unwrap(), 0);
51+
stream.set_deferaccept(one).expect("set_deferaccept failed");
52+
assert_eq!(stream.deferaccept().unwrap(), one);
53+
stream.set_deferaccept(zero).expect("set_deferaccept failed");
54+
assert_eq!(stream.deferaccept().unwrap(), zero);
5255
}

library/std/src/sys/net/connection/socket/unix.rs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -473,14 +473,19 @@ impl Socket {
473473

474474
// bionic libc makes no use of this flag
475475
#[cfg(target_os = "linux")]
476-
pub fn set_deferaccept(&self, accept: u32) -> io::Result<()> {
477-
setsockopt(self, libc::IPPROTO_TCP, libc::TCP_DEFER_ACCEPT, accept as c_int)
476+
pub fn set_deferaccept(&self, accept: Duration) -> io::Result<()> {
477+
setsockopt(
478+
self,
479+
libc::IPPROTO_TCP,
480+
libc::TCP_DEFER_ACCEPT,
481+
accept.as_secs_f64().round() as c_int,
482+
)
478483
}
479484

480485
#[cfg(target_os = "linux")]
481-
pub fn deferaccept(&self) -> io::Result<u32> {
486+
pub fn deferaccept(&self) -> io::Result<Duration> {
482487
let raw: c_int = getsockopt(self, libc::IPPROTO_TCP, libc::TCP_DEFER_ACCEPT)?;
483-
Ok(raw as u32)
488+
Ok(Duration::from_secs(raw.try_into().unwrap()))
484489
}
485490

486491
#[cfg(any(target_os = "freebsd", target_os = "netbsd"))]

0 commit comments

Comments
 (0)