-
Notifications
You must be signed in to change notification settings - Fork 710
Closed
Description
rolldown/crates/rolldown_binding/src/types/js_callback.rs
Lines 94 to 124 in e3bb1d4
| fn invoke_sync(&self, args: Args) -> Result<Ret, napi::Error> { | |
| let init_value = Ok(Either::B(UnknownReturnValue)); | |
| let pair = Arc::new((Mutex::new(init_value), Condvar::new())); | |
| let pair_clone = Arc::clone(&pair); | |
| self.call_with_return_value( | |
| args, | |
| napi::threadsafe_function::ThreadsafeFunctionCallMode::Blocking, | |
| move |ret, _env| { | |
| let (lock, cvar) = &*pair; | |
| *lock.lock().unwrap() = ret; | |
| cvar.notify_one(); | |
| Ok(()) | |
| }, | |
| ); | |
| let (lock, cvar) = &*pair_clone; | |
| let notified = lock.lock().unwrap(); | |
| let mut res = cvar.wait(notified).map_err(|err| { | |
| napi::Error::new(napi::Status::GenericFailure, format!("PoisonError: {err:?}",)) | |
| })?; | |
| let res = res | |
| .as_mut() | |
| .map_err(|err| napi::Error::new(napi::Status::GenericFailure, format!("{err:?}",)))?; | |
| match std::mem::replace(res, Either::B(UnknownReturnValue)) { | |
| Either::A(ret) => Ok(ret), | |
| Either::B(_unknown) => create_unknown_return_error::<Ret, Self>(), | |
| } | |
| } | |
| } |
possible next steps:
- Reproduce these problems via https://github.com/tokio-rs/loom
- Refactor this part of code to eliminate this problem
Probably is also the reason of #6737
Reactions are currently unavailable