Implement object manager vertical slice (#69)
All checks were successful
Native code generation / deterministic (push) Successful in 14m47s
Imaging and meshing gate / native (push) Successful in 5m5s
Native Rust workspace compile / compile (push) Successful in 5m5s

This commit is contained in:
2026-08-10 14:32:46 +00:00
parent 43820f6bd1
commit 13f85bfa34
9 changed files with 3954 additions and 690 deletions

View File

@@ -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,