summaryrefslogtreecommitdiff
path: root/src/key.rs
diff options
context:
space:
mode:
authorBotahamec <botahamec@outlook.com>2024-05-23 20:44:02 -0400
committerBotahamec <botahamec@outlook.com>2024-05-23 20:44:02 -0400
commitfd4ee65a78ecbf376d99377a367137b0b8cdad41 (patch)
tree663b211b0da02431b2d100a270d60d48eebbefb0 /src/key.rs
parent0926201a52f860b1f75dda2e9bd6d2e536cc5f68 (diff)
parent8ecf29cfe2a74d02b2c4bcb7f7ad1a811dc38dfe (diff)
Merge branch '0.2'
Diffstat (limited to 'src/key.rs')
-rw-r--r--src/key.rs9
1 files changed, 8 insertions, 1 deletions
diff --git a/src/key.rs b/src/key.rs
index 1cfa209..4d6504f 100644
--- a/src/key.rs
+++ b/src/key.rs
@@ -7,6 +7,8 @@ use thread_local::ThreadLocal;
use sealed::Sealed;
+// Sealed to prevent other key types from being implemented. Otherwise, this
+// would almost instant undefined behavior.
mod sealed {
use super::ThreadKey;
@@ -15,12 +17,15 @@ mod sealed {
impl Sealed for &mut ThreadKey {}
}
+// I am concerned that having multiple crates linked together with different
+// static variables could break my key system. Library code probably shouldn't
+// be creating keys at all.
static KEY: Lazy<ThreadLocal<AtomicLock>> = Lazy::new(ThreadLocal::new);
/// The key for the current thread.
///
/// Only one of these exist per thread. To get the current thread's key, call
-/// [`ThreadKey::get`]. If the `ThreadKey` is dropped, it can be reobtained.
+/// [`ThreadKey::get`]. If the `ThreadKey` is dropped, it can be re-obtained.
pub struct ThreadKey {
phantom: PhantomData<*const ()>, // implement !Send and !Sync
}
@@ -34,6 +39,7 @@ pub struct ThreadKey {
/// values invalid.
pub unsafe trait Keyable: Sealed {}
unsafe impl Keyable for ThreadKey {}
+// the ThreadKey can't be moved while a mutable reference to it exists
unsafe impl Keyable for &mut ThreadKey {}
impl Debug for ThreadKey {
@@ -42,6 +48,7 @@ impl Debug for ThreadKey {
}
}
+// If you lose the thread key, you can get it back by calling ThreadKey::get
impl Drop for ThreadKey {
fn drop(&mut self) {
unsafe { KEY.get().unwrap().force_unlock() }