kevy_embedded/
store_inner.rs1use std::sync::atomic::{AtomicBool, Ordering};
7use std::sync::{Arc, Mutex, RwLock, Weak};
8use std::thread::JoinHandle;
9
10use kevy_persist::Aof;
11
12use crate::config::Config;
13use crate::pubsub::PubsubBus;
14use crate::store::{Shards, Store, lock_write};
15
16#[derive(Clone)]
22pub struct WeakStore {
23 shards: Weak<Vec<Arc<RwLock<Inner>>>>,
24 guard: Weak<DropGuard>,
25 config: Config,
26 #[cfg(not(target_arch = "wasm32"))]
27 feed_weak: Option<std::sync::Weak<Mutex<kevy_replicate::feed::FeedSource>>>,
28 blocker_weak: Weak<crate::ops_blocking::Blocker>,
29 indexes_weak: Weak<crate::ops_index::IndexReg>,
30 views_weak: Weak<crate::ops_view::ViewReg>,
31}
32
33impl WeakStore {
34 pub fn upgrade(&self) -> Option<Store> {
37 Some(Store {
38 shards: self.shards.upgrade()?,
39 guard: self.guard.upgrade()?,
40 config: self.config.clone(),
41 #[cfg(not(target_arch = "wasm32"))]
42 feed: self.feed_weak.as_ref().and_then(std::sync::Weak::upgrade),
43 blocker: self.blocker_weak.upgrade()?,
44 indexes: self.indexes_weak.upgrade()?,
45 views: self.views_weak.upgrade()?,
46 })
47 }
48}
49
50impl Store {
51 pub fn downgrade(&self) -> WeakStore {
53 WeakStore {
54 shards: Arc::downgrade(&self.shards),
55 guard: Arc::downgrade(&self.guard),
56 config: self.config.clone(),
57 #[cfg(not(target_arch = "wasm32"))]
58 feed_weak: self.feed.as_ref().map(Arc::downgrade),
59 blocker_weak: Arc::downgrade(&self.blocker),
60 indexes_weak: Arc::downgrade(&self.indexes),
61 views_weak: Arc::downgrade(&self.views),
62 }
63 }
64}
65
66pub(crate) struct Inner {
67 pub(crate) store: kevy_store::Store,
68 pub(crate) aof: Option<Aof>,
69 pub(crate) bus: PubsubBus,
72 #[cfg(not(target_arch = "wasm32"))]
77 pub(crate) writer_source:
78 Option<std::sync::Arc<Mutex<kevy_replicate::source::ReplicationSource>>>,
79 #[cfg(not(target_arch = "wasm32"))]
82 pub(crate) feed: Option<std::sync::Arc<Mutex<kevy_replicate::feed::FeedSource>>>,
83 pub(crate) blocker: Option<Arc<crate::ops_blocking::Blocker>>,
85 pub(crate) idx_segs: crate::ops_index::ShardSegs,
88 pub(crate) idx_reg: Option<Arc<crate::ops_index::IndexReg>>,
89 pub(crate) view_segs: crate::ops_view::ShardViews,
91 pub(crate) view_reg: Option<Arc<crate::ops_view::ViewReg>>,
92}
93
94impl Inner {
95 pub(crate) fn new(store: kevy_store::Store, aof: Option<Aof>) -> Self {
96 Inner {
97 store,
98 aof,
99 bus: PubsubBus::new(),
100 #[cfg(not(target_arch = "wasm32"))]
101 writer_source: None,
102 #[cfg(not(target_arch = "wasm32"))]
103 feed: None,
104 blocker: None,
105 idx_segs: crate::ops_index::ShardSegs::default(),
106 idx_reg: None,
107 view_segs: crate::ops_view::ShardViews::default(),
108 view_reg: None,
109 }
110 }
111}
112
113pub(crate) struct DropGuard {
117 pub(crate) reaper_stop: Option<Arc<AtomicBool>>,
118 pub(crate) reaper_join: Mutex<Option<JoinHandle<()>>>,
119 pub(crate) shards_for_flush: Shards,
120 #[cfg(not(target_arch = "wasm32"))]
125 pub(crate) replica_runner: Option<crate::replica_runner::ReplicaRunner>,
126 #[cfg(not(target_arch = "wasm32"))]
130 pub(crate) feed_close: Option<(
131 std::sync::Arc<Mutex<kevy_replicate::feed::FeedSource>>,
132 std::path::PathBuf,
133 )>,
134 #[cfg(not(target_arch = "wasm32"))]
139 pub(crate) replica_source: Option<crate::replica_source::ReplicaSource>,
140}
141
142impl Drop for DropGuard {
143 fn drop(&mut self) {
144 #[cfg(not(target_arch = "wasm32"))]
148 if let Some(r) = &self.replica_runner {
149 r.shutdown();
150 }
151 #[cfg(not(target_arch = "wasm32"))]
154 if let Some(rs) = &self.replica_source {
155 rs.shutdown();
156 }
157 if let Some(stop) = &self.reaper_stop {
160 stop.store(true, Ordering::Relaxed);
161 }
162 if let Some(j) = self
163 .reaper_join
164 .lock()
165 .unwrap_or_else(std::sync::PoisonError::into_inner)
166 .take()
167 {
168 let _ = j.join();
169 }
170 for shard in self.shards_for_flush.iter() {
171 let mut g = lock_write(shard);
172 if let Some(aof) = &mut g.aof {
173 let _ = aof.maybe_sync();
174 }
175 }
176 #[cfg(not(target_arch = "wasm32"))]
179 if let Some((feed, dir)) = &self.feed_close {
180 Store::feed_write_close_marker(feed, dir);
181 }
182 }
183}