mirror of
https://github.com/rust-lang/rust-analyzer
synced 2025-01-09 11:48:48 +00:00
60 lines
2 KiB
Rust
60 lines
2 KiB
Rust
|
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(),
|
||
|
}
|
||
|
}
|
||
|
}
|