polachok / fahrenheit

toy futures executor 🚒📖🔥
Other
233 stars 23 forks source link

panicked again at 'already borrowed: BorrowMutError' #12

Closed laizy closed 6 years ago

laizy commented 6 years ago

code

#![feature(futures_api,async_await,await_macro, pin, arbitrary_self_types)]
extern crate futures;
extern crate fahrenheit;

use futures::stream::{StreamExt};
use futures::channel::mpsc;
use futures::future::Future;
use futures::task::Poll;
use futures::task::Context;
use std::pin::PinMut;

async fn comsumer(mut rx:mpsc::UnboundedReceiver<i32>) {
    while let Some(v) = await!(rx.next()) {
        println!("recieved {}", v);
    }
}

fn main() {
    let (tx, rx) = mpsc::unbounded();

    let prod = Producer {chan:tx, index:0};
    fahrenheit::spawn(prod);
    fahrenheit::run(comsumer(rx))
}

struct Producer {
    chan : mpsc::UnboundedSender<i32>,
    index : i32,
}

impl Future for Producer {
    type Output = ();

    fn poll(mut self : PinMut<Self>, cx: & mut Context) -> Poll<Self::Output> {
        self.chan.unbounded_send(self.index).unwrap();
        self.index += 1;
        if self.index == 1000 {
            Poll::Ready(())
        } else {
            cx.waker().wake();
            Poll::Pending
        }
    }
}

stack backtrace:

   0: std::sys::unix::backtrace::tracing::imp::unwind_backtrace
             at libstd/sys/unix/backtrace/tracing/gcc_s.rs:49
   1: std::sys_common::backtrace::print
             at libstd/sys_common/backtrace.rs:71
             at libstd/sys_common/backtrace.rs:59
   2: std::panicking::default_hook::{{closure}}
             at libstd/panicking.rs:211
   3: std::panicking::default_hook
             at libstd/panicking.rs:227
   4: std::panicking::rust_panic_with_hook
             at libstd/panicking.rs:477
   5: std::panicking::continue_panic_fmt
             at libstd/panicking.rs:391
   6: rust_begin_unwind
             at libstd/panicking.rs:326
   7: core::panicking::panic_fmt
             at libcore/panicking.rs:77
   8: core::result::unwrap_failed
             at /checkout/src/libcore/macros.rs:26
   9: <core::result::Result<T, E>>::expect
             at /checkout/src/libcore/result.rs:809
  10: <core::cell::RefCell<T>>::borrow_mut
             at /checkout/src/libcore/cell.rs:885
  11: fahrenheit::EventLoop::wake
             at src/lib.rs:157
  12: <fahrenheit::Token as alloc::task::if_arc::Wake>::wake::{{closure}}
             at src/lib.rs:63
  13: <std::thread::local::LocalKey<T>>::try_with
             at /checkout/src/libstd/thread/local.rs:294
  14: <std::thread::local::LocalKey<T>>::with
             at /checkout/src/libstd/thread/local.rs:248
  15: <fahrenheit::Token as alloc::task::if_arc::Wake>::wake
             at src/lib.rs:58
  16: <alloc::task::if_arc::ArcWrapped<T> as core::task::wake::UnsafeWake>::wake
             at /checkout/src/liballoc/task.rs:71
  17: core::task::wake::Waker::wake
             at /checkout/src/libcore/task/wake.rs:51
  18: <futures_channel::mpsc::Sender<T>>::signal
             at /mnt/f/.cargo/git/checkouts/futures-rs-4ca77cb4f4f05ac4/1baf8a0/futures-channel/src/mpsc/mod.rs:615
  19: <futures_channel::mpsc::Sender<T>>::queue_push_and_signal
             at /mnt/f/.cargo/git/checkouts/futures-rs-4ca77cb4f4f05ac4/1baf8a0/futures-channel/src/mpsc/mod.rs:544
  20: <futures_channel::mpsc::Sender<T>>::do_send_nb
             at /mnt/f/.cargo/git/checkouts/futures-rs-4ca77cb4f4f05ac4/1baf8a0/futures-channel/src/mpsc/mod.rs:520
  21: <futures_channel::mpsc::UnboundedSender<T>>::unbounded_send
             at /mnt/f/.cargo/git/checkouts/futures-rs-4ca77cb4f4f05ac4/1baf8a0/futures-channel/src/mpsc/mod.rs:745
  22: <haha::Producer as core::future::future::Future>::poll
             at examples/haha.rs:36
  23: <alloc::boxed::Box<F> as core::future::future_obj::UnsafeFutureObj<'a, T>>::poll
             at /checkout/src/liballoc/boxed.rs:783
  24: <core::future::future_obj::LocalFutureObj<'a, T> as core::future::future::Future>::poll
             at /checkout/src/libcore/future/future_obj.rs:83
  25: <core::future::future_obj::FutureObj<'a, T> as core::future::future::Future>::poll
             at /checkout/src/libcore/future/future_obj.rs:133
  26: fahrenheit::Task::poll
             at src/lib.rs:87
  27: fahrenheit::EventLoop::run
             at ./src/lib.rs:272
  28: fahrenheit::run::{{closure}}
             at ./src/lib.rs:39
  29: <std::thread::local::LocalKey<T>>::try_with
             at /checkout/src/libstd/thread/local.rs:294
  30: <std::thread::local::LocalKey<T>>::with
             at /checkout/src/libstd/thread/local.rs:248
  31: fahrenheit::run
             at ./src/lib.rs:39
  32: haha::main
             at examples/haha.rs:23
  33: std::rt::lang_start::{{closure}}
             at /checkout/src/libstd/rt.rs:74
  34: std::panicking::try::do_call
             at libstd/rt.rs:59
             at libstd/panicking.rs:310
  35: __rust_maybe_catch_panic
             at libpanic_unwind/lib.rs:103
  36: std::rt::lang_start_internal
             at libstd/panicking.rs:289
             at libstd/panic.rs:392
             at libstd/rt.rs:58
  37: std::rt::lang_start
             at /checkout/src/libstd/rt.rs:74
  38: main
  39: __libc_start_main
  40: <unknown>