tor-hsclient: Introduce helper function for locking services table

This commit is contained in:
Ian Jackson 2023-06-22 12:51:47 +01:00
parent dedda8a590
commit a35a1402ae
2 changed files with 17 additions and 14 deletions

View File

@ -49,12 +49,13 @@ mod relay_info;
mod state;
use std::future::Future;
use std::sync::{Arc, Mutex};
use std::sync::{Arc, Mutex, MutexGuard};
use educe::Educe;
use tor_circmgr::hspool::HsCircPool;
use tor_circmgr::isolation::StreamIsolation;
use tor_error::{internal, Bug};
use tor_hscrypto::pk::HsId;
use tor_netdir::NetDir;
use tor_proto::circuit::ClientCirc;
@ -69,7 +70,7 @@ pub use keys::{
pub use relay_info::InvalidTarget;
use err::{rend_pt_identity_for_error, IntroPtIndex, RendPtIdentityForError};
use state::Services;
use state::{MockableConnectorData, Services};
/// An object that negotiates connections with onion services
///
@ -137,3 +138,14 @@ impl<R: Runtime> HsClientConnector<R, connect::Data> {
Services::get_or_launch_connection(self, netdir, hs_id, isolation, secret_keys)
}
}
impl<R: Runtime, D: MockableConnectorData> HsClientConnector<R, D> {
/// Lock the `Services` table and return the guard
///
/// Convenience method
fn services(&self) -> Result<MutexGuard<Services<D>>, Bug> {
self.services
.lock()
.map_err(|_| internal!("HS connector poisoned"))
}
}

View File

@ -307,10 +307,7 @@ fn obtain_circuit_or_continuation_info<D: MockableConnectorData>(
// block for handling inability to store
let stored = async {
let mut guard = connector
.services
.lock()
.map_err(|_| internal!("HS connector poisoned"))?;
let mut guard = connector.services()?;
let record = guard
.records
.by_index_mut(table_index)
@ -401,10 +398,7 @@ impl<D: MockableConnectorData> Services<D> {
let mut got;
let table_index;
{
let mut guard = connector
.services
.lock()
.map_err(|_| internal!("HS connector poisoned"))?;
let mut guard = connector.services()?;
let services = &mut *guard;
trace!("HS conn get_or_launch: {hs_id:?} {isolation:?} {secret_keys:?}");
@ -443,10 +437,7 @@ impl<D: MockableConnectorData> Services<D> {
}
}
let guard = connector
.services
.lock()
.map_err(|_| internal!("HS connector poisoned (relock)"))?;
let guard = connector.services()?;
got = obtain(table_index, guard);
}