mirror of
https://github.com/tokio-rs/tokio.git
synced 2026-08-29 00:00:11 +02:00
Shutdown the runtime on drop (#214)
Currently, the runtime does not shutdown if the runtime handle is dropped. This can happen during a panic or when the value is simply dropped. This patch forces the runtime to shutdown if it is not explicitly shutdown. Fixes #209
This commit is contained in:
+28
-11
@@ -339,17 +339,7 @@ impl Runtime {
|
|||||||
/// [mod]: index.html
|
/// [mod]: index.html
|
||||||
pub fn shutdown_now(mut self) -> Shutdown {
|
pub fn shutdown_now(mut self) -> Shutdown {
|
||||||
let inner = self.inner.take().unwrap();
|
let inner = self.inner.take().unwrap();
|
||||||
|
Shutdown::shutdown_now(inner)
|
||||||
let inner = Box::new({
|
|
||||||
let pool = inner.pool;
|
|
||||||
let reactor = inner.reactor;
|
|
||||||
|
|
||||||
pool.shutdown_now().and_then(|_| {
|
|
||||||
reactor.shutdown_now()
|
|
||||||
})
|
|
||||||
});
|
|
||||||
|
|
||||||
Shutdown { inner }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn inner(&self) -> &Inner {
|
fn inner(&self) -> &Inner {
|
||||||
@@ -361,6 +351,15 @@ impl Runtime {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Drop for Runtime {
|
||||||
|
fn drop(&mut self) {
|
||||||
|
if let Some(inner) = self.inner.take() {
|
||||||
|
let shutdown = Shutdown::shutdown_now(inner);
|
||||||
|
let _ = shutdown.wait();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// ===== impl TaskExecutor =====
|
// ===== impl TaskExecutor =====
|
||||||
|
|
||||||
impl TaskExecutor {
|
impl TaskExecutor {
|
||||||
@@ -425,6 +424,24 @@ impl ::executor::Executor for TaskExecutor {
|
|||||||
|
|
||||||
// ===== impl Shutdown =====
|
// ===== impl Shutdown =====
|
||||||
|
|
||||||
|
impl Shutdown {
|
||||||
|
fn shutdown_now(inner: Inner) -> Self {
|
||||||
|
let inner = Box::new({
|
||||||
|
let pool = inner.pool;
|
||||||
|
let reactor = inner.reactor;
|
||||||
|
|
||||||
|
pool.shutdown_now().and_then(|_| {
|
||||||
|
reactor.shutdown_now()
|
||||||
|
.then(|_| {
|
||||||
|
Ok(())
|
||||||
|
})
|
||||||
|
})
|
||||||
|
});
|
||||||
|
|
||||||
|
Shutdown { inner }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl Future for Shutdown {
|
impl Future for Shutdown {
|
||||||
type Item = ();
|
type Item = ();
|
||||||
type Error = ();
|
type Error = ();
|
||||||
|
|||||||
Reference in New Issue
Block a user