Merge pull request #532 from napi-rs/tsfn-memory-ordering

fix(napi): memory ordering issues in tsfn
This commit is contained in:
LongYinan 2021-04-12 18:37:34 +08:00 committed by GitHub
commit 3be8136a7a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -235,7 +235,7 @@ impl<T: 'static, ES: ErrorStrategy::T> ThreadsafeFunction<T, ES> {
format!("Can not ref, Thread safe function already aborted"), format!("Can not ref, Thread safe function already aborted"),
)); ));
} }
self.ref_count.fetch_add(1, Ordering::Acquire); self.ref_count.fetch_add(1, Ordering::AcqRel);
check_status!(unsafe { sys::napi_ref_threadsafe_function(env.0, self.raw_tsfn) }) check_status!(unsafe { sys::napi_ref_threadsafe_function(env.0, self.raw_tsfn) })
} }
@ -248,12 +248,12 @@ impl<T: 'static, ES: ErrorStrategy::T> ThreadsafeFunction<T, ES> {
format!("Can not unref, Thread safe function already aborted"), format!("Can not unref, Thread safe function already aborted"),
)); ));
} }
self.ref_count.fetch_sub(1, Ordering::Acquire); self.ref_count.fetch_sub(1, Ordering::AcqRel);
check_status!(unsafe { sys::napi_unref_threadsafe_function(env.0, self.raw_tsfn) }) check_status!(unsafe { sys::napi_unref_threadsafe_function(env.0, self.raw_tsfn) })
} }
pub fn aborted(&self) -> bool { pub fn aborted(&self) -> bool {
self.aborted.load(Ordering::Acquire) self.aborted.load(Ordering::Relaxed)
} }
pub fn abort(self) -> Result<()> { pub fn abort(self) -> Result<()> {
@ -311,7 +311,7 @@ impl<T: 'static> ThreadsafeFunction<T, ErrorStrategy::Fatal> {
impl<T: 'static, ES: ErrorStrategy::T> Drop for ThreadsafeFunction<T, ES> { impl<T: 'static, ES: ErrorStrategy::T> Drop for ThreadsafeFunction<T, ES> {
fn drop(&mut self) { fn drop(&mut self) {
if !self.aborted.load(Ordering::Acquire) && self.ref_count.load(Ordering::Relaxed) > 0usize { if !self.aborted.load(Ordering::Acquire) && self.ref_count.load(Ordering::Acquire) > 0usize {
let release_status = unsafe { let release_status = unsafe {
sys::napi_release_threadsafe_function( sys::napi_release_threadsafe_function(
self.raw_tsfn, self.raw_tsfn,