forked from Orchid/orchid
Correctly halts
This commit is contained in:
@@ -57,6 +57,10 @@ impl fmt::Debug for SystemInstData {
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct System(pub(crate) Rc<SystemInstData>);
|
||||
impl System {
|
||||
#[must_use]
|
||||
pub async fn atoms(&self) -> impl std::ops::Deref<Target = HashMap<api::AtomId, WeakAtomHand>> {
|
||||
self.0.owned_atoms.read().await
|
||||
}
|
||||
#[must_use]
|
||||
pub fn id(&self) -> api::SysId { self.0.id }
|
||||
#[must_use]
|
||||
@@ -118,14 +122,17 @@ impl System {
|
||||
owned_g.insert(id, new.downgrade());
|
||||
new
|
||||
}
|
||||
pub(crate) fn drop_atom(&self, drop: api::AtomId) {
|
||||
pub(crate) fn drop_atom(&self, dropped_atom_id: api::AtomId) {
|
||||
let this = self.0.clone();
|
||||
(self.0.ctx.spawn)(Box::pin(async move {
|
||||
this.owned_atoms.write().await.remove(&drop);
|
||||
this.ext.reqnot().request(api::AtomDrop(this.id, dropped_atom_id)).await;
|
||||
this.owned_atoms.write().await.remove(&dropped_atom_id);
|
||||
}))
|
||||
}
|
||||
#[must_use]
|
||||
pub fn downgrade(&self) -> WeakSystem { WeakSystem(Rc::downgrade(&self.0)) }
|
||||
pub fn downgrade(&self) -> WeakSystem {
|
||||
WeakSystem(Rc::downgrade(&self.0), self.0.decl_id, self.ext().downgrade())
|
||||
}
|
||||
/// Implementation of [api::ResolveNames]
|
||||
pub(crate) async fn name_resolver(
|
||||
&self,
|
||||
@@ -174,10 +181,14 @@ impl Format for System {
|
||||
}
|
||||
}
|
||||
|
||||
pub struct WeakSystem(Weak<SystemInstData>);
|
||||
pub struct WeakSystem(Weak<SystemInstData>, api::SysDeclId, WeakExtension);
|
||||
impl WeakSystem {
|
||||
#[must_use]
|
||||
pub fn upgrade(&self) -> Option<System> { self.0.upgrade().map(System) }
|
||||
pub fn ext(&self) -> Option<Extension> { self.2.upgrade() }
|
||||
pub fn ctor(&self) -> Option<SystemCtor> {
|
||||
self.ext()?.system_ctors().find(|ctor| ctor.decl.id == self.1).cloned()
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Clone)]
|
||||
|
||||
Reference in New Issue
Block a user