mirror of
https://github.com/tokio-rs/tokio.git
synced 2026-09-09 00:00:08 +02:00
rt: fix Runtime::reactor() as used by tokio-core (#721)
* rt: fix `Runtime::reactor()` as used by tokio-core Up until Tokio v0.1.11, the handle returned by `Runtime::reactor()` pointed to a reactor instance running in a background thread. The thread was eagerly spawned. As of v0.1.12, a reactor instance is created per runtime worker thread. `Runtime::reactor()` was deprecated and updated to point to the reactor for one of the worker threads. A problem occurs when attempting to use the reactor before spawning a task. Worker threads are spawned lazily, which means that the reactor referenced by `Runtime::reactor()` is not yet running. This patch changes `Runtime::reactor` back to a dedicated reactor running on a background thread. However, the background thread is now spawned lazily when the deprecated function is first called. Fixes #720 * Fix comment Co-Authored-By: carllerche <[email protected]>
This commit is contained in:
committed by
Stjepan Glavina
parent
f929576f0e
commit
d011b92b9a
@@ -466,3 +466,30 @@ mod nested_enter {
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn runtime_reactor_handle() {
|
||||
#![allow(deprecated)]
|
||||
|
||||
use futures::Stream;
|
||||
use std::net::{
|
||||
TcpListener as StdListener,
|
||||
TcpStream as StdStream,
|
||||
};
|
||||
|
||||
let rt = Runtime::new().unwrap();
|
||||
|
||||
let std_listener = StdListener::bind("127.0.0.1:0").unwrap();
|
||||
let tk_listener = TcpListener::from_std(std_listener, rt.handle()).unwrap();
|
||||
|
||||
let addr = tk_listener.local_addr().unwrap();
|
||||
|
||||
// Spawn a thread since we are avoiding the runtime
|
||||
let th = thread::spawn(|| {
|
||||
for _ in tk_listener.incoming().take(1).wait() {
|
||||
}
|
||||
});
|
||||
|
||||
let _ = StdStream::connect(&addr).unwrap();
|
||||
|
||||
th.join().unwrap();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user