mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-21 17:25:36 +00:00
aa65723136
--HG-- rename : third_party/rust/crossbeam-deque/.cargo-checksum.json => third_party/rust/crossbeam-deque-0.2.0/.cargo-checksum.json rename : third_party/rust/crossbeam-deque/.travis.yml => third_party/rust/crossbeam-deque-0.2.0/.travis.yml rename : third_party/rust/crossbeam-deque/CHANGELOG.md => third_party/rust/crossbeam-deque-0.2.0/CHANGELOG.md rename : third_party/rust/crossbeam-deque/Cargo.toml => third_party/rust/crossbeam-deque-0.2.0/Cargo.toml rename : third_party/rust/bitflags-0.7.0/LICENSE-APACHE => third_party/rust/crossbeam-deque-0.2.0/LICENSE-APACHE rename : third_party/rust/crossbeam-deque/README.md => third_party/rust/crossbeam-deque-0.2.0/README.md rename : third_party/rust/crossbeam-deque/src/lib.rs => third_party/rust/crossbeam-deque-0.2.0/src/lib.rs rename : third_party/rust/crossbeam-epoch/.cargo-checksum.json => third_party/rust/crossbeam-epoch-0.3.1/.cargo-checksum.json rename : third_party/rust/crossbeam-epoch/.travis.yml => third_party/rust/crossbeam-epoch-0.3.1/.travis.yml rename : third_party/rust/crossbeam-epoch/CHANGELOG.md => third_party/rust/crossbeam-epoch-0.3.1/CHANGELOG.md rename : third_party/rust/crossbeam-epoch/Cargo.toml => third_party/rust/crossbeam-epoch-0.3.1/Cargo.toml rename : third_party/rust/tokio-io/LICENSE-APACHE => third_party/rust/crossbeam-epoch-0.3.1/LICENSE-APACHE rename : third_party/rust/crossbeam-epoch/README.md => third_party/rust/crossbeam-epoch-0.3.1/README.md rename : third_party/rust/crossbeam-epoch/examples/sanitize.rs => third_party/rust/crossbeam-epoch-0.3.1/examples/sanitize.rs rename : third_party/rust/crossbeam-epoch/src/atomic.rs => third_party/rust/crossbeam-epoch-0.3.1/src/atomic.rs rename : third_party/rust/crossbeam-epoch/src/collector.rs => third_party/rust/crossbeam-epoch-0.3.1/src/collector.rs rename : third_party/rust/crossbeam-epoch/src/default.rs => third_party/rust/crossbeam-epoch-0.3.1/src/default.rs rename : third_party/rust/crossbeam-epoch/src/deferred.rs => third_party/rust/crossbeam-epoch-0.3.1/src/deferred.rs rename : third_party/rust/crossbeam-epoch/src/epoch.rs => third_party/rust/crossbeam-epoch-0.3.1/src/epoch.rs rename : third_party/rust/crossbeam-epoch/src/garbage.rs => third_party/rust/crossbeam-epoch-0.3.1/src/garbage.rs rename : third_party/rust/crossbeam-epoch/src/guard.rs => third_party/rust/crossbeam-epoch-0.3.1/src/guard.rs rename : third_party/rust/crossbeam-epoch/src/internal.rs => third_party/rust/crossbeam-epoch-0.3.1/src/internal.rs rename : third_party/rust/crossbeam-epoch/src/lib.rs => third_party/rust/crossbeam-epoch-0.3.1/src/lib.rs rename : third_party/rust/crossbeam-epoch/src/sync/list.rs => third_party/rust/crossbeam-epoch-0.3.1/src/sync/list.rs rename : third_party/rust/crossbeam-epoch/src/sync/queue.rs => third_party/rust/crossbeam-epoch-0.3.1/src/sync/queue.rs rename : third_party/rust/crossbeam-utils/.cargo-checksum.json => third_party/rust/crossbeam-utils-0.2.2/.cargo-checksum.json rename : third_party/rust/crossbeam-utils/CHANGELOG.md => third_party/rust/crossbeam-utils-0.2.2/CHANGELOG.md rename : third_party/rust/crossbeam-utils/Cargo.toml => third_party/rust/crossbeam-utils-0.2.2/Cargo.toml rename : third_party/rust/bitflags-0.7.0/LICENSE-APACHE => third_party/rust/crossbeam-utils-0.2.2/LICENSE-APACHE rename : third_party/rust/crossbeam-utils/src/atomic_option.rs => third_party/rust/crossbeam-utils-0.2.2/src/atomic_option.rs rename : third_party/rust/crossbeam-utils/src/lib.rs => third_party/rust/crossbeam-utils-0.2.2/src/lib.rs rename : third_party/rust/crossbeam-utils/src/scoped.rs => third_party/rust/crossbeam-utils-0.2.2/src/scoped.rs rename : third_party/rust/bitflags-0.7.0/LICENSE-APACHE => third_party/rust/indexmap/LICENSE-APACHE rename : third_party/rust/lazycell/.cargo-checksum.json => third_party/rust/lazycell-0.4.0/.cargo-checksum.json rename : third_party/rust/lazycell/CHANGELOG.md => third_party/rust/lazycell-0.4.0/CHANGELOG.md rename : third_party/rust/lazycell/Cargo.toml => third_party/rust/lazycell-0.4.0/Cargo.toml rename : third_party/rust/bitflags-0.7.0/LICENSE-APACHE => third_party/rust/lazycell-0.4.0/LICENSE-APACHE rename : third_party/rust/lazycell/LICENSE-MIT => third_party/rust/lazycell-0.4.0/LICENSE-MIT rename : third_party/rust/lazycell/README.md => third_party/rust/lazycell-0.4.0/README.md rename : third_party/rust/lazycell/src/lib.rs => third_party/rust/lazycell-0.4.0/src/lib.rs rename : third_party/rust/bitflags-0.7.0/LICENSE-APACHE => third_party/rust/rand-0.3.22/LICENSE-APACHE rename : third_party/rust/bitflags-0.7.0/LICENSE-MIT => third_party/rust/rand-0.3.22/LICENSE-MIT rename : third_party/rust/rand/appveyor.yml => third_party/rust/rand-0.3.22/appveyor.yml rename : third_party/rust/slab/.cargo-checksum.json => third_party/rust/slab-0.3.0/.cargo-checksum.json rename : third_party/rust/slab/Cargo.toml => third_party/rust/slab-0.3.0/Cargo.toml rename : third_party/rust/slab/README.md => third_party/rust/slab-0.3.0/README.md rename : third_party/rust/slab/src/lib.rs => third_party/rust/slab-0.3.0/src/lib.rs rename : third_party/rust/tokio-io/src/read_to_end.rs => third_party/rust/tokio-io/src/io/read_to_end.rs rename : third_party/rust/tokio-io/src/read_until.rs => third_party/rust/tokio-io/src/io/read_until.rs
86 lines
4.0 KiB
Rust
86 lines
4.0 KiB
Rust
//! An example how to manually assemble a runtime and run some tasks on it.
|
|
//!
|
|
//! This is closer to the single-threaded runtime than the default tokio one, as it is simpler to
|
|
//! grasp. There are conceptually similar, but the multi-threaded one would be more code. If you
|
|
//! just want to *use* a single-threaded runtime, use the one provided by tokio directly
|
|
//! (`tokio::runtime::current_thread::Runtime::new()`. This is a demonstration only.
|
|
//!
|
|
//! Note that the error handling is a bit left out. Also, the `run` could be modified to return the
|
|
//! result of the provided future.
|
|
|
|
extern crate futures;
|
|
extern crate tokio;
|
|
extern crate tokio_executor;
|
|
extern crate tokio_reactor;
|
|
extern crate tokio_timer;
|
|
|
|
use std::io::Error as IoError;
|
|
use std::time::{Duration, Instant};
|
|
|
|
use futures::{future, Future};
|
|
use tokio::executor::current_thread::{self, CurrentThread};
|
|
use tokio_reactor::Reactor;
|
|
use tokio_timer::timer::{self, Timer};
|
|
|
|
/// Creates a „runtime“.
|
|
///
|
|
/// This is similar to running `tokio::runtime::current_thread::Runtime::new()`.
|
|
fn run<F: Future<Item = (), Error = ()>>(f: F) -> Result<(), IoError> {
|
|
// We need a reactor to receive events about IO objects from kernel
|
|
let reactor = Reactor::new()?;
|
|
let reactor_handle = reactor.handle();
|
|
// Place a timer wheel on top of the reactor. If there are no timeouts to fire, it'll let the
|
|
// reactor pick up some new external events.
|
|
let timer = Timer::new(reactor);
|
|
let timer_handle = timer.handle();
|
|
// And now put a single-threaded executor on top of the timer. When there are no futures ready
|
|
// to do something, it'll let the timer or the reactor generate some new stimuli for the
|
|
// futures to continue in their life.
|
|
let mut executor = CurrentThread::new_with_park(timer);
|
|
// Binds an executor to this thread
|
|
let mut enter = tokio_executor::enter().expect("Multiple executors at once");
|
|
// This will set the default handle and timer to use inside the closure and run the future.
|
|
tokio_reactor::with_default(&reactor_handle, &mut enter, |enter| {
|
|
timer::with_default(&timer_handle, enter, |enter| {
|
|
// The TaskExecutor is a fake executor that looks into the current single-threaded
|
|
// executor when used. This is a trick, because we need two mutable references to the
|
|
// executor (one to run the provided future, another to install as the default one). We
|
|
// use the fake one here as the default one.
|
|
let mut default_executor = current_thread::TaskExecutor::current();
|
|
tokio_executor::with_default(&mut default_executor, enter, |enter| {
|
|
let mut executor = executor.enter(enter);
|
|
// Run the provided future
|
|
executor.block_on(f).unwrap();
|
|
// Run all the other futures that are still left in the executor
|
|
executor.run().unwrap();
|
|
});
|
|
});
|
|
});
|
|
Ok(())
|
|
}
|
|
|
|
fn main() {
|
|
run(future::lazy(|| {
|
|
// Here comes the application logic. It can spawn further tasks by current_thread::spawn().
|
|
// It also can use the default reactor and create timeouts.
|
|
|
|
// Connect somewhere. And then do nothing with it. Yes, useless.
|
|
//
|
|
// This will use the default reactor which runs in the current thread.
|
|
let connect = tokio::net::TcpStream::connect(&"127.0.0.1:53".parse().unwrap())
|
|
.map(|_| println!("Connected"))
|
|
.map_err(|e| println!("Failed to connect: {}", e));
|
|
// We can spawn it without requiring Send. This would panic if we run it outside of the
|
|
// `run` (or outside of anything else)
|
|
current_thread::spawn(connect);
|
|
|
|
// We can also create timeouts.
|
|
let deadline = tokio::timer::Delay::new(Instant::now() + Duration::from_secs(5))
|
|
.map(|()| println!("5 seconds are over"))
|
|
.map_err(|e| println!("Failed to wait: {}", e));
|
|
// We can spawn on the default executor, which is also the local one.
|
|
tokio::executor::spawn(deadline);
|
|
Ok(())
|
|
})).unwrap();
|
|
}
|