summaryrefslogtreecommitdiff
path: root/src/poisonable
diff options
context:
space:
mode:
authorBotahamec <botahamec@outlook.com>2024-12-21 11:27:09 -0500
committerBotahamec <botahamec@outlook.com>2024-12-21 11:27:09 -0500
commitb2281e6aec631dc7c6d69edef9268ce7e00ed1dc (patch)
tree4a3d9059e291016dcfaec8b08ac4aee48a7b815a /src/poisonable
parent0ddbb5efa57fb36b2c83a5cd1dc43a5cf426e3ee (diff)
Implement lock death, but without any usages
Diffstat (limited to 'src/poisonable')
-rw-r--r--src/poisonable/flag.rs4
-rw-r--r--src/poisonable/guard.rs3
-rw-r--r--src/poisonable/poisonable.rs36
3 files changed, 25 insertions, 18 deletions
diff --git a/src/poisonable/flag.rs b/src/poisonable/flag.rs
index be38a38..a692685 100644
--- a/src/poisonable/flag.rs
+++ b/src/poisonable/flag.rs
@@ -16,6 +16,10 @@ impl PoisonFlag {
pub fn clear_poison(&self) {
self.0.store(false, Relaxed)
}
+
+ pub fn poison(&self) {
+ self.0.store(true, Relaxed);
+ }
}
#[cfg(not(panic = "unwind"))]
diff --git a/src/poisonable/guard.rs b/src/poisonable/guard.rs
index 30a9b70..6438c2d 100644
--- a/src/poisonable/guard.rs
+++ b/src/poisonable/guard.rs
@@ -1,7 +1,6 @@
use std::fmt::{Debug, Display};
use std::marker::PhantomData;
use std::ops::{Deref, DerefMut};
-use std::sync::atomic::Ordering::Relaxed;
use crate::Keyable;
@@ -23,7 +22,7 @@ impl<Guard> Drop for PoisonRef<'_, Guard> {
fn drop(&mut self) {
#[cfg(panic = "unwind")]
if std::thread::panicking() {
- self.flag.0.store(true, Relaxed);
+ self.flag.poison();
}
}
}
diff --git a/src/poisonable/poisonable.rs b/src/poisonable/poisonable.rs
index ddd8038..581fb2f 100644
--- a/src/poisonable/poisonable.rs
+++ b/src/poisonable/poisonable.rs
@@ -12,28 +12,32 @@ use super::{
};
unsafe impl<L: Lockable + RawLock> RawLock for Poisonable<L> {
- unsafe fn lock(&self) {
- self.inner.lock()
+ fn kill(&self) {
+ self.inner.kill()
}
- unsafe fn try_lock(&self) -> bool {
- self.inner.try_lock()
+ unsafe fn raw_lock(&self) {
+ self.inner.raw_lock()
}
- unsafe fn unlock(&self) {
- self.inner.unlock()
+ unsafe fn raw_try_lock(&self) -> bool {
+ self.inner.raw_try_lock()
}
- unsafe fn read(&self) {
- self.inner.read()
+ unsafe fn raw_unlock(&self) {
+ self.inner.raw_unlock()
}
- unsafe fn try_read(&self) -> bool {
- self.inner.try_read()
+ unsafe fn raw_read(&self) {
+ self.inner.raw_read()
}
- unsafe fn unlock_read(&self) {
- self.inner.unlock_read()
+ unsafe fn raw_try_read(&self) -> bool {
+ self.inner.raw_try_read()
+ }
+
+ unsafe fn raw_unlock_read(&self) {
+ self.inner.raw_unlock_read()
}
}
@@ -285,7 +289,7 @@ impl<L: Lockable + RawLock> Poisonable<L> {
key: Key,
) -> PoisonResult<PoisonGuard<'flag, 'key, L::Guard<'flag>, Key>> {
unsafe {
- self.inner.lock();
+ self.inner.raw_lock();
self.guard(key)
}
}
@@ -339,7 +343,7 @@ impl<L: Lockable + RawLock> Poisonable<L> {
key: Key,
) -> TryLockPoisonableResult<'flag, 'key, L::Guard<'flag>, Key> {
unsafe {
- if self.inner.try_lock() {
+ if self.inner.raw_try_lock() {
Ok(self.guard(key)?)
} else {
Err(TryLockPoisonableError::WouldBlock(key))
@@ -426,7 +430,7 @@ impl<L: Sharable + RawLock> Poisonable<L> {
key: Key,
) -> PoisonResult<PoisonGuard<'flag, 'key, L::ReadGuard<'flag>, Key>> {
unsafe {
- self.inner.read();
+ self.inner.raw_read();
self.read_guard(key)
}
}
@@ -473,7 +477,7 @@ impl<L: Sharable + RawLock> Poisonable<L> {
key: Key,
) -> TryLockPoisonableResult<'flag, 'key, L::ReadGuard<'flag>, Key> {
unsafe {
- if self.inner.try_read() {
+ if self.inner.raw_try_read() {
Ok(self.read_guard(key)?)
} else {
Err(TryLockPoisonableError::WouldBlock(key))