Leak pthreax_rwlock_t when it's dropped while locked.

This commit is contained in:
Mara Bos 2022-06-19 12:53:12 +02:00
parent d72294491c
commit e642c5987e

View File

@ -1,4 +1,5 @@
use crate::cell::UnsafeCell;
use crate::mem::forget;
use crate::sync::atomic::{AtomicUsize, Ordering};
use crate::sys_common::lazy_box::{LazyBox, LazyInit};
@ -17,6 +18,21 @@ impl LazyInit for RwLock {
fn init() -> Box<Self> {
Box::new(Self::new())
}
fn destroy(mut rwlock: Box<Self>) {
// We're not allowed to pthread_rwlock_destroy a locked rwlock,
// so check first if it's unlocked.
if *rwlock.write_locked.get_mut() || *rwlock.num_readers.get_mut() != 0 {
// The rwlock is locked. This happens if a RwLock{Read,Write}Guard is leaked.
// In this case, we just leak the RwLock too.
forget(rwlock);
}
}
fn cancel_init(_: Box<Self>) {
// In this case, we can just drop it without any checks,
// since it cannot have been locked yet.
}
}
impl RwLock {