changed example
This commit is contained in:
@@ -160,16 +160,9 @@ run it yourself. Have fun!</p>
|
||||
|
||||
fn main() {
|
||||
let start = Instant::now();
|
||||
|
||||
// Many runtimes create a glocal `reactor` we pass it as an argument
|
||||
let reactor = Reactor::new();
|
||||
let reactor = Arc::new(Mutex::new(reactor));
|
||||
|
||||
let future1 = Task::new(reactor.clone(), 1, 1);
|
||||
|
||||
|
||||
|
||||
|
||||
let future1 = Task::new(reactor.clone(), 1, 1);
|
||||
let future2 = Task::new(reactor.clone(), 2, 2);
|
||||
|
||||
let fut1 = async {
|
||||
@@ -185,15 +178,17 @@ fn main() {
|
||||
};
|
||||
|
||||
let mainfut = async {
|
||||
fut1.await;
|
||||
fut2.await;
|
||||
let handle1 = spawn(fut1);
|
||||
let handle2 = spawn(fut2);
|
||||
handle1.await;
|
||||
handle2.await;
|
||||
};
|
||||
|
||||
block_on(mainfut);
|
||||
reactor.lock().map(|mut r| r.close()).unwrap();
|
||||
}
|
||||
|
||||
//// ============================ EXECUTOR ====================================
|
||||
//// ===== EXECUTOR =====
|
||||
fn block_on<F: Future>(mut future: F) -> F::Output {
|
||||
let mywaker = Arc::new(MyWaker{ thread: thread::current() });
|
||||
let waker = waker_into_waker(Arc::into_raw(mywaker));
|
||||
@@ -208,7 +203,16 @@ fn block_on<F: Future>(mut future: F) -> F::Output {
|
||||
val
|
||||
}
|
||||
|
||||
// ====================== FUTURE IMPLEMENTATION ==============================
|
||||
fn spawn<F: Future>(future: F) -> Pin<Box<F>> {
|
||||
let mywaker = Arc::new(MyWaker{ thread: thread::current() });
|
||||
let waker = waker_into_waker(Arc::into_raw(mywaker));
|
||||
let mut cx = Context::from_waker(&waker);
|
||||
let mut boxed = Box::pin(future);
|
||||
let _ = Future::poll(boxed.as_mut(), &mut cx);
|
||||
boxed
|
||||
}
|
||||
|
||||
// ===== FUTURE IMPLEMENTATION =====
|
||||
#[derive(Clone)]
|
||||
struct MyWaker {
|
||||
thread: thread::Thread,
|
||||
@@ -276,7 +280,7 @@ impl Future for Task {
|
||||
}
|
||||
}
|
||||
|
||||
// =============================== REACTOR ===================================
|
||||
// ===== REACTOR =====
|
||||
struct Reactor {
|
||||
dispatcher: Sender<Event>,
|
||||
handle: Option<JoinHandle<()>>,
|
||||
@@ -297,6 +301,7 @@ impl Reactor {
|
||||
let handle = thread::spawn(move || {
|
||||
// This simulates some I/O resource
|
||||
for event in rx {
|
||||
println!("GOT EVENT: {:?}", event);
|
||||
let rl_clone = rl_clone.clone();
|
||||
match event {
|
||||
Event::Close => break,
|
||||
|
||||
Reference in New Issue
Block a user