Implement object manager vertical slice (#69)
This commit is contained in:
@@ -118,6 +118,7 @@ struct ClientRuntime {
|
||||
caps_rate_limiter: Mutex<crate::caps_http::CapsRateLimiter>,
|
||||
network_manager: Mutex<std::sync::Weak<crate::network_manager::NetworkManagerInner>>,
|
||||
agent_manager: Mutex<std::sync::Weak<crate::agent_manager::AgentManagerInner>>,
|
||||
object_manager: Mutex<Option<Arc<crate::object_manager::ObjectManagerInner>>>,
|
||||
appearance_manager: Mutex<Option<Arc<crate::appearance_manager::AppearanceManagerInner>>>,
|
||||
avatar_manager: Mutex<Option<Arc<crate::avatar_manager::AvatarManagerInner>>>,
|
||||
animesh_manager: Mutex<Option<Arc<crate::animesh_runtime::AnimeshManagerInner>>>,
|
||||
@@ -152,6 +153,7 @@ impl ClientRuntime {
|
||||
caps_rate_limiter: Mutex::new(caps_rate_limiter),
|
||||
network_manager: Mutex::new(std::sync::Weak::new()),
|
||||
agent_manager: Mutex::new(std::sync::Weak::new()),
|
||||
object_manager: Mutex::new(None),
|
||||
appearance_manager: Mutex::new(None),
|
||||
avatar_manager: Mutex::new(None),
|
||||
animesh_manager: Mutex::new(None),
|
||||
@@ -238,6 +240,10 @@ impl ClientRuntime {
|
||||
.lock()
|
||||
.unwrap_or_else(std::sync::PoisonError::into_inner)
|
||||
.take();
|
||||
self.object_manager
|
||||
.lock()
|
||||
.unwrap_or_else(std::sync::PoisonError::into_inner)
|
||||
.take();
|
||||
self.http_caps_client
|
||||
.lock()
|
||||
.unwrap_or_else(std::sync::PoisonError::into_inner)
|
||||
@@ -629,6 +635,55 @@ impl GridClient {
|
||||
.unwrap_or_else(std::sync::PoisonError::into_inner) = Arc::downgrade(inner);
|
||||
}
|
||||
|
||||
pub(crate) fn cached_object_manager_inner(
|
||||
&self,
|
||||
) -> Option<Arc<crate::object_manager::ObjectManagerInner>> {
|
||||
self.runtime
|
||||
.object_manager
|
||||
.lock()
|
||||
.unwrap_or_else(std::sync::PoisonError::into_inner)
|
||||
.clone()
|
||||
}
|
||||
|
||||
pub(crate) fn cache_object_manager_inner(
|
||||
&self,
|
||||
inner: &Arc<crate::object_manager::ObjectManagerInner>,
|
||||
) {
|
||||
*self
|
||||
.runtime
|
||||
.object_manager
|
||||
.lock()
|
||||
.unwrap_or_else(std::sync::PoisonError::into_inner) = Some(Arc::clone(inner));
|
||||
}
|
||||
|
||||
pub(crate) fn install_object_manager_inner(
|
||||
&self,
|
||||
candidate: Arc<crate::object_manager::ObjectManagerInner>,
|
||||
) -> Arc<crate::object_manager::ObjectManagerInner> {
|
||||
let mut cached = self
|
||||
.runtime
|
||||
.object_manager
|
||||
.lock()
|
||||
.unwrap_or_else(std::sync::PoisonError::into_inner);
|
||||
if let Some(inner) = cached.as_ref() {
|
||||
return Arc::clone(inner);
|
||||
}
|
||||
*cached = Some(Arc::clone(&candidate));
|
||||
candidate
|
||||
}
|
||||
|
||||
pub(crate) fn native_objects(&self) -> Result<crate::ObjectManager, crate::Error> {
|
||||
if let Some(inner) = self.cached_object_manager_inner() {
|
||||
return Ok(crate::ObjectManager { inner });
|
||||
}
|
||||
crate::object_manager::ObjectManagerInner::new(Some(Arc::new(self.clone())))
|
||||
}
|
||||
|
||||
#[allow(clippy::needless_pass_by_value)]
|
||||
pub(crate) fn native_set_objects(&self, value: crate::ObjectManager) {
|
||||
self.cache_object_manager_inner(&value.inner);
|
||||
}
|
||||
|
||||
pub(crate) fn native_set_caps_rate_limiter(
|
||||
&mut self,
|
||||
value: crate::caps_http::CapsRateLimiter,
|
||||
|
||||
Reference in New Issue
Block a user