changed example

This commit is contained in:
cfsamson
2020-02-05 10:11:21 +01:00
parent 1ea3056b5c
commit 6dd174c9e1
7 changed files with 603 additions and 157 deletions

View File

@@ -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&lt;F: Future&gt;(mut future: F) -&gt; 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&lt;F: Future&gt;(mut future: F) -&gt; F::Output {
val
}
// ====================== FUTURE IMPLEMENTATION ==============================
fn spawn&lt;F: Future&gt;(future: F) -&gt; Pin&lt;Box&lt;F&gt;&gt; {
let mywaker = Arc::new(MyWaker{ thread: thread::current() });
let waker = waker_into_waker(Arc::into_raw(mywaker));
let mut cx = Context::from_waker(&amp;waker);
let mut boxed = Box::pin(future);
let _ = Future::poll(boxed.as_mut(), &amp;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&lt;Event&gt;,
handle: Option&lt;JoinHandle&lt;()&gt;&gt;,
@@ -297,6 +301,7 @@ impl Reactor {
let handle = thread::spawn(move || {
// This simulates some I/O resource
for event in rx {
println!(&quot;GOT EVENT: {:?}&quot;, event);
let rl_clone = rl_clone.clone();
match event {
Event::Close =&gt; break,