blob: 1118258841acb3d081900e25d8c45c643461ee0d [file] [log] [blame]
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Polls for readiness events on all registered values."><meta name="keywords" content="rust, rustlang, rust-lang, Poll"><title>Poll in mio - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../SourceSerif4-Regular.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../FiraSans-Regular.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../FiraSans-Medium.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../SourceCodePro-Regular.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../SourceSerif4-Bold.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../SourceCodePro-Semibold.ttf.woff2"><link rel="stylesheet" href="../normalize.css"><link rel="stylesheet" href="../rustdoc.css" id="mainThemeStyle"><link rel="stylesheet" href="../ayu.css" disabled><link rel="stylesheet" href="../dark.css" disabled><link rel="stylesheet" href="../light.css" id="themeStyle"><script id="default-settings" ></script><script src="../storage.js"></script><script defer src="sidebar-items.js"></script><script defer src="../main.js"></script><noscript><link rel="stylesheet" href="../noscript.css"></noscript><link rel="alternate icon" type="image/png" href="../favicon-16x16.png"><link rel="alternate icon" type="image/png" href="../favicon-32x32.png"><link rel="icon" type="image/svg+xml" href="../favicon.svg"></head><body class="rustdoc struct"><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><nav class="mobile-topbar"><button class="sidebar-menu-toggle">&#9776;</button><a class="sidebar-logo" href="../mio/index.html"><div class="logo-container"><img class="rust-logo" src="../rust-logo.svg" alt="logo"></div></a><h2></h2></nav><nav class="sidebar"><a class="sidebar-logo" href="../mio/index.html"><div class="logo-container"><img class="rust-logo" src="../rust-logo.svg" alt="logo"></div></a><h2 class="location"><a href="#">Poll</a></h2><div class="sidebar-elems"><section><h3><a href="#implementations">Methods</a></h3><ul class="block"><li><a href="#method.new">new</a></li><li><a href="#method.poll">poll</a></li><li><a href="#method.registry">registry</a></li></ul><h3><a href="#trait-implementations">Trait Implementations</a></h3><ul class="block"><li><a href="#impl-AsRawFd-for-Poll">AsRawFd</a></li><li><a href="#impl-Debug-for-Poll">Debug</a></li></ul><h3><a href="#synthetic-implementations">Auto Trait Implementations</a></h3><ul class="block"><li><a href="#impl-RefUnwindSafe-for-Poll">RefUnwindSafe</a></li><li><a href="#impl-Send-for-Poll">Send</a></li><li><a href="#impl-Sync-for-Poll">Sync</a></li><li><a href="#impl-Unpin-for-Poll">Unpin</a></li><li><a href="#impl-UnwindSafe-for-Poll">UnwindSafe</a></li></ul><h3><a href="#blanket-implementations">Blanket Implementations</a></h3><ul class="block"><li><a href="#impl-Any-for-Poll">Any</a></li><li><a href="#impl-Borrow%3CT%3E-for-Poll">Borrow&lt;T&gt;</a></li><li><a href="#impl-BorrowMut%3CT%3E-for-Poll">BorrowMut&lt;T&gt;</a></li><li><a href="#impl-From%3CT%3E-for-Poll">From&lt;T&gt;</a></li><li><a href="#impl-Into%3CU%3E-for-Poll">Into&lt;U&gt;</a></li><li><a href="#impl-TryFrom%3CU%3E-for-Poll">TryFrom&lt;U&gt;</a></li><li><a href="#impl-TryInto%3CU%3E-for-Poll">TryInto&lt;U&gt;</a></li></ul></section><h2><a href="index.html">In mio</a></h2></div></nav><main><div class="width-limiter"><nav class="sub"><form class="search-form"><div class="search-container"><span></span><input class="search-input" name="search" autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"><div id="help-button" title="help" tabindex="-1"><a href="../help.html">?</a></div><div id="settings-menu" tabindex="-1"><a href="../settings.html" title="settings"><img width="22" height="22" alt="Change settings" src="../wheel.svg"></a></div></div></form></nav><section id="main-content" class="content"><div class="main-heading"><h1 class="fqn">Struct <a href="index.html">mio</a>::<wbr><a class="struct" href="#">Poll</a><button id="copy-path" onclick="copy_path(this)" title="Copy item path to clipboard"><img src="../clipboard.svg" width="19" height="18" alt="Copy item path"></button></h1><span class="out-of-band"><a class="srclink" href="../src/mio/poll.rs.html#248-250">source</a> · <a id="toggle-all-docs" href="javascript:void(0)" title="collapse all docs">[<span class="inner">&#x2212;</span>]</a></span></div><div class="item-decl"><pre class="rust struct"><code>pub struct Poll { /* private fields */ }</code></pre></div><details class="rustdoc-toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>Polls for readiness events on all registered values.</p>
<p><code>Poll</code> allows a program to monitor a large number of <a href="./event/trait.Source.html"><code>event::Source</code></a>s,
waiting until one or more become “ready” for some class of operations; e.g.
reading and writing. An event source is considered ready if it is possible
to immediately perform a corresponding operation; e.g. <a href="./net/struct.TcpStream.html#method.read"><code>read</code></a> or
<a href="./net/struct.TcpStream.html#method.write"><code>write</code></a>.</p>
<p>To use <code>Poll</code>, an <code>event::Source</code> must first be registered with the <code>Poll</code>
instance using the <a href="struct.Registry.html#method.register"><code>register</code></a> method on its associated <code>Register</code>,
supplying readiness interest. The readiness interest tells <code>Poll</code> which
specific operations on the handle to monitor for readiness. A <code>Token</code> is
also passed to the <a href="struct.Registry.html#method.register"><code>register</code></a> function. When <code>Poll</code> returns a readiness
event, it will include this token. This associates the event with the
event source that generated the event.</p>
<h2 id="examples"><a href="#examples">Examples</a></h2>
<p>A basic example – establishing a <code>TcpStream</code> connection.</p>
<div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use </span>mio::{Events, Poll, Interest, Token};
<span class="kw">use </span>mio::net::TcpStream;
<span class="kw">use </span>std::net::{<span class="self">self</span>, SocketAddr};
<span class="comment">// Bind a server socket to connect to.
</span><span class="kw">let </span>addr: SocketAddr = <span class="string">&quot;127.0.0.1:0&quot;</span>.parse()<span class="question-mark">?</span>;
<span class="kw">let </span>server = net::TcpListener::bind(addr)<span class="question-mark">?</span>;
<span class="comment">// Construct a new `Poll` handle as well as the `Events` we&#39;ll store into
</span><span class="kw">let </span><span class="kw-2">mut </span>poll = Poll::new()<span class="question-mark">?</span>;
<span class="kw">let </span><span class="kw-2">mut </span>events = Events::with_capacity(<span class="number">1024</span>);
<span class="comment">// Connect the stream
</span><span class="kw">let </span><span class="kw-2">mut </span>stream = TcpStream::connect(server.local_addr()<span class="question-mark">?</span>)<span class="question-mark">?</span>;
<span class="comment">// Register the stream with `Poll`
</span>poll.registry().register(<span class="kw-2">&amp;mut </span>stream, Token(<span class="number">0</span>), Interest::READABLE | Interest::WRITABLE)<span class="question-mark">?</span>;
<span class="comment">// Wait for the socket to become ready. This has to happens in a loop to
// handle spurious wakeups.
</span><span class="kw">loop </span>{
poll.poll(<span class="kw-2">&amp;mut </span>events, <span class="prelude-val">None</span>)<span class="question-mark">?</span>;
<span class="kw">for </span>event <span class="kw">in </span><span class="kw-2">&amp;</span>events {
<span class="kw">if </span>event.token() == Token(<span class="number">0</span>) &amp;&amp; event.is_writable() {
<span class="comment">// The socket connected (probably, it could still be a spurious
// wakeup)
</span><span class="kw">return </span><span class="prelude-val">Ok</span>(());
}
}
}</code></pre></div>
<h2 id="portability"><a href="#portability">Portability</a></h2>
<p>Using <code>Poll</code> provides a portable interface across supported platforms as
long as the caller takes the following into consideration:</p>
<h4 id="spurious-events"><a href="#spurious-events">Spurious events</a></h4>
<p><a href="struct.Poll.html#method.poll"><code>Poll::poll</code></a> may return readiness events even if the associated
event source is not actually ready. Given the same code, this may
happen more on some platforms than others. It is important to never assume
that, just because a readiness event was received, that the associated
operation will succeed as well.</p>
<p>If operation fails with <a href="https://doc.rust-lang.org/nightly/std/io/error/enum.ErrorKind.html#variant.WouldBlock"><code>WouldBlock</code></a>, then the caller should not treat
this as an error, but instead should wait until another readiness event is
received.</p>
<h4 id="draining-readiness"><a href="#draining-readiness">Draining readiness</a></h4>
<p>Once a readiness event is received, the corresponding operation must be
performed repeatedly until it returns <a href="https://doc.rust-lang.org/nightly/std/io/error/enum.ErrorKind.html#variant.WouldBlock"><code>WouldBlock</code></a>. Unless this is done,
there is no guarantee that another readiness event will be delivered, even
if further data is received for the event source.</p>
<h4 id="readiness-operations"><a href="#readiness-operations">Readiness operations</a></h4>
<p>The only readiness operations that are guaranteed to be present on all
supported platforms are <a href="./event/struct.Event.html#method.is_readable"><code>readable</code></a> and <a href="./event/struct.Event.html#method.is_writable"><code>writable</code></a>. All other readiness
operations may have false negatives and as such should be considered
<strong>hints</strong>. This means that if a socket is registered with <a href="./event/struct.Event.html#method.is_readable"><code>readable</code></a>
interest and either an error or close is received, a readiness event will
be generated for the socket, but it <strong>may</strong> only include <code>readable</code>
readiness. Also note that, given the potential for spurious events,
receiving a readiness event with <code>read_closed</code>, <code>write_closed</code>, or <code>error</code>
doesn’t actually mean that a <code>read</code> on the socket will return a result
matching the readiness event.</p>
<p>In other words, portable programs that explicitly check for <a href="./event/struct.Event.html#method.is_read_closed"><code>read_closed</code></a>,
<a href="./event/struct.Event.html#method.is_write_closed"><code>write_closed</code></a>, or <a href="./event/struct.Event.html#method.is_error"><code>error</code></a> readiness should be doing so as an
<strong>optimization</strong> and always be able to handle an error or close situation
when performing the actual read operation.</p>
<h4 id="registering-handles"><a href="#registering-handles">Registering handles</a></h4>
<p>Unless otherwise noted, it should be assumed that types implementing
<a href="./event/trait.Source.html"><code>event::Source</code></a> will never become ready unless they are registered with
<code>Poll</code>.</p>
<p>For example:</p>
<div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use </span>mio::{Poll, Interest, Token};
<span class="kw">use </span>mio::net::TcpStream;
<span class="kw">use </span>std::net::SocketAddr;
<span class="kw">use </span>std::time::Duration;
<span class="kw">use </span>std::thread;
<span class="kw">let </span>address: SocketAddr = <span class="string">&quot;127.0.0.1:0&quot;</span>.parse()<span class="question-mark">?</span>;
<span class="kw">let </span>listener = net::TcpListener::bind(address)<span class="question-mark">?</span>;
<span class="kw">let </span><span class="kw-2">mut </span>sock = TcpStream::connect(listener.local_addr()<span class="question-mark">?</span>)<span class="question-mark">?</span>;
thread::sleep(Duration::from_secs(<span class="number">1</span>));
<span class="kw">let </span>poll = Poll::new()<span class="question-mark">?</span>;
<span class="comment">// The connect is not guaranteed to have started until it is registered at
// this point
</span>poll.registry().register(<span class="kw-2">&amp;mut </span>sock, Token(<span class="number">0</span>), Interest::READABLE | Interest::WRITABLE)<span class="question-mark">?</span>;</code></pre></div>
<h4 id="dropping-poll"><a href="#dropping-poll">Dropping <code>Poll</code></a></h4>
<p>When the <code>Poll</code> instance is dropped it may cancel in-flight operations for
the registered <a href="./event/trait.Source.html">event sources</a>, meaning that no further events for them may
be received. It also means operations on the registered event sources may no
longer work. It is up to the user to keep the <code>Poll</code> instance alive while
registered event sources are being used.</p>
<h4 id="accessing-raw-fdsockethandle"><a href="#accessing-raw-fdsockethandle">Accessing raw fd/socket/handle</a></h4>
<p>Mio makes it possible for many types to be converted into a raw file
descriptor (fd, Unix), socket (Windows) or handle (Windows). This makes it
possible to support more operations on the type than Mio supports, for
example it makes <a href="https://github.com/asomers/mio-aio">mio-aio</a> possible. However accessing the raw fd is not
without it’s pitfalls.</p>
<p>Specifically performing I/O operations outside of Mio on these types (via
the raw fd) has unspecified behaviour. It could cause no more events to be
generated for the type even though it returned <code>WouldBlock</code> (in an operation
directly accessing the fd). The behaviour is OS specific and Mio can only
guarantee cross-platform behaviour if it can control the I/O.</p>
<p><em>The following is <strong>not</strong> guaranteed, just a description of the current
situation!</em> Mio is allowed to change the following without it being considered
a breaking change, don’t depend on this, it’s just here to inform the user.
Currently the kqueue and epoll implementation support direct I/O operations
on the fd without Mio’s knowledge. Windows however needs <strong>all</strong> I/O
operations to go through Mio otherwise it is not able to update it’s
internal state properly and won’t generate events.</p>
<h4 id="polling-without-registering-event-sources"><a href="#polling-without-registering-event-sources">Polling without registering event sources</a></h4>
<p><em>The following is <strong>not</strong> guaranteed, just a description of the current
situation!</em> Mio is allowed to change the following without it being
considered a breaking change, don’t depend on this, it’s just here to inform
the user. On platforms that use epoll, kqueue or IOCP (see implementation
notes below) polling without previously registering <a href="./event/trait.Source.html">event sources</a> will
result in sleeping forever, only a process signal will be able to wake up
the thread.</p>
<p>On WASM/WASI this is different as it doesn’t support process signals,
furthermore the WASI specification doesn’t specify a behaviour in this
situation, thus it’s up to the implementation what to do here. As an
example, the wasmtime runtime will return <code>EINVAL</code> in this situation, but
different runtimes may return different results. If you have further
insights or thoughts about this situation (and/or how Mio should handle it)
please add you comment to <a href="https://github.com/tokio-rs/mio/pull/1580">pull request#1580</a>.</p>
<h2 id="implementation-notes"><a href="#implementation-notes">Implementation notes</a></h2>
<p><code>Poll</code> is backed by the selector provided by the operating system.</p>
<div><table><thead><tr><th>OS</th><th>Selector</th></tr></thead><tbody>
<tr><td>Android</td><td><a href="https://man7.org/linux/man-pages/man7/epoll.7.html">epoll</a></td></tr>
<tr><td>DragonFly BSD</td><td><a href="https://www.freebsd.org/cgi/man.cgi?query=kqueue&amp;sektion=2">kqueue</a></td></tr>
<tr><td>FreeBSD</td><td><a href="https://www.freebsd.org/cgi/man.cgi?query=kqueue&amp;sektion=2">kqueue</a></td></tr>
<tr><td>iOS</td><td><a href="https://www.freebsd.org/cgi/man.cgi?query=kqueue&amp;sektion=2">kqueue</a></td></tr>
<tr><td>illumos</td><td><a href="https://man7.org/linux/man-pages/man7/epoll.7.html">epoll</a></td></tr>
<tr><td>Linux</td><td><a href="https://man7.org/linux/man-pages/man7/epoll.7.html">epoll</a></td></tr>
<tr><td>NetBSD</td><td><a href="https://www.freebsd.org/cgi/man.cgi?query=kqueue&amp;sektion=2">kqueue</a></td></tr>
<tr><td>OpenBSD</td><td><a href="https://www.freebsd.org/cgi/man.cgi?query=kqueue&amp;sektion=2">kqueue</a></td></tr>
<tr><td>Windows</td><td><a href="https://docs.microsoft.com/en-us/windows/win32/fileio/i-o-completion-ports">IOCP</a></td></tr>
<tr><td>macOS</td><td><a href="https://www.freebsd.org/cgi/man.cgi?query=kqueue&amp;sektion=2">kqueue</a></td></tr>
</tbody></table>
</div>
<p>On all supported platforms, socket operations are handled by using the
system selector. Platform specific extensions (e.g. <a href="unix/struct.SourceFd.html"><code>SourceFd</code></a>) allow
accessing other features provided by individual system selectors. For
example, Linux’s <a href="https://man7.org/linux/man-pages/man2/signalfd.2.html"><code>signalfd</code></a> feature can be used by registering the FD with
<code>Poll</code> via <a href="unix/struct.SourceFd.html"><code>SourceFd</code></a>.</p>
<p>On all platforms except windows, a call to <a href="struct.Poll.html#method.poll"><code>Poll::poll</code></a> is mostly just a
direct call to the system selector. However, <a href="https://docs.microsoft.com/en-us/windows/win32/fileio/i-o-completion-ports">IOCP</a> uses a completion model
instead of a readiness model. In this case, <code>Poll</code> must adapt the completion
model Mio’s API. While non-trivial, the bridge layer is still quite
efficient. The most expensive part being calls to <code>read</code> and <code>write</code> require
data to be copied into an intermediate buffer before it is passed to the
kernel.</p>
</div></details><h2 id="implementations" class="small-section-header">Implementations<a href="#implementations" class="anchor"></a></h2><div id="implementations-list"><details class="rustdoc-toggle implementors-toggle" open><summary><section id="impl-Poll" class="impl has-srclink"><a class="srclink rightside" href="../src/mio/poll.rs.html#257-412">source</a><a href="#impl-Poll" class="anchor"></a><h3 class="code-header">impl <a class="struct" href="struct.Poll.html" title="struct mio::Poll">Poll</a></h3></section></summary><div class="impl-items"><details class="rustdoc-toggle method-toggle" open><summary><section id="method.new" class="method has-srclink"><a class="srclink rightside" href="../src/mio/poll.rs.html#299-303">source</a><h4 class="code-header">pub fn <a href="#method.new" class="fnname">new</a>() -&gt; <a class="type" href="https://doc.rust-lang.org/nightly/std/io/error/type.Result.html" title="type std::io::error::Result">Result</a>&lt;<a class="struct" href="struct.Poll.html" title="struct mio::Poll">Poll</a>&gt;</h4></section></summary><div class="docblock"><p>Return a new <code>Poll</code> handle.</p>
<p>This function will make a syscall to the operating system to create
the system selector. If this syscall fails, <code>Poll::new</code> will return
with the error.</p>
<p>close-on-exec flag is set on the file descriptors used by the selector to prevent
leaking it to executed processes. However, on some systems such as
old Linux systems that don’t support <code>epoll_create1</code> syscall it is done
non-atomically, so a separate thread executing in parallel to this
function may accidentally leak the file descriptor if it executes a
new process before this function returns.</p>
<p>See <a href="struct.Poll.html">struct</a> level docs for more details.</p>
<h5 id="examples-1"><a href="#examples-1">Examples</a></h5>
<div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use </span>mio::{Poll, Events};
<span class="kw">use </span>std::time::Duration;
<span class="kw">let </span><span class="kw-2">mut </span>poll = <span class="kw">match </span>Poll::new() {
<span class="prelude-val">Ok</span>(poll) =&gt; poll,
<span class="prelude-val">Err</span>(e) =&gt; <span class="macro">panic!</span>(<span class="string">&quot;failed to create Poll instance; err={:?}&quot;</span>, e),
};
<span class="comment">// Create a structure to receive polled events
</span><span class="kw">let </span><span class="kw-2">mut </span>events = Events::with_capacity(<span class="number">1024</span>);
<span class="comment">// Wait for events, but none will be received because no
// `event::Source`s have been registered with this `Poll` instance.
</span>poll.poll(<span class="kw-2">&amp;mut </span>events, <span class="prelude-val">Some</span>(Duration::from_millis(<span class="number">500</span>)))<span class="question-mark">?</span>;
<span class="macro">assert!</span>(events.is_empty());</code></pre></div>
</div></details><details class="rustdoc-toggle method-toggle" open><summary><section id="method.registry" class="method has-srclink"><a class="srclink rightside" href="../src/mio/poll.rs.html#308-310">source</a><h4 class="code-header">pub fn <a href="#method.registry" class="fnname">registry</a>(&amp;self) -&gt; &amp;<a class="struct" href="struct.Registry.html" title="struct mio::Registry">Registry</a></h4></section></summary><div class="docblock"><p>Create a separate <code>Registry</code> which can be used to register
<code>event::Source</code>s.</p>
</div></details><details class="rustdoc-toggle method-toggle" open><summary><section id="method.poll" class="method has-srclink"><a class="srclink rightside" href="../src/mio/poll.rs.html#409-411">source</a><h4 class="code-header">pub fn <a href="#method.poll" class="fnname">poll</a>(<br>&nbsp;&nbsp;&nbsp;&nbsp;&amp;mut self,<br>&nbsp;&nbsp;&nbsp;&nbsp;events: &amp;mut <a class="struct" href="event/struct.Events.html" title="struct mio::event::Events">Events</a>,<br>&nbsp;&nbsp;&nbsp;&nbsp;timeout: <a class="enum" href="https://doc.rust-lang.org/nightly/core/option/enum.Option.html" title="enum core::option::Option">Option</a>&lt;<a class="struct" href="https://doc.rust-lang.org/nightly/core/time/struct.Duration.html" title="struct core::time::Duration">Duration</a>&gt;<br>) -&gt; <a class="type" href="https://doc.rust-lang.org/nightly/std/io/error/type.Result.html" title="type std::io::error::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.unit.html">()</a>&gt;</h4></section></summary><div class="docblock"><p>Wait for readiness events</p>
<p>Blocks the current thread and waits for readiness events for any of the
<a href="./event/trait.Source.html"><code>event::Source</code></a>s that have been registered with this <code>Poll</code> instance.
The function will block until either at least one readiness event has
been received or <code>timeout</code> has elapsed. A <code>timeout</code> of <code>None</code> means that
<code>poll</code> will block until a readiness event has been received.</p>
<p>The supplied <code>events</code> will be cleared and newly received readiness events
will be pushed onto the end. At most <code>events.capacity()</code> events will be
returned. If there are further pending readiness events, they will be
returned on the next call to <code>poll</code>.</p>
<p>A single call to <code>poll</code> may result in multiple readiness events being
returned for a single event source. For example, if a TCP socket becomes
both readable and writable, it may be possible for a single readiness
event to be returned with both <a href="struct.Interest.html#associatedconstant.READABLE"><code>readable</code></a> and <a href="struct.Interest.html#associatedconstant.WRITABLE"><code>writable</code></a> readiness
<strong>OR</strong> two separate events may be returned, one with <a href="struct.Interest.html#associatedconstant.READABLE"><code>readable</code></a> set
and one with <a href="struct.Interest.html#associatedconstant.WRITABLE"><code>writable</code></a> set.</p>
<p>Note that the <code>timeout</code> will be rounded up to the system clock
granularity (usually 1ms), and kernel scheduling delays mean that
the blocking interval may be overrun by a small amount.</p>
<p>See the <a href="struct.Poll.html">struct</a> level documentation for a higher level discussion of
polling.</p>
<h5 id="notes"><a href="#notes">Notes</a></h5>
<p>This returns any errors without attempting to retry, previous versions
of Mio would automatically retry the poll call if it was interrupted
(if <code>EINTR</code> was returned).</p>
<p>Currently if the <code>timeout</code> elapses without any readiness events
triggering this will return <code>Ok(())</code>. However we’re not guaranteeing
this behaviour as this depends on the OS.</p>
<h5 id="examples-2"><a href="#examples-2">Examples</a></h5>
<p>A basic example – establishing a <code>TcpStream</code> connection.</p>
<div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use </span>mio::{Events, Poll, Interest, Token};
<span class="kw">use </span>mio::net::TcpStream;
<span class="kw">use </span>std::net::{TcpListener, SocketAddr};
<span class="kw">use </span>std::thread;
<span class="comment">// Bind a server socket to connect to.
</span><span class="kw">let </span>addr: SocketAddr = <span class="string">&quot;127.0.0.1:0&quot;</span>.parse()<span class="question-mark">?</span>;
<span class="kw">let </span>server = TcpListener::bind(addr)<span class="question-mark">?</span>;
<span class="kw">let </span>addr = server.local_addr()<span class="question-mark">?</span>.clone();
<span class="comment">// Spawn a thread to accept the socket
</span>thread::spawn(<span class="kw">move </span>|| {
<span class="kw">let _ </span>= server.accept();
});
<span class="comment">// Construct a new `Poll` handle as well as the `Events` we&#39;ll store into
</span><span class="kw">let </span><span class="kw-2">mut </span>poll = Poll::new()<span class="question-mark">?</span>;
<span class="kw">let </span><span class="kw-2">mut </span>events = Events::with_capacity(<span class="number">1024</span>);
<span class="comment">// Connect the stream
</span><span class="kw">let </span><span class="kw-2">mut </span>stream = TcpStream::connect(addr)<span class="question-mark">?</span>;
<span class="comment">// Register the stream with `Poll`
</span>poll.registry().register(
<span class="kw-2">&amp;mut </span>stream,
Token(<span class="number">0</span>),
Interest::READABLE | Interest::WRITABLE)<span class="question-mark">?</span>;
<span class="comment">// Wait for the socket to become ready. This has to happens in a loop to
// handle spurious wakeups.
</span><span class="kw">loop </span>{
poll.poll(<span class="kw-2">&amp;mut </span>events, <span class="prelude-val">None</span>)<span class="question-mark">?</span>;
<span class="kw">for </span>event <span class="kw">in </span><span class="kw-2">&amp;</span>events {
<span class="kw">if </span>event.token() == Token(<span class="number">0</span>) &amp;&amp; event.is_writable() {
<span class="comment">// The socket connected (probably, it could still be a spurious
// wakeup)
</span><span class="kw">return </span><span class="prelude-val">Ok</span>(());
}
}
}</code></pre></div>
</div></details></div></details></div><h2 id="trait-implementations" class="small-section-header">Trait Implementations<a href="#trait-implementations" class="anchor"></a></h2><div id="trait-implementations-list"><details class="rustdoc-toggle implementors-toggle" open><summary><section id="impl-AsRawFd-for-Poll" class="impl has-srclink"><a class="srclink rightside" href="../src/mio/poll.rs.html#415-419">source</a><a href="#impl-AsRawFd-for-Poll" class="anchor"></a><h3 class="code-header">impl <a class="trait" href="https://doc.rust-lang.org/nightly/std/os/fd/raw/trait.AsRawFd.html" title="trait std::os::fd::raw::AsRawFd">AsRawFd</a> for <a class="struct" href="struct.Poll.html" title="struct mio::Poll">Poll</a></h3></section></summary><div class="impl-items"><details class="rustdoc-toggle method-toggle" open><summary><section id="method.as_raw_fd" class="method trait-impl has-srclink"><a class="srclink rightside" href="../src/mio/poll.rs.html#416-418">source</a><a href="#method.as_raw_fd" class="anchor"></a><h4 class="code-header">fn <a href="https://doc.rust-lang.org/nightly/std/os/fd/raw/trait.AsRawFd.html#tymethod.as_raw_fd" class="fnname">as_raw_fd</a>(&amp;self) -&gt; <a class="type" href="https://doc.rust-lang.org/nightly/std/os/fd/raw/type.RawFd.html" title="type std::os::fd::raw::RawFd">RawFd</a></h4></section></summary><div class='docblock'>Extracts the raw file descriptor. <a href="https://doc.rust-lang.org/nightly/std/os/fd/raw/trait.AsRawFd.html#tymethod.as_raw_fd">Read more</a></div></details></div></details><details class="rustdoc-toggle implementors-toggle" open><summary><section id="impl-Debug-for-Poll" class="impl has-srclink"><a class="srclink rightside" href="../src/mio/poll.rs.html#421-425">source</a><a href="#impl-Debug-for-Poll" class="anchor"></a><h3 class="code-header">impl <a class="trait" href="https://doc.rust-lang.org/nightly/core/fmt/trait.Debug.html" title="trait core::fmt::Debug">Debug</a> for <a class="struct" href="struct.Poll.html" title="struct mio::Poll">Poll</a></h3></section></summary><div class="impl-items"><details class="rustdoc-toggle method-toggle" open><summary><section id="method.fmt" class="method trait-impl has-srclink"><a class="srclink rightside" href="../src/mio/poll.rs.html#422-424">source</a><a href="#method.fmt" class="anchor"></a><h4 class="code-header">fn <a href="https://doc.rust-lang.org/nightly/core/fmt/trait.Debug.html#tymethod.fmt" class="fnname">fmt</a>(&amp;self, fmt: &amp;mut <a class="struct" href="https://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html" title="struct core::fmt::Formatter">Formatter</a>&lt;'_&gt;) -&gt; <a class="type" href="https://doc.rust-lang.org/nightly/core/fmt/type.Result.html" title="type core::fmt::Result">Result</a></h4></section></summary><div class='docblock'>Formats the value using the given formatter. <a href="https://doc.rust-lang.org/nightly/core/fmt/trait.Debug.html#tymethod.fmt">Read more</a></div></details></div></details></div><h2 id="synthetic-implementations" class="small-section-header">Auto Trait Implementations<a href="#synthetic-implementations" class="anchor"></a></h2><div id="synthetic-implementations-list"><section id="impl-RefUnwindSafe-for-Poll" class="impl has-srclink"><a href="#impl-RefUnwindSafe-for-Poll" class="anchor"></a><h3 class="code-header">impl <a class="trait" href="https://doc.rust-lang.org/nightly/core/panic/unwind_safe/trait.RefUnwindSafe.html" title="trait core::panic::unwind_safe::RefUnwindSafe">RefUnwindSafe</a> for <a class="struct" href="struct.Poll.html" title="struct mio::Poll">Poll</a></h3></section><section id="impl-Send-for-Poll" class="impl has-srclink"><a href="#impl-Send-for-Poll" class="anchor"></a><h3 class="code-header">impl <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Send.html" title="trait core::marker::Send">Send</a> for <a class="struct" href="struct.Poll.html" title="struct mio::Poll">Poll</a></h3></section><section id="impl-Sync-for-Poll" class="impl has-srclink"><a href="#impl-Sync-for-Poll" class="anchor"></a><h3 class="code-header">impl <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sync.html" title="trait core::marker::Sync">Sync</a> for <a class="struct" href="struct.Poll.html" title="struct mio::Poll">Poll</a></h3></section><section id="impl-Unpin-for-Poll" class="impl has-srclink"><a href="#impl-Unpin-for-Poll" class="anchor"></a><h3 class="code-header">impl <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html" title="trait core::marker::Unpin">Unpin</a> for <a class="struct" href="struct.Poll.html" title="struct mio::Poll">Poll</a></h3></section><section id="impl-UnwindSafe-for-Poll" class="impl has-srclink"><a href="#impl-UnwindSafe-for-Poll" class="anchor"></a><h3 class="code-header">impl <a class="trait" href="https://doc.rust-lang.org/nightly/core/panic/unwind_safe/trait.UnwindSafe.html" title="trait core::panic::unwind_safe::UnwindSafe">UnwindSafe</a> for <a class="struct" href="struct.Poll.html" title="struct mio::Poll">Poll</a></h3></section></div><h2 id="blanket-implementations" class="small-section-header">Blanket Implementations<a href="#blanket-implementations" class="anchor"></a></h2><div id="blanket-implementations-list"><details class="rustdoc-toggle implementors-toggle"><summary><section id="impl-Any-for-Poll" class="impl has-srclink"><a class="srclink rightside" href="https://doc.rust-lang.org/nightly/src/core/any.rs.html#200">source</a><a href="#impl-Any-for-Poll" class="anchor"></a><h3 class="code-header">impl&lt;T&gt; <a class="trait" href="https://doc.rust-lang.org/nightly/core/any/trait.Any.html" title="trait core::any::Any">Any</a> for T<span class="where fmt-newline">where<br>&nbsp;&nbsp;&nbsp;&nbsp;T: 'static + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</span></h3></section></summary><div class="impl-items"><details class="rustdoc-toggle method-toggle" open><summary><section id="method.type_id" class="method trait-impl has-srclink"><a class="srclink rightside" href="https://doc.rust-lang.org/nightly/src/core/any.rs.html#201">source</a><a href="#method.type_id" class="anchor"></a><h4 class="code-header">fn <a href="https://doc.rust-lang.org/nightly/core/any/trait.Any.html#tymethod.type_id" class="fnname">type_id</a>(&amp;self) -&gt; <a class="struct" href="https://doc.rust-lang.org/nightly/core/any/struct.TypeId.html" title="struct core::any::TypeId">TypeId</a></h4></section></summary><div class='docblock'>Gets the <code>TypeId</code> of <code>self</code>. <a href="https://doc.rust-lang.org/nightly/core/any/trait.Any.html#tymethod.type_id">Read more</a></div></details></div></details><details class="rustdoc-toggle implementors-toggle"><summary><section id="impl-Borrow%3CT%3E-for-Poll" class="impl has-srclink"><a class="srclink rightside" href="https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#211">source</a><a href="#impl-Borrow%3CT%3E-for-Poll" class="anchor"></a><h3 class="code-header">impl&lt;T&gt; <a class="trait" href="https://doc.rust-lang.org/nightly/core/borrow/trait.Borrow.html" title="trait core::borrow::Borrow">Borrow</a>&lt;T&gt; for T<span class="where fmt-newline">where<br>&nbsp;&nbsp;&nbsp;&nbsp;T: ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</span></h3></section></summary><div class="impl-items"><details class="rustdoc-toggle method-toggle" open><summary><section id="method.borrow" class="method trait-impl has-srclink"><span class="rightside"><span class="since" title="const unstable">const: <a href="https://github.com/rust-lang/rust/issues/91522" title="Tracking issue for const_borrow">unstable</a></span> · <a class="srclink" href="https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#213">source</a></span><a href="#method.borrow" class="anchor"></a><h4 class="code-header">fn <a href="https://doc.rust-lang.org/nightly/core/borrow/trait.Borrow.html#tymethod.borrow" class="fnname">borrow</a>(&amp;self) -&gt; <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.reference.html">&amp;</a>T</h4></section></summary><div class='docblock'>Immutably borrows from an owned value. <a href="https://doc.rust-lang.org/nightly/core/borrow/trait.Borrow.html#tymethod.borrow">Read more</a></div></details></div></details><details class="rustdoc-toggle implementors-toggle"><summary><section id="impl-BorrowMut%3CT%3E-for-Poll" class="impl has-srclink"><a class="srclink rightside" href="https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#220">source</a><a href="#impl-BorrowMut%3CT%3E-for-Poll" class="anchor"></a><h3 class="code-header">impl&lt;T&gt; <a class="trait" href="https://doc.rust-lang.org/nightly/core/borrow/trait.BorrowMut.html" title="trait core::borrow::BorrowMut">BorrowMut</a>&lt;T&gt; for T<span class="where fmt-newline">where<br>&nbsp;&nbsp;&nbsp;&nbsp;T: ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</span></h3></section></summary><div class="impl-items"><details class="rustdoc-toggle method-toggle" open><summary><section id="method.borrow_mut" class="method trait-impl has-srclink"><span class="rightside"><span class="since" title="const unstable">const: <a href="https://github.com/rust-lang/rust/issues/91522" title="Tracking issue for const_borrow">unstable</a></span> · <a class="srclink" href="https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#221">source</a></span><a href="#method.borrow_mut" class="anchor"></a><h4 class="code-header">fn <a href="https://doc.rust-lang.org/nightly/core/borrow/trait.BorrowMut.html#tymethod.borrow_mut" class="fnname">borrow_mut</a>(&amp;mut self) -&gt; <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.reference.html">&amp;mut </a>T</h4></section></summary><div class='docblock'>Mutably borrows from an owned value. <a href="https://doc.rust-lang.org/nightly/core/borrow/trait.BorrowMut.html#tymethod.borrow_mut">Read more</a></div></details></div></details><details class="rustdoc-toggle implementors-toggle"><summary><section id="impl-From%3CT%3E-for-Poll" class="impl has-srclink"><a class="srclink rightside" href="https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#733">source</a><a href="#impl-From%3CT%3E-for-Poll" class="anchor"></a><h3 class="code-header">impl&lt;T&gt; <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.From.html" title="trait core::convert::From">From</a>&lt;T&gt; for T</h3></section></summary><div class="impl-items"><details class="rustdoc-toggle method-toggle" open><summary><section id="method.from" class="method trait-impl has-srclink"><span class="rightside"><span class="since" title="const unstable">const: <a href="https://github.com/rust-lang/rust/issues/88674" title="Tracking issue for const_convert">unstable</a></span> · <a class="srclink" href="https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#736">source</a></span><a href="#method.from" class="anchor"></a><h4 class="code-header">fn <a href="https://doc.rust-lang.org/nightly/core/convert/trait.From.html#tymethod.from" class="fnname">from</a>(t: T) -&gt; T</h4></section></summary><div class="docblock"><p>Returns the argument unchanged.</p>
</div></details></div></details><details class="rustdoc-toggle implementors-toggle"><summary><section id="impl-Into%3CU%3E-for-Poll" class="impl has-srclink"><a class="srclink rightside" href="https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#717">source</a><a href="#impl-Into%3CU%3E-for-Poll" class="anchor"></a><h3 class="code-header">impl&lt;T, U&gt; <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.Into.html" title="trait core::convert::Into">Into</a>&lt;U&gt; for T<span class="where fmt-newline">where<br>&nbsp;&nbsp;&nbsp;&nbsp;U: <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.From.html" title="trait core::convert::From">From</a>&lt;T&gt;,</span></h3></section></summary><div class="impl-items"><details class="rustdoc-toggle method-toggle" open><summary><section id="method.into" class="method trait-impl has-srclink"><span class="rightside"><span class="since" title="const unstable">const: <a href="https://github.com/rust-lang/rust/issues/88674" title="Tracking issue for const_convert">unstable</a></span> · <a class="srclink" href="https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#725">source</a></span><a href="#method.into" class="anchor"></a><h4 class="code-header">fn <a href="https://doc.rust-lang.org/nightly/core/convert/trait.Into.html#tymethod.into" class="fnname">into</a>(self) -&gt; U</h4></section></summary><div class="docblock"><p>Calls <code>U::from(self)</code>.</p>
<p>That is, this conversion is whatever the implementation of
<code><a href="https://doc.rust-lang.org/nightly/core/convert/trait.From.html" title="From">From</a>&lt;T&gt; for U</code> chooses to do.</p>
</div></details></div></details><details class="rustdoc-toggle implementors-toggle"><summary><section id="impl-TryFrom%3CU%3E-for-Poll" class="impl has-srclink"><a class="srclink rightside" href="https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#775">source</a><a href="#impl-TryFrom%3CU%3E-for-Poll" class="anchor"></a><h3 class="code-header">impl&lt;T, U&gt; <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html" title="trait core::convert::TryFrom">TryFrom</a>&lt;U&gt; for T<span class="where fmt-newline">where<br>&nbsp;&nbsp;&nbsp;&nbsp;U: <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.Into.html" title="trait core::convert::Into">Into</a>&lt;T&gt;,</span></h3></section></summary><div class="impl-items"><details class="rustdoc-toggle" open><summary><section id="associatedtype.Error-1" class="associatedtype trait-impl has-srclink"><a href="#associatedtype.Error-1" class="anchor"></a><h4 class="code-header">type <a href="https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html#associatedtype.Error" class="associatedtype">Error</a> = <a class="enum" href="https://doc.rust-lang.org/nightly/core/convert/enum.Infallible.html" title="enum core::convert::Infallible">Infallible</a></h4></section></summary><div class='docblock'>The type returned in the event of a conversion error.</div></details><details class="rustdoc-toggle method-toggle" open><summary><section id="method.try_from" class="method trait-impl has-srclink"><span class="rightside"><span class="since" title="const unstable">const: <a href="https://github.com/rust-lang/rust/issues/88674" title="Tracking issue for const_convert">unstable</a></span> · <a class="srclink" href="https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#781">source</a></span><a href="#method.try_from" class="anchor"></a><h4 class="code-header">fn <a href="https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html#tymethod.try_from" class="fnname">try_from</a>(value: U) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/result/enum.Result.html" title="enum core::result::Result">Result</a>&lt;T, &lt;T as <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html" title="trait core::convert::TryFrom">TryFrom</a>&lt;U&gt;&gt;::<a class="associatedtype" href="https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html#associatedtype.Error" title="type core::convert::TryFrom::Error">Error</a>&gt;</h4></section></summary><div class='docblock'>Performs the conversion.</div></details></div></details><details class="rustdoc-toggle implementors-toggle"><summary><section id="impl-TryInto%3CU%3E-for-Poll" class="impl has-srclink"><a class="srclink rightside" href="https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#760">source</a><a href="#impl-TryInto%3CU%3E-for-Poll" class="anchor"></a><h3 class="code-header">impl&lt;T, U&gt; <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.TryInto.html" title="trait core::convert::TryInto">TryInto</a>&lt;U&gt; for T<span class="where fmt-newline">where<br>&nbsp;&nbsp;&nbsp;&nbsp;U: <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html" title="trait core::convert::TryFrom">TryFrom</a>&lt;T&gt;,</span></h3></section></summary><div class="impl-items"><details class="rustdoc-toggle" open><summary><section id="associatedtype.Error" class="associatedtype trait-impl has-srclink"><a href="#associatedtype.Error" class="anchor"></a><h4 class="code-header">type <a href="https://doc.rust-lang.org/nightly/core/convert/trait.TryInto.html#associatedtype.Error" class="associatedtype">Error</a> = &lt;U as <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html" title="trait core::convert::TryFrom">TryFrom</a>&lt;T&gt;&gt;::<a class="associatedtype" href="https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html#associatedtype.Error" title="type core::convert::TryFrom::Error">Error</a></h4></section></summary><div class='docblock'>The type returned in the event of a conversion error.</div></details><details class="rustdoc-toggle method-toggle" open><summary><section id="method.try_into" class="method trait-impl has-srclink"><span class="rightside"><span class="since" title="const unstable">const: <a href="https://github.com/rust-lang/rust/issues/88674" title="Tracking issue for const_convert">unstable</a></span> · <a class="srclink" href="https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#766">source</a></span><a href="#method.try_into" class="anchor"></a><h4 class="code-header">fn <a href="https://doc.rust-lang.org/nightly/core/convert/trait.TryInto.html#tymethod.try_into" class="fnname">try_into</a>(self) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/result/enum.Result.html" title="enum core::result::Result">Result</a>&lt;U, &lt;U as <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html" title="trait core::convert::TryFrom">TryFrom</a>&lt;T&gt;&gt;::<a class="associatedtype" href="https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html#associatedtype.Error" title="type core::convert::TryFrom::Error">Error</a>&gt;</h4></section></summary><div class='docblock'>Performs the conversion.</div></details></div></details></div></section></div></main><div id="rustdoc-vars" data-root-path="../" data-current-crate="mio" data-themes="ayu,dark,light" data-resource-suffix="" data-rustdoc-version="1.66.0-nightly (5c8bff74b 2022-10-21)" ></div></body></html>