dpc / mioco.pre-0.9

Scalable, coroutine-based, asynchronous IO handling library for Rust programming language. (aka MIO COroutines).
Mozilla Public License 2.0
457 stars 30 forks source link

Panic when handling signals and using shutdown. #110

Closed dpc closed 8 years ago

dpc commented 8 years ago

Reported in #77

Cargo.toml

[package]
name = "mioco_test"
version = "0.1.0"

[dependencies]
mioco = "0.3.0"
env_logger = "*"
log = "*"
simple-signal = "1.0.5"

src/main.rs

#[macro_use]
extern crate log;
extern crate env_logger;
extern crate simple_signal;
extern crate mioco;

use mioco::tcp;
use simple_signal::{Signals, Signal};
use std::{net,str};

const DEFAULT_LISTEN_ADDR : &'static str = "0.0.0.0:45678";
fn listend_addr() -> net::SocketAddr {
    str::FromStr::from_str(DEFAULT_LISTEN_ADDR).unwrap()
}

fn main() {
    env_logger::init().unwrap();
    info!("Starting...");
    // Handle signals
    let (shutdown_tx, shutdown_rx) = mioco::sync::mpsc::channel();
    Signals::set_handler(&[Signal::Term, Signal::Int], move |_signals| {
        info!("Recieved signal {:?}, stopping...", _signals);
        shutdown_tx.send(()).unwrap();
    });

    mioco::start(move ||{
        // Handle shutdown
        mioco::spawn(move ||{
            let _ = shutdown_rx.recv();
            mioco::shutdown();
        });

        let addr = listend_addr();
        let listener = tcp::TcpListener::bind(&addr).unwrap();
        info!("Started.");

        let _ = try!(listener.accept());
        Ok(())
    });
    info!("Stopped.");
}

Output:

Protheseus:mioco_test muelleto$ RUST_LOG=mioco_test=debug cargo run
     Running `target/debug/mioco_test`
INFO:mioco_test: Starting...
INFO:mioco_test: Started.
^CINFO:mioco_test: Recieved signal [Int], stopping...
thread '<main>' panicked at 'coroutine::jump_in: wrong state Blocked', /Users/muelleto/.multirust/toolchains/nightly/cargo/registry/src/github.com-88ac128001ac3a9a/mioco-0.3.0/src/coroutine.rs:555
note: Run with `RUST_BACKTRACE=1` for a backtrace.