diff --git a/src/lib.rs b/src/lib.rs index fb8c7dc..c0db6a6 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -4,6 +4,9 @@ // Copyright 2019 Alibaba Cloud Computing. All rights reserved. // SPDX-License-Identifier: Apache-2.0 +#[macro_use] +extern crate log; + use std::error; use std::fs::File; use std::io; @@ -398,6 +401,7 @@ struct VhostUserHandler { max_queue_size: usize, memory: Option, vrings: Vec>>, + worker_thread: Option>>, } impl VhostUserHandler { @@ -421,10 +425,12 @@ impl VhostUserHandler { let vring_worker = Arc::new(VringWorker { epoll_fd }); let worker = vring_worker.clone(); - thread::Builder::new() - .name("vring_worker".to_string()) - .spawn(move || vring_worker.run(vring_handler)) - .map_err(VhostUserHandlerError::SpawnVringWorker)?; + let worker_thread = Some( + thread::Builder::new() + .name("vring_worker".to_string()) + .spawn(move || vring_worker.run(vring_handler)) + .map_err(VhostUserHandlerError::SpawnVringWorker)?, + ); Ok(VhostUserHandler { backend, @@ -437,6 +443,7 @@ impl VhostUserHandler { max_queue_size, memory: None, vrings, + worker_thread, }) } @@ -738,3 +745,13 @@ impl VhostUserSlaveReqHandler for VhostUserHandler { .map_err(VhostUserError::ReqHandlerError) } } + +impl Drop for VhostUserHandler { + fn drop(&mut self) { + if let Some(thread) = self.worker_thread.take() { + if let Err(e) = thread.join() { + error!("Error in vring worker: {:?}", e); + } + } + } +}