Implement native AgentManager services (#59)
This commit is contained in:
@@ -117,6 +117,7 @@ struct ClientRuntime {
|
||||
http_caps_client: Mutex<crate::caps_http::HttpCapsClient>,
|
||||
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>>,
|
||||
shutdown_complete: Condvar,
|
||||
shutdown_wait: Mutex<()>,
|
||||
}
|
||||
@@ -144,6 +145,7 @@ impl ClientRuntime {
|
||||
http_caps_client: Mutex::new(http_caps_client),
|
||||
caps_rate_limiter: Mutex::new(caps_rate_limiter),
|
||||
network_manager: Mutex::new(std::sync::Weak::new()),
|
||||
agent_manager: Mutex::new(std::sync::Weak::new()),
|
||||
shutdown_complete: Condvar::new(),
|
||||
shutdown_wait: Mutex::new(()),
|
||||
}
|
||||
@@ -242,11 +244,24 @@ impl ClientRuntime {
|
||||
/// Construction is side-effect free: it creates no runtime, task, socket, or
|
||||
/// HTTP request. Network-facing services are attached explicitly and are owned
|
||||
/// until ordered shutdown or drop.
|
||||
#[derive(Clone)]
|
||||
pub struct GridClient {
|
||||
pub(crate) settings: Settings,
|
||||
pub(crate) time_provider: TimeProvider,
|
||||
runtime: Arc<ClientRuntime>,
|
||||
network_manager: Option<crate::NetworkManager>,
|
||||
agent_manager: Option<Box<crate::agent_manager::AgentManager>>,
|
||||
}
|
||||
|
||||
impl Clone for GridClient {
|
||||
fn clone(&self) -> Self {
|
||||
Self {
|
||||
settings: self.settings.clone(),
|
||||
time_provider: self.time_provider.clone(),
|
||||
runtime: Arc::clone(&self.runtime),
|
||||
network_manager: self.network_manager.clone(),
|
||||
agent_manager: None,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
@@ -353,6 +368,9 @@ impl GridClient {
|
||||
}
|
||||
|
||||
pub(crate) fn native_network(&self) -> Result<crate::NetworkManager, crate::Error> {
|
||||
if let Some(manager) = &self.network_manager {
|
||||
return Ok(manager.clone());
|
||||
}
|
||||
let mut cached = self
|
||||
.runtime
|
||||
.network_manager
|
||||
@@ -369,12 +387,44 @@ impl GridClient {
|
||||
}
|
||||
|
||||
#[allow(clippy::needless_pass_by_value)] // The mapped C# property setter owns its value.
|
||||
pub(crate) fn native_set_network(&self, value: crate::NetworkManager) {
|
||||
pub(crate) fn native_set_network(&mut self, value: crate::NetworkManager) {
|
||||
*self
|
||||
.runtime
|
||||
.network_manager
|
||||
.lock()
|
||||
.unwrap_or_else(std::sync::PoisonError::into_inner) = value.native_inner_weak();
|
||||
self.network_manager = Some(value);
|
||||
}
|
||||
|
||||
pub(crate) fn native_self(&mut self) -> &mut crate::agent_manager::AgentManager {
|
||||
if self.agent_manager.is_none() {
|
||||
let client = Arc::new(self.clone());
|
||||
let manager = crate::agent_manager::AgentManager::native_new(Some(client))
|
||||
.unwrap_or_else(|_| panic!("failed to construct AgentManager"));
|
||||
self.agent_manager = Some(Box::new(manager));
|
||||
}
|
||||
self.agent_manager.as_deref_mut().expect("agent manager")
|
||||
}
|
||||
|
||||
pub(crate) fn cached_agent_manager_inner(
|
||||
&self,
|
||||
) -> Option<Arc<crate::agent_manager::AgentManagerInner>> {
|
||||
self.runtime
|
||||
.agent_manager
|
||||
.lock()
|
||||
.unwrap_or_else(std::sync::PoisonError::into_inner)
|
||||
.upgrade()
|
||||
}
|
||||
|
||||
pub(crate) fn cache_agent_manager_inner(
|
||||
&self,
|
||||
inner: &Arc<crate::agent_manager::AgentManagerInner>,
|
||||
) {
|
||||
*self
|
||||
.runtime
|
||||
.agent_manager
|
||||
.lock()
|
||||
.unwrap_or_else(std::sync::PoisonError::into_inner) = Arc::downgrade(inner);
|
||||
}
|
||||
|
||||
pub(crate) fn native_set_caps_rate_limiter(
|
||||
@@ -416,7 +466,7 @@ impl fmt::Debug for GridClient {
|
||||
.field("lifecycle_state", &self.lifecycle_state())
|
||||
.field("services", &service_names)
|
||||
.field("time_provider", &self.time_provider)
|
||||
.finish()
|
||||
.finish_non_exhaustive()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -527,6 +577,8 @@ impl GridClientBuilder {
|
||||
http_caps_client,
|
||||
caps_rate_limiter,
|
||||
)),
|
||||
network_manager: None,
|
||||
agent_manager: None,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user