Skip to content

Commit 347d5e3

Browse files
committed
Take BorrowedFd as the argument for FdSet::{insert, remove, contains}
&AsFd doesn't work because there are 'static types, like std::fs::File, which implement AsFd.
1 parent 3e2146f commit 347d5e3

File tree

3 files changed

+65
-63
lines changed

3 files changed

+65
-63
lines changed

CHANGELOG.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,10 @@ This project adheres to [Semantic Versioning](https://semver.org/).
2525
## [Unreleased] - ReleaseDate
2626

2727
### Fixed
28+
### Changed
2829

29-
- Relaxed lifetime requirements for `FdSet::{insert, remove, contains}`.
30+
- `FdSet::{insert, remove, contains}` now take `BorrowedFd` arguments, and have
31+
relaxed lifetime requirements relative to 0.27.1.
3032
([#2135](https://github.com/nix-rust/nix/pull/2135))
3133

3234
## [0.27.1] - 2023-08-28

src/sys/select.rs

Lines changed: 52 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use std::convert::TryFrom;
77
use std::iter::FusedIterator;
88
use std::mem;
99
use std::ops::Range;
10-
use std::os::unix::io::{AsFd, AsRawFd, BorrowedFd, RawFd};
10+
use std::os::unix::io::{AsRawFd, BorrowedFd, RawFd};
1111
use std::ptr::{null, null_mut};
1212

1313
pub use libc::FD_SETSIZE;
@@ -41,21 +41,21 @@ impl<'fd> FdSet<'fd> {
4141
}
4242

4343
/// Add a file descriptor to an `FdSet`
44-
pub fn insert<Fd: AsFd + 'fd>(&mut self, fd: Fd) {
45-
assert_fd_valid(fd.as_fd().as_raw_fd());
46-
unsafe { libc::FD_SET(fd.as_fd().as_raw_fd(), &mut self.set) };
44+
pub fn insert(&mut self, fd: BorrowedFd<'fd>) {
45+
assert_fd_valid(fd.as_raw_fd());
46+
unsafe { libc::FD_SET(fd.as_raw_fd(), &mut self.set) };
4747
}
4848

4949
/// Remove a file descriptor from an `FdSet`
50-
pub fn remove<Fd: AsFd + 'fd>(&mut self, fd: Fd) {
51-
assert_fd_valid(fd.as_fd().as_raw_fd());
52-
unsafe { libc::FD_CLR(fd.as_fd().as_raw_fd(), &mut self.set) };
50+
pub fn remove(&mut self, fd: BorrowedFd<'fd>) {
51+
assert_fd_valid(fd.as_raw_fd());
52+
unsafe { libc::FD_CLR(fd.as_raw_fd(), &mut self.set) };
5353
}
5454

5555
/// Test an `FdSet` for the presence of a certain file descriptor.
56-
pub fn contains<Fd: AsFd + 'fd>(&self, fd: Fd) -> bool {
57-
assert_fd_valid(fd.as_fd().as_raw_fd());
58-
unsafe { libc::FD_ISSET(fd.as_fd().as_raw_fd(), &self.set) }
56+
pub fn contains(&self, fd: BorrowedFd<'fd>) -> bool {
57+
assert_fd_valid(fd.as_raw_fd());
58+
unsafe { libc::FD_ISSET(fd.as_raw_fd(), &self.set) }
5959
}
6060

6161
/// Remove all file descriptors from this `FdSet`.
@@ -72,13 +72,13 @@ impl<'fd> FdSet<'fd> {
7272
/// # Example
7373
///
7474
/// ```
75-
/// # use std::os::unix::io::{AsRawFd, BorrowedFd};
75+
/// # use std::os::unix::io::{AsFd, AsRawFd, BorrowedFd};
7676
/// # use nix::sys::select::FdSet;
7777
/// let fd_four = unsafe {BorrowedFd::borrow_raw(4)};
7878
/// let fd_nine = unsafe {BorrowedFd::borrow_raw(9)};
7979
/// let mut set = FdSet::new();
80-
/// set.insert(&fd_four);
81-
/// set.insert(&fd_nine);
80+
/// set.insert(fd_four);
81+
/// set.insert(fd_nine);
8282
/// assert_eq!(set.highest().map(|borrowed_fd|borrowed_fd.as_raw_fd()), Some(9));
8383
/// ```
8484
///
@@ -97,12 +97,12 @@ impl<'fd> FdSet<'fd> {
9797
///
9898
/// ```
9999
/// # use nix::sys::select::FdSet;
100-
/// # use std::os::unix::io::{AsRawFd, BorrowedFd, RawFd};
100+
/// # use std::os::unix::io::{AsFd, AsRawFd, BorrowedFd, RawFd};
101101
/// let mut set = FdSet::new();
102102
/// let fd_four = unsafe {BorrowedFd::borrow_raw(4)};
103103
/// let fd_nine = unsafe {BorrowedFd::borrow_raw(9)};
104-
/// set.insert(&fd_four);
105-
/// set.insert(&fd_nine);
104+
/// set.insert(fd_four);
105+
/// set.insert(fd_nine);
106106
/// let fds: Vec<RawFd> = set.fds(None).map(|borrowed_fd|borrowed_fd.as_raw_fd()).collect();
107107
/// assert_eq!(fds, vec![4, 9]);
108108
/// ```
@@ -134,7 +134,7 @@ impl<'a, 'fd> Iterator for Fds<'a, 'fd> {
134134
fn next(&mut self) -> Option<Self::Item> {
135135
for i in &mut self.range {
136136
let borrowed_i = unsafe { BorrowedFd::borrow_raw(i as RawFd) };
137-
if self.set.contains(&borrowed_i) {
137+
if self.set.contains(borrowed_i) {
138138
return Some(borrowed_i);
139139
}
140140
}
@@ -153,7 +153,7 @@ impl<'a, 'fd> DoubleEndedIterator for Fds<'a, 'fd> {
153153
fn next_back(&mut self) -> Option<BorrowedFd<'fd>> {
154154
while let Some(i) = self.range.next_back() {
155155
let borrowed_i = unsafe { BorrowedFd::borrow_raw(i as RawFd) };
156-
if self.set.contains(&borrowed_i) {
156+
if self.set.contains(borrowed_i) {
157157
return Some(borrowed_i);
158158
}
159159
}
@@ -323,21 +323,21 @@ mod tests {
323323
use super::*;
324324
use crate::sys::time::{TimeVal, TimeValLike};
325325
use crate::unistd::{pipe, write};
326-
use std::os::unix::io::RawFd;
326+
use std::os::unix::io::{AsFd, RawFd};
327327

328328
#[test]
329329
fn fdset_insert() {
330330
let mut fd_set = FdSet::new();
331331

332332
for i in 0..FD_SETSIZE {
333333
let borrowed_i = unsafe { BorrowedFd::borrow_raw(i as RawFd) };
334-
assert!(!fd_set.contains(&borrowed_i));
334+
assert!(!fd_set.contains(borrowed_i));
335335
}
336336

337337
let fd_seven = unsafe { BorrowedFd::borrow_raw(7) };
338-
fd_set.insert(&fd_seven);
338+
fd_set.insert(fd_seven);
339339

340-
assert!(fd_set.contains(&fd_seven));
340+
assert!(fd_set.contains(fd_seven));
341341
}
342342

343343
#[test]
@@ -346,16 +346,16 @@ mod tests {
346346

347347
for i in 0..FD_SETSIZE {
348348
let borrowed_i = unsafe { BorrowedFd::borrow_raw(i as RawFd) };
349-
assert!(!fd_set.contains(&borrowed_i));
349+
assert!(!fd_set.contains(borrowed_i));
350350
}
351351

352352
let fd_seven = unsafe { BorrowedFd::borrow_raw(7) };
353-
fd_set.insert(&fd_seven);
354-
fd_set.remove(&fd_seven);
353+
fd_set.insert(fd_seven);
354+
fd_set.remove(fd_seven);
355355

356356
for i in 0..FD_SETSIZE {
357357
let borrowed_i = unsafe { BorrowedFd::borrow_raw(i as RawFd) };
358-
assert!(!fd_set.contains(&borrowed_i));
358+
assert!(!fd_set.contains(borrowed_i));
359359
}
360360
}
361361

@@ -364,19 +364,19 @@ mod tests {
364364
fn fdset_clear() {
365365
let mut fd_set = FdSet::new();
366366
let fd_one = unsafe { BorrowedFd::borrow_raw(1) };
367-
let fd_FD_SETSIZE_devided_by_two =
367+
let fd_FD_SETSIZE_divided_by_two =
368368
unsafe { BorrowedFd::borrow_raw((FD_SETSIZE / 2) as RawFd) };
369369
let fd_FD_SETSIZE_minus_one =
370370
unsafe { BorrowedFd::borrow_raw((FD_SETSIZE - 1) as RawFd) };
371-
fd_set.insert(&fd_one);
372-
fd_set.insert(&fd_FD_SETSIZE_devided_by_two);
373-
fd_set.insert(&fd_FD_SETSIZE_minus_one);
371+
fd_set.insert(fd_one);
372+
fd_set.insert(fd_FD_SETSIZE_divided_by_two);
373+
fd_set.insert(fd_FD_SETSIZE_minus_one);
374374

375375
fd_set.clear();
376376

377377
for i in 0..FD_SETSIZE {
378378
let borrowed_i = unsafe { BorrowedFd::borrow_raw(i as RawFd) };
379-
assert!(!fd_set.contains(&borrowed_i));
379+
assert!(!fd_set.contains(borrowed_i));
380380
}
381381
}
382382

@@ -389,22 +389,22 @@ mod tests {
389389
);
390390
let fd_zero = unsafe { BorrowedFd::borrow_raw(0) };
391391
let fd_ninety = unsafe { BorrowedFd::borrow_raw(90) };
392-
set.insert(&fd_zero);
392+
set.insert(fd_zero);
393393
assert_eq!(
394394
set.highest().map(|borrowed_fd| borrowed_fd.as_raw_fd()),
395395
Some(0)
396396
);
397-
set.insert(&fd_ninety);
397+
set.insert(fd_ninety);
398398
assert_eq!(
399399
set.highest().map(|borrowed_fd| borrowed_fd.as_raw_fd()),
400400
Some(90)
401401
);
402-
set.remove(&fd_zero);
402+
set.remove(fd_zero);
403403
assert_eq!(
404404
set.highest().map(|borrowed_fd| borrowed_fd.as_raw_fd()),
405405
Some(90)
406406
);
407-
set.remove(&fd_ninety);
407+
set.remove(fd_ninety);
408408
assert_eq!(
409409
set.highest().map(|borrowed_fd| borrowed_fd.as_raw_fd()),
410410
None
@@ -413,9 +413,9 @@ mod tests {
413413
let fd_four = unsafe { BorrowedFd::borrow_raw(4) };
414414
let fd_five = unsafe { BorrowedFd::borrow_raw(5) };
415415
let fd_seven = unsafe { BorrowedFd::borrow_raw(7) };
416-
set.insert(&fd_four);
417-
set.insert(&fd_five);
418-
set.insert(&fd_seven);
416+
set.insert(fd_four);
417+
set.insert(fd_five);
418+
set.insert(fd_seven);
419419
assert_eq!(
420420
set.highest().map(|borrowed_fd| borrowed_fd.as_raw_fd()),
421421
Some(7)
@@ -433,14 +433,14 @@ mod tests {
433433
.collect::<Vec<_>>(),
434434
vec![]
435435
);
436-
set.insert(&fd_zero);
436+
set.insert(fd_zero);
437437
assert_eq!(
438438
set.fds(None)
439439
.map(|borrowed_fd| borrowed_fd.as_raw_fd())
440440
.collect::<Vec<_>>(),
441441
vec![0]
442442
);
443-
set.insert(&fd_ninety);
443+
set.insert(fd_ninety);
444444
assert_eq!(
445445
set.fds(None)
446446
.map(|borrowed_fd| borrowed_fd.as_raw_fd())
@@ -470,16 +470,16 @@ mod tests {
470470

471471
write(&w1, b"hi!").unwrap();
472472
let mut fd_set = FdSet::new();
473-
fd_set.insert(&r1);
474-
fd_set.insert(&r2);
473+
fd_set.insert(r1.as_fd());
474+
fd_set.insert(r2.as_fd());
475475

476476
let mut timeout = TimeVal::seconds(10);
477477
assert_eq!(
478478
1,
479479
select(None, &mut fd_set, None, None, &mut timeout).unwrap()
480480
);
481-
assert!(fd_set.contains(&r1));
482-
assert!(!fd_set.contains(&r2));
481+
assert!(fd_set.contains(r1.as_fd()));
482+
assert!(!fd_set.contains(r2.as_fd()));
483483
}
484484

485485
#[test]
@@ -489,8 +489,8 @@ mod tests {
489489

490490
write(&w1, b"hi!").unwrap();
491491
let mut fd_set = FdSet::new();
492-
fd_set.insert(&r1);
493-
fd_set.insert(&r2);
492+
fd_set.insert(r1.as_fd());
493+
fd_set.insert(r2.as_fd());
494494

495495
let mut timeout = TimeVal::seconds(10);
496496
{
@@ -512,8 +512,8 @@ mod tests {
512512
.unwrap()
513513
);
514514
}
515-
assert!(fd_set.contains(&r1));
516-
assert!(!fd_set.contains(&r2));
515+
assert!(fd_set.contains(r1.as_fd()));
516+
assert!(!fd_set.contains(r2.as_fd()));
517517
}
518518

519519
#[test]
@@ -522,8 +522,8 @@ mod tests {
522522
write(&w1, b"hi!").unwrap();
523523
let (r2, _w2) = pipe().unwrap();
524524
let mut fd_set = FdSet::new();
525-
fd_set.insert(&r1);
526-
fd_set.insert(&r2);
525+
fd_set.insert(r1.as_fd());
526+
fd_set.insert(r2.as_fd());
527527

528528
let mut timeout = TimeVal::seconds(10);
529529
assert_eq!(
@@ -537,7 +537,7 @@ mod tests {
537537
)
538538
.unwrap()
539539
);
540-
assert!(fd_set.contains(&r1));
541-
assert!(!fd_set.contains(&r2));
540+
assert!(fd_set.contains(r1.as_fd()));
541+
assert!(!fd_set.contains(r2.as_fd()));
542542
}
543543
}

test/sys/test_select.rs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use nix::sys::select::*;
22
use nix::sys::signal::SigSet;
33
use nix::sys::time::{TimeSpec, TimeValLike};
44
use nix::unistd::{pipe, write};
5-
use std::os::unix::io::{AsRawFd, BorrowedFd};
5+
use std::os::unix::io::{AsFd, AsRawFd, BorrowedFd};
66

77
#[test]
88
pub fn test_pselect() {
@@ -13,17 +13,17 @@ pub fn test_pselect() {
1313
let (r2, _w2) = pipe().unwrap();
1414

1515
let mut fd_set = FdSet::new();
16-
fd_set.insert(&r1);
17-
fd_set.insert(&r2);
16+
fd_set.insert(r1.as_fd());
17+
fd_set.insert(r2.as_fd());
1818

1919
let timeout = TimeSpec::seconds(10);
2020
let sigmask = SigSet::empty();
2121
assert_eq!(
2222
1,
2323
pselect(None, &mut fd_set, None, None, &timeout, &sigmask).unwrap()
2424
);
25-
assert!(fd_set.contains(&r1));
26-
assert!(!fd_set.contains(&r2));
25+
assert!(fd_set.contains(r1.as_fd()));
26+
assert!(!fd_set.contains(r2.as_fd()));
2727
}
2828

2929
#[test]
@@ -33,8 +33,8 @@ pub fn test_pselect_nfds2() {
3333
let (r2, _w2) = pipe().unwrap();
3434

3535
let mut fd_set = FdSet::new();
36-
fd_set.insert(&r1);
37-
fd_set.insert(&r2);
36+
fd_set.insert(r1.as_fd());
37+
fd_set.insert(r2.as_fd());
3838

3939
let timeout = TimeSpec::seconds(10);
4040
assert_eq!(
@@ -49,8 +49,8 @@ pub fn test_pselect_nfds2() {
4949
)
5050
.unwrap()
5151
);
52-
assert!(fd_set.contains(&r1));
53-
assert!(!fd_set.contains(&r2));
52+
assert!(fd_set.contains(r1.as_fd()));
53+
assert!(!fd_set.contains(r2.as_fd()));
5454
}
5555

5656
macro_rules! generate_fdset_bad_fd_tests {
@@ -60,7 +60,7 @@ macro_rules! generate_fdset_bad_fd_tests {
6060
#[should_panic]
6161
fn $method() {
6262
let bad_fd = unsafe{BorrowedFd::borrow_raw($fd)};
63-
FdSet::new().$method(&bad_fd);
63+
FdSet::new().$method(bad_fd);
6464
}
6565
)*
6666
}

0 commit comments

Comments
 (0)