1 | // SPDX-License-Identifier: MIT OR Apache-2.0 |
2 | |
3 | use polling::{Event, Poller}; |
4 | |
5 | use std::fmt; |
6 | use std::io::Result; |
7 | use std::os::unix::io::{AsRawFd, BorrowedFd, RawFd}; |
8 | |
9 | /// The raw registration into the reactor. |
10 | #[doc (hidden)] |
11 | pub struct Registration { |
12 | /// Raw file descriptor on Unix. |
13 | /// |
14 | /// # Invariant |
15 | /// |
16 | /// This describes a valid file descriptor that has not been `close`d. It will not be |
17 | /// closed while this object is alive. |
18 | raw: RawFd, |
19 | } |
20 | |
21 | impl fmt::Debug for Registration { |
22 | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { |
23 | fmt::Debug::fmt(&self.raw, f) |
24 | } |
25 | } |
26 | |
27 | impl Registration { |
28 | /// Add this file descriptor into the reactor. |
29 | /// |
30 | /// # Safety |
31 | /// |
32 | /// The provided file descriptor must be valid and not be closed while this object is alive. |
33 | pub(crate) unsafe fn new(f: BorrowedFd<'_>) -> Self { |
34 | Self { raw: f.as_raw_fd() } |
35 | } |
36 | |
37 | /// Registers the object into the reactor. |
38 | #[inline ] |
39 | pub(crate) fn add(&self, poller: &Poller, token: usize) -> Result<()> { |
40 | // SAFETY: This object's existence validates the invariants of Poller::add |
41 | unsafe { poller.add(self.raw, Event::none(token)) } |
42 | } |
43 | |
44 | /// Re-registers the object into the reactor. |
45 | #[inline ] |
46 | pub(crate) fn modify(&self, poller: &Poller, interest: Event) -> Result<()> { |
47 | // SAFETY: self.raw is a valid file descriptor |
48 | let fd = unsafe { BorrowedFd::borrow_raw(self.raw) }; |
49 | poller.modify(fd, interest) |
50 | } |
51 | |
52 | /// Deregisters the object from the reactor. |
53 | #[inline ] |
54 | pub(crate) fn delete(&self, poller: &Poller) -> Result<()> { |
55 | // SAFETY: self.raw is a valid file descriptor |
56 | let fd = unsafe { BorrowedFd::borrow_raw(self.raw) }; |
57 | poller.delete(fd) |
58 | } |
59 | } |
60 | |