diff --git a/src/service/service.rs b/src/service/service.rs index bf3b891b..d0d8d940 100644 --- a/src/service/service.rs +++ b/src/service/service.rs @@ -3,7 +3,7 @@ use std::{ collections::BTreeMap, fmt::Write, ops::Deref, - sync::{Arc, OnceLock, RwLock}, + sync::{Arc, OnceLock, RwLock, Weak}, }; use async_trait::async_trait; @@ -53,7 +53,7 @@ pub(crate) struct Args<'a> { /// Circular-dependencies between services require this indirection. pub(crate) struct Dep { dep: OnceLock>, - service: Arc, + service: Weak, name: &'static str, } @@ -65,8 +65,14 @@ impl Deref for Dep { /// Dereference a dependency. The dependency must be ready or panics. fn deref(&self) -> &Self::Target { - self.dep - .get_or_init(|| require::(&self.service, self.name)) + self.dep.get_or_init(|| { + let service = self + .service + .upgrade() + .expect("services map exists for dependency initialization."); + + require::(&service, self.name) + }) } } @@ -75,7 +81,7 @@ impl Args<'_> { pub(crate) fn depend(&self, name: &'static str) -> Dep { Dep:: { dep: OnceLock::new(), - service: self.service.clone(), + service: Arc::downgrade(self.service), name, } }