Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ra-salsa/src/storage.rs')
| -rw-r--r-- | crates/ra-salsa/src/storage.rs | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/crates/ra-salsa/src/storage.rs b/crates/ra-salsa/src/storage.rs new file mode 100644 index 0000000000..e0acf44041 --- /dev/null +++ b/crates/ra-salsa/src/storage.rs @@ -0,0 +1,53 @@ +use crate::{plumbing::DatabaseStorageTypes, Runtime}; +use triomphe::Arc; + +/// Stores the cached results and dependency information for all the queries +/// defined on your salsa database. Also embeds a [`Runtime`] which is used to +/// manage query execution. Every database must include a `storage: +/// Storage<Self>` field. +pub struct Storage<DB: DatabaseStorageTypes> { + query_store: Arc<DB::DatabaseStorage>, + runtime: Runtime, +} + +impl<DB: DatabaseStorageTypes> Default for Storage<DB> { + fn default() -> Self { + Self { query_store: Default::default(), runtime: Default::default() } + } +} + +impl<DB: DatabaseStorageTypes> Storage<DB> { + /// Gives access to the underlying salsa runtime. + pub fn salsa_runtime(&self) -> &Runtime { + &self.runtime + } + + /// Gives access to the underlying salsa runtime. + pub fn salsa_runtime_mut(&mut self) -> &mut Runtime { + &mut self.runtime + } + + /// Access the query storage tables. Not meant to be used directly by end + /// users. + pub fn query_store(&self) -> &DB::DatabaseStorage { + &self.query_store + } + + /// Access the query storage tables. Not meant to be used directly by end + /// users. + pub fn query_store_mut(&mut self) -> (&DB::DatabaseStorage, &mut Runtime) { + (&self.query_store, &mut self.runtime) + } + + /// Returns a "snapshotted" storage, suitable for use in a forked database. + /// This snapshot hold a read-lock on the global state, which means that any + /// attempt to `set` an input will block until the forked runtime is + /// dropped. See `ParallelDatabase::snapshot` for more information. + /// + /// **Warning.** This second handle is intended to be used from a separate + /// thread. Using two database handles from the **same thread** can lead to + /// deadlock. + pub fn snapshot(&self) -> Self { + Storage { query_store: self.query_store.clone(), runtime: self.runtime.snapshot() } + } +} |