tor-hsclient: Introduce helper function for locking services table
This commit is contained in:
parent
dedda8a590
commit
a35a1402ae
|
@ -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"))
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue