From 0fa428391a08c22a797b729fcfd81ffdf4482b67 Mon Sep 17 00:00:00 2001 From: suzumiya Date: Tue, 5 Dec 2023 11:46:21 +0800 Subject: [PATCH] fix: segment fault caused by weak --- taos-optin/src/raw/mod.rs | 51 +++++++++++++++++++-------------------- 1 file changed, 25 insertions(+), 26 deletions(-) diff --git a/taos-optin/src/raw/mod.rs b/taos-optin/src/raw/mod.rs index fb8c7a9e..a48e1d6a 100644 --- a/taos-optin/src/raw/mod.rs +++ b/taos-optin/src/raw/mod.rs @@ -1313,42 +1313,41 @@ impl RawRes { Poll::Ready(item) } else { current.in_use = true; - let param = Box::new((Arc::downgrade(state), self.c.clone(), cx.waker().clone())); + let param = Box::new((state.clone(), self.c.clone(), cx.waker().clone())); #[no_mangle] unsafe extern "C" fn taos_optin_fetch_rows_callback( param: *mut c_void, res: *mut TAOS_RES, num_of_rows: c_int, ) { - let param = param as *mut (Weak>, Arc, Waker); + let param = param as *mut (Arc>, Arc, Waker); let param = Box::from_raw(param); - if let Some(state) = param.0.upgrade() { - let state = &mut *state.get(); - let api = &*param.1; - // state.done = true; - state.in_use = false; - if num_of_rows < 0 { - // error - state.result.replace(Err(RawError::new_with_context( - num_of_rows, - api.err_str(res), - "fetch_rows_a", - ))); + let state = param.0; + let state = &mut *state.get(); + let api = &*param.1; + // state.done = true; + state.in_use = false; + if num_of_rows < 0 { + // error + state.result.replace(Err(RawError::new_with_context( + num_of_rows, + api.err_str(res), + "fetch_rows_a", + ))); + } else { + // success + if num_of_rows > 0 { + // has a block + let block = (param.1.taos_result_block.unwrap())(res).read() as _; + state + .result + .replace(Ok(Some((block, num_of_rows as usize)))); } else { - // success - if num_of_rows > 0 { - // has a block - let block = (param.1.taos_result_block.unwrap())(res).read() as _; - state - .result - .replace(Ok(Some((block, num_of_rows as usize)))); - } else { - // retrieving completed - state.result.replace(Ok(None)); - } + // retrieving completed + state.result.replace(Ok(None)); } - param.2.wake() } + param.2.wake() } unsafe { (self.c.taos_fetch_rows_a)(