about summary refs log tree commit diff
path: root/compiler/rustc_data_structures/src/sync/freeze.rs
diff options
context:
space:
mode:
authorJohn Kåre Alsaker <john.kare.alsaker@gmail.com>2023-08-31 22:12:47 +0200
committerJohn Kåre Alsaker <john.kare.alsaker@gmail.com>2023-09-07 13:05:05 +0200
commitf49382c0508db608aa9c33d6a8c77d2955d8f62c (patch)
tree85be68eacbc6325822cf64fba8e4841474065607 /compiler/rustc_data_structures/src/sync/freeze.rs
parentc5996b80beaba54502fa86583b48cd6980b17b18 (diff)
downloadrust-f49382c0508db608aa9c33d6a8c77d2955d8f62c.tar.gz
rust-f49382c0508db608aa9c33d6a8c77d2955d8f62c.zip
Use `Freeze` for `SourceFile.lines`
Diffstat (limited to 'compiler/rustc_data_structures/src/sync/freeze.rs')
-rw-r--r--compiler/rustc_data_structures/src/sync/freeze.rs12
1 files changed, 12 insertions, 0 deletions
diff --git a/compiler/rustc_data_structures/src/sync/freeze.rs b/compiler/rustc_data_structures/src/sync/freeze.rs
index 88c710e5236..ad71ae1af51 100644
--- a/compiler/rustc_data_structures/src/sync/freeze.rs
+++ b/compiler/rustc_data_structures/src/sync/freeze.rs
@@ -3,6 +3,7 @@ use crate::sync::{AtomicBool, ReadGuard, RwLock, WriteGuard};
 use crate::sync::{DynSend, DynSync};
 use std::{
     cell::UnsafeCell,
+    intrinsics::likely,
     marker::PhantomData,
     ops::{Deref, DerefMut},
     sync::atomic::Ordering,
@@ -49,6 +50,17 @@ impl<T> FreezeLock<T> {
         self.frozen.load(Ordering::Acquire)
     }
 
+    /// Get the inner value if frozen.
+    #[inline]
+    pub fn get(&self) -> Option<&T> {
+        if likely(self.frozen.load(Ordering::Acquire)) {
+            // SAFETY: This is frozen so the data cannot be modified.
+            unsafe { Some(&*self.data.get()) }
+        } else {
+            None
+        }
+    }
+
     #[inline]
     pub fn read(&self) -> FreezeReadGuard<'_, T> {
         FreezeReadGuard {