use std::sync::Arc;
use std::sync::atomic::Ordering;
use super::daemon::Broker;
pub struct HttpActivityGuard {
broker: Arc<Broker>,
}
impl Drop for HttpActivityGuard {
fn drop(&mut self) {
self.broker.http_inflight.fetch_sub(1, Ordering::SeqCst);
self.broker.stamp_http_activity();
}
}
impl Broker {
pub fn stamp_http_activity(&self) {
self.last_http_ms
.store(self.started.elapsed().as_millis() as u64, Ordering::SeqCst);
}
pub fn begin_http_request(self: &Arc<Self>) -> HttpActivityGuard {
self.http_inflight.fetch_add(1, Ordering::SeqCst);
self.stamp_http_activity();
HttpActivityGuard { broker: self.clone() }
}
pub(crate) async fn host_read_stack(
self: &Arc<Self>,
root: &std::path::Path,
) -> anyhow::Result<Arc<crate::mcp::SharedReadStack>> {
let host = Arc::clone(&self.workspaces) as Arc<dyn crate::mcp::HostBackend>;
let git_history_host = Arc::clone(self) as Arc<dyn crate::git_history::remote::HistoryHost>;
self.workspaces
.get_or_build_serve_state(root, host, git_history_host)
.await
}
pub(crate) fn begin_workspace_conn(
&self,
root: &std::path::Path,
) -> Result<super::workspace_pool::ServeConnGuard, String> {
self.workspaces.begin_conn(root).map_err(|error| error.to_string())
}
}