mirror of
https://github.com/rust-lang/rust.git
synced 2025-02-17 01:13:11 +00:00
Leak pthreax_rwlock_t when it's dropped while locked.
This commit is contained in:
parent
d72294491c
commit
e642c5987e
@ -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 {
|
||||
|
Loading…
Reference in New Issue
Block a user