Implement native UDP transport reliability (#52)
This commit is contained in:
@@ -113,6 +113,7 @@ struct ClientRuntime {
|
||||
state: AtomicU8,
|
||||
cancellation: CancellationTokenSource,
|
||||
services: Mutex<Vec<ServiceRegistration>>,
|
||||
agent_throttle_sender: Mutex<Option<Arc<dyn crate::udp_transport::AgentThrottleSender>>>,
|
||||
shutdown_complete: Condvar,
|
||||
shutdown_wait: Mutex<()>,
|
||||
}
|
||||
@@ -132,6 +133,7 @@ impl ClientRuntime {
|
||||
})
|
||||
.collect(),
|
||||
),
|
||||
agent_throttle_sender: Mutex::new(None),
|
||||
shutdown_complete: Condvar::new(),
|
||||
shutdown_wait: Mutex::new(()),
|
||||
}
|
||||
@@ -200,6 +202,10 @@ impl ClientRuntime {
|
||||
}
|
||||
}
|
||||
services.clear();
|
||||
self.agent_throttle_sender
|
||||
.lock()
|
||||
.unwrap_or_else(std::sync::PoisonError::into_inner)
|
||||
.take();
|
||||
let shutdown_wait = self
|
||||
.shutdown_wait
|
||||
.lock()
|
||||
@@ -257,6 +263,41 @@ impl GridClient {
|
||||
self.runtime.register(service)
|
||||
}
|
||||
|
||||
/// Installs the network-owned callback used by mapped `AgentThrottle.Set`.
|
||||
///
|
||||
/// # Errors
|
||||
///
|
||||
/// Registration fails after client shutdown begins.
|
||||
pub fn set_agent_throttle_sender(
|
||||
&mut self,
|
||||
sender: Arc<dyn crate::udp_transport::AgentThrottleSender>,
|
||||
) -> Result<(), ClientCoreError> {
|
||||
let mut registered = self
|
||||
.runtime
|
||||
.agent_throttle_sender
|
||||
.lock()
|
||||
.unwrap_or_else(std::sync::PoisonError::into_inner);
|
||||
let state = self.lifecycle_state();
|
||||
if state != ClientLifecycleState::Active {
|
||||
return Err(ClientCoreError::InvalidLifecycle {
|
||||
operation: "register the agent throttle sender",
|
||||
state,
|
||||
});
|
||||
}
|
||||
*registered = Some(sender);
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub(crate) fn agent_throttle_sender(
|
||||
&self,
|
||||
) -> Option<Arc<dyn crate::udp_transport::AgentThrottleSender>> {
|
||||
self.runtime
|
||||
.agent_throttle_sender
|
||||
.lock()
|
||||
.unwrap_or_else(std::sync::PoisonError::into_inner)
|
||||
.clone()
|
||||
}
|
||||
|
||||
pub(crate) fn shutdown(&self) -> Result<(), ClientCoreError> {
|
||||
self.runtime.shutdown()
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user