diff options
| author | Matthias Krüger <matthias.krueger@famsik.de> | 2022-06-25 15:14:09 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-06-25 15:14:09 +0200 |
| commit | ecefccd8d2859c6715760861c7dacfcdf816992a (patch) | |
| tree | 85e8c78d6b37d2c1be7f2bce20c05fe7280cae87 /library/std/src/sys_common | |
| parent | 45ef23d78e54ff2d12db78c6445f766f61972c86 (diff) | |
| parent | e642c5987e1885a6ea9b0f1527810a72bdcdeb3f (diff) | |
| download | rust-ecefccd8d2859c6715760861c7dacfcdf816992a.tar.gz rust-ecefccd8d2859c6715760861c7dacfcdf816992a.zip | |
Rollup merge of #98194 - m-ou-se:leak-locked-pthread-mutex, r=Amanieu
Leak pthread_{mutex,rwlock}_t if it's dropped while locked.
Fixes https://github.com/rust-lang/rust/issues/85434.
Diffstat (limited to 'library/std/src/sys_common')
| -rw-r--r-- | library/std/src/sys_common/lazy_box.rs | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/library/std/src/sys_common/lazy_box.rs b/library/std/src/sys_common/lazy_box.rs index 647c13d2437..63c3316bdeb 100644 --- a/library/std/src/sys_common/lazy_box.rs +++ b/library/std/src/sys_common/lazy_box.rs @@ -21,8 +21,21 @@ pub(crate) trait LazyInit { /// /// It might be called more than once per LazyBox, as multiple threads /// might race to initialize it concurrently, each constructing and initializing - /// their own box. (All but one of them will be destroyed right after.) + /// their own box. All but one of them will be passed to `cancel_init` right after. fn init() -> Box<Self>; + + /// Any surplus boxes from `init()` that lost the initialization race + /// are passed to this function for disposal. + /// + /// The default implementation calls destroy(). + fn cancel_init(x: Box<Self>) { + Self::destroy(x); + } + + /// This is called to destroy a used box. + /// + /// The default implementation just drops it. + fn destroy(_: Box<Self>) {} } impl<T: LazyInit> LazyBox<T> { @@ -45,7 +58,7 @@ impl<T: LazyInit> LazyBox<T> { Err(ptr) => { // Lost the race to another thread. // Drop the box we created, and use the one from the other thread instead. - drop(unsafe { Box::from_raw(new_ptr) }); + T::cancel_init(unsafe { Box::from_raw(new_ptr) }); ptr } } @@ -71,7 +84,7 @@ impl<T: LazyInit> Drop for LazyBox<T> { fn drop(&mut self) { let ptr = *self.ptr.get_mut(); if !ptr.is_null() { - drop(unsafe { Box::from_raw(ptr) }); + T::destroy(unsafe { Box::from_raw(ptr) }); } } } |
