mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-10-01 14:21:44 +00:00
Move salsa fork in-tree
This commit is contained in:
parent
1974e7490d
commit
159a03ad7b
69 changed files with 9478 additions and 41 deletions
59
crates/salsa/src/storage.rs
Normal file
59
crates/salsa/src/storage.rs
Normal file
|
@ -0,0 +1,59 @@
|
|||
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(),
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue