Skip to content

invoke_sync might cause rolldown hang #7280

@hyf0

Description

@hyf0

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:

Probably is also the reason of #6737

Metadata

Metadata

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions