From bd055edc3f56233b773e7046a0cf20591e66a18c Mon Sep 17 00:00:00 2001 From: Kostis Papazafeiropoulos Date: Thu, 24 Nov 2022 22:28:24 +0200 Subject: [PATCH] fix(sync): Avoid panic when using sync client from a GCC destructor Calling Rust from a GCC destructor can result in panics when using pthreads (rust-lang/rust-28129). Move client request code to a separate thread to work around this issue. Signed-off-by: Kostis Papazafeiropoulos --- src/sync/client.rs | 47 +++++++++++++++++++++++++--------------------- 1 file changed, 26 insertions(+), 21 deletions(-) diff --git a/src/sync/client.rs b/src/sync/client.rs index 50d9bd5d..9c92f838 100644 --- a/src/sync/client.rs +++ b/src/sync/client.rs @@ -169,28 +169,33 @@ impl Client { .send((buf, tx)) .map_err(err_to_others_err!(e, "Send packet to sender error "))?; - let result = if req.timeout_nano == 0 { - rx.recv().map_err(err_to_others_err!( - e, - "Receive packet from Receiver error: " - ))? - } else { - rx.recv_timeout(Duration::from_nanos(req.timeout_nano as u64)) - .map_err(err_to_others_err!( - e, - "Receive packet from Receiver timeout: " - ))? - }; - - let buf = result?; - let res = Response::decode(buf).map_err(err_to_others_err!(e, "Unpack response error "))?; - - let status = res.status(); - if status.code() != Code::OK { - return Err(Error::RpcStatus((*status).clone())); - } + let t = thread::spawn(move || { + let result = if req.timeout_nano == 0 { + rx.recv().map_err(err_to_others_err!( + e, + "Receive packet from Receiver error: " + ))? + } else { + rx.recv_timeout(Duration::from_nanos(req.timeout_nano as u64)) + .map_err(err_to_others_err!( + e, + "Receive packet from Receiver timeout: " + ))? + }; + + let buf = result?; + let res = Response::decode(buf) + .map_err(err_to_others_err!(e, "Unpack response error "))?; + + let status = res.status(); + if status.code() != Code::OK { + return Err(Error::RpcStatus((*status).clone())); + } + + Ok(res) + }); - Ok(res) + t.join().unwrap() } }