mirror of
https://github.com/rust-lang/rust.git
synced 2025-02-20 02:43:45 +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::cell::UnsafeCell;
|
||||||
|
use crate::mem::forget;
|
||||||
use crate::sync::atomic::{AtomicUsize, Ordering};
|
use crate::sync::atomic::{AtomicUsize, Ordering};
|
||||||
use crate::sys_common::lazy_box::{LazyBox, LazyInit};
|
use crate::sys_common::lazy_box::{LazyBox, LazyInit};
|
||||||
|
|
||||||
@ -17,6 +18,21 @@ impl LazyInit for RwLock {
|
|||||||
fn init() -> Box<Self> {
|
fn init() -> Box<Self> {
|
||||||
Box::new(Self::new())
|
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 {
|
impl RwLock {
|
||||||
|
Loading…
Reference in New Issue
Block a user