GuardMgr: Launch a background task to keep the list of bridge
descriptors updated as appropriate.
This commit is contained in:
parent
e93ee14270
commit
d395ae75a5
|
@ -116,3 +116,31 @@ pub(crate) async fn keep_netdir_updated<RT: tor_rtcompat::Runtime>(
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Background task to keep a guard manager up-to-date with a given bridge
|
||||
/// descriptor provider.
|
||||
#[cfg(feature = "bridge-client")]
|
||||
pub(crate) async fn keep_bridge_descs_updated<RT: tor_rtcompat::Runtime>(
|
||||
runtime: RT,
|
||||
inner: Weak<Mutex<GuardMgrInner>>,
|
||||
bridge_desc_provider: Weak<dyn crate::bridge::BridgeDescProvider>,
|
||||
) {
|
||||
use crate::bridge::BridgeDescEvent as E;
|
||||
let mut event_stream = match bridge_desc_provider.upgrade().map(|p| p.events()) {
|
||||
Some(s) => s,
|
||||
None => return,
|
||||
};
|
||||
|
||||
while let Some(event) = event_stream.next().await {
|
||||
match event {
|
||||
E::SomethingChanged => {
|
||||
if let Some(inner) = inner.upgrade() {
|
||||
let mut inner = inner.lock().expect("Poisoned lock");
|
||||
inner.update(runtime.wallclock());
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -394,7 +394,16 @@ impl<R: Runtime> GuardMgr<R> {
|
|||
let mut inner = self.inner.lock().expect("Poisoned lock");
|
||||
inner.bridge_desc_provider = Some(weak_provider.clone());
|
||||
}
|
||||
// TODO pt-client: launch a keep_bridge_descs_updated task.
|
||||
|
||||
let weak_inner = Arc::downgrade(&self.inner);
|
||||
let rt_clone = self.runtime.clone();
|
||||
self.runtime
|
||||
.spawn(daemon::keep_bridge_descs_updated(
|
||||
rt_clone,
|
||||
weak_inner,
|
||||
weak_provider,
|
||||
))
|
||||
.map_err(|e| GuardMgrError::from_spawn("periodic guard netdir updater", e))?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue