mirror of
https://github.com/tokio-rs/tokio.git
synced 2026-08-23 00:00:10 +02:00
I/O resources lazily bind to reactor. (#160)
This patch makes a significant change to how I/O resources bind to a reactor. Currently, an I/O resource (TCP, UDP, PollEvented) will bind itself with a reactor upon creation. First, some history. Originally, tokio-core required that I/O resources be explicitly associated with a reactor upon creation by passing in a `&Handle`. Tokio reform introduced a default reactor. If I/O resources do not specify a reactor upon creation, then the default reactor is used. However, futures tend to favor being lazy. Creating a future should do no work, instead it is defining a computation to be performed once the future is executed. Binding an I/O resource with a reactor on creation goes against this pattern. This patch fixes this by allowing I/O resources to lazily bind to a reactor. An explicit `&Handle` can still be used on creation, but if no reactor is specified, then the default reactor is used. However, this binding happens during execution time (read / write) and not creation.
This commit is contained in:
@@ -4,9 +4,10 @@ use std::sync::Arc;
|
||||
use std::sync::atomic::AtomicUsize;
|
||||
use std::sync::atomic::Ordering::SeqCst;
|
||||
|
||||
use atomic_task::AtomicTask;
|
||||
|
||||
use reactor::{Reactor, Handle};
|
||||
use futures::{Future, Async, Poll};
|
||||
use futures::task::AtomicTask;
|
||||
|
||||
/// Handle to the reactor running on a background thread.
|
||||
#[derive(Debug)]
|
||||
@@ -117,6 +118,8 @@ impl Drop for Background {
|
||||
None => return,
|
||||
};
|
||||
|
||||
inner.shutdown_now();
|
||||
|
||||
let shutdown = Shutdown { inner };
|
||||
let _ = shutdown.wait();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user