1use std::mem;
2use std::io::{self, Read, Write};
3use std::os::unix::io::{AsRawFd, FromRawFd, IntoRawFd, RawFd};
4
5use crate::event::{Evented, EventedId};
6use crate::poll::{Interests, PollOption, Poller};
7use crate::sys::unix::EventedIo;
8
9pub fn new_pipe() -> io::Result<(Sender, Receiver)> {
68 let mut fds: [RawFd; 2] = unsafe { mem::uninitialized() };
69
70 if unsafe { libc::pipe(fds.as_mut_ptr()) } == -1 {
71 Err(io::Error::last_os_error())
72 } else {
73 for fd in &fds {
74 if unsafe { libc::fcntl(*fd, libc::F_SETFL, libc::O_NONBLOCK) } == -1 {
75 return Err(io::Error::last_os_error());
76 }
77 }
78 let r = Receiver { inner: unsafe { EventedIo::from_raw_fd(fds[0]) } };
79 let w = Sender { inner: unsafe { EventedIo::from_raw_fd(fds[1]) } };
80 Ok((w, r))
81 }
82}
83
84#[derive(Debug)]
90pub struct Receiver {
91 inner: EventedIo,
92}
93
94impl Receiver {
95 pub const INTERESTS: Interests = Interests::READABLE;
97}
98
99impl Evented for Receiver {
100 fn register(&mut self, poller: &mut Poller, id: EventedId, interests: Interests, opt: PollOption) -> io::Result<()> {
101 debug_assert!(!interests.is_writable(), "receiving end of a pipe can never be written");
102 self.inner.register(poller, id, interests, opt)
103 }
104
105 fn reregister(&mut self, poller: &mut Poller, id: EventedId, interests: Interests, opt: PollOption) -> io::Result<()> {
106 debug_assert!(!interests.is_writable(), "receiving end of a pipe can never be written");
107 self.inner.reregister(poller, id, interests, opt)
108 }
109
110 fn deregister(&mut self, poller: &mut Poller) -> io::Result<()> {
111 self.inner.deregister(poller)
112 }
113}
114
115impl AsRawFd for Receiver {
116 fn as_raw_fd(&self) -> RawFd {
117 self.inner.as_raw_fd()
118 }
119}
120
121impl IntoRawFd for Receiver {
122 fn into_raw_fd(self) -> RawFd {
123 self.inner.into_raw_fd()
124 }
125}
126
127impl Read for Receiver {
128 fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
129 self.inner.read(buf)
130 }
131}
132
133#[derive(Debug)]
139pub struct Sender {
140 inner: EventedIo,
141}
142
143impl Sender {
144 pub const INTERESTS: Interests = Interests::WRITABLE;
146}
147
148impl Evented for Sender {
149 fn register(&mut self, poller: &mut Poller, id: EventedId, interests: Interests, opt: PollOption) -> io::Result<()> {
150 debug_assert!(!interests.is_readable(), "sending end of a pipe can never be read");
151 self.inner.register(poller, id, interests, opt)
152 }
153
154 fn reregister(&mut self, poller: &mut Poller, id: EventedId, interests: Interests, opt: PollOption) -> io::Result<()> {
155 debug_assert!(!interests.is_readable(), "sending end of a pipe can never be read");
156 self.inner.reregister(poller, id, interests, opt)
157 }
158
159 fn deregister(&mut self, poller: &mut Poller) -> io::Result<()> {
160 self.inner.deregister(poller)
161 }
162}
163
164impl AsRawFd for Sender {
165 fn as_raw_fd(&self) -> RawFd {
166 self.inner.as_raw_fd()
167 }
168}
169
170impl IntoRawFd for Sender {
171 fn into_raw_fd(self) -> RawFd {
172 self.inner.into_raw_fd()
173 }
174}
175
176impl Write for Sender {
177 fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
178 self.inner.write(buf)
179 }
180
181 fn flush(&mut self) -> io::Result<()> {
182 self.inner.flush()
183 }
184}