2 use std
::os
::unix
::io
::{AsRawFd, FromRawFd, IntoRawFd, RawFd}
;
3 use std
::task
::{Context, Poll}
;
5 use mio
::event
::Evented
;
6 use mio
::unix
::EventedFd
as MioEventedFd
;
7 use mio
::Poll
as MioPoll
;
8 use mio
::{PollOpt, Ready, Token}
;
9 use tokio
::io
::PollEvented
;
14 pub struct EventedFd
{
20 pub fn new(fd
: Fd
) -> Self {
25 impl AsRawFd
for EventedFd
{
27 fn as_raw_fd(&self) -> RawFd
{
32 impl FromRawFd
for EventedFd
{
34 unsafe fn from_raw_fd(fd
: RawFd
) -> Self {
35 Self::new(Fd
::from_raw_fd(fd
))
39 impl IntoRawFd
for EventedFd
{
41 fn into_raw_fd(self) -> RawFd
{
46 impl Evented
for EventedFd
{
54 MioEventedFd(self.fd
.as_ref()).register(poll
, token
, interest
, opts
)
64 MioEventedFd(self.fd
.as_ref()).reregister(poll
, token
, interest
, opts
)
67 fn deregister(&self, poll
: &MioPoll
) -> io
::Result
<()> {
68 MioEventedFd(self.fd
.as_ref()).deregister(poll
)
74 fd
: PollEvented
<EventedFd
>,
78 pub fn new(fd
: Fd
) -> tokio
::io
::Result
<Self> {
80 fd
: PollEvented
::new(EventedFd
::new(fd
))?
,
87 func
: impl FnOnce() -> io
::Result
<T
>,
88 ) -> Poll
<io
::Result
<T
>> {
89 ready
!(self.fd
.poll_read_ready(cx
, mio
::Ready
::readable()))?
;
91 Ok(out
) => Poll
::Ready(Ok(out
)),
92 Err(ref err
) if err
.kind() == io
::ErrorKind
::WouldBlock
=> {
93 self.fd
.clear_read_ready(cx
, mio
::Ready
::readable())?
;
96 Err(err
) => Poll
::Ready(Err(err
)),
100 pub fn wrap_write
<T
>(
103 func
: impl FnOnce() -> io
::Result
<T
>,
104 ) -> Poll
<io
::Result
<T
>> {
105 ready
!(self.fd
.poll_write_ready(cx
))?
;
107 Ok(out
) => Poll
::Ready(Ok(out
)),
108 Err(ref err
) if err
.kind() == io
::ErrorKind
::WouldBlock
=> {
109 self.fd
.clear_write_ready(cx
)?
;
112 Err(err
) => Poll
::Ready(Err(err
)),
117 impl AsRawFd
for PolledFd
{
119 fn as_raw_fd(&self) -> RawFd
{
120 self.fd
.get_ref().as_raw_fd()
124 impl IntoRawFd
for PolledFd
{
126 fn into_raw_fd(self) -> RawFd
{
127 // for the kind of resource we're managing it should always be possible to extract it from
131 .expect("failed to remove polled file descriptor from reactor")