From f92ade7f458eec4841ba2093004b85e71ff8b96d Mon Sep 17 00:00:00 2001 From: Rob Bradford Date: Thu, 6 Feb 2020 17:10:29 +0000 Subject: [PATCH] Wait on the worker thread Check the return value from the worker thread by saving the thread handle and waiting for it to return. Signed-off-by: Rob Bradford --- src/lib.rs | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) 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); + } + } + } +}