#[cfg(feature = "read-tx-timeouts")]
#[cfg(feature = "read-tx-timeouts")]
use crate::tx::access::WeakRoTxPtr;
use crate::{MdbxError, MdbxResult, tx::RoTxPtr};
use std::{
sync::{Arc, Weak},
time::Duration,
};
#[cfg(feature = "read-tx-timeouts")]
pub(crate) struct RoInner {
owner: Option<Arc<RoTxPtr>>,
#[cfg(feature = "read-tx-timeouts")]
weak: WeakRoTxPtr,
}
impl RoInner {
pub(crate) fn new_owned(arc: Arc<RoTxPtr>) -> Self {
let weak = Arc::downgrade(&arc);
Self {
owner: Some(arc),
#[cfg(feature = "read-tx-timeouts")]
weak,
}
}
#[cfg(feature = "read-tx-timeouts")]
pub(crate) fn new_with_timeout(ptr: RoTxPtr, duration: Duration) -> Self {
let arc = Arc::new(ptr);
let weak = Arc::downgrade(&arc);
std::thread::spawn(move || {
std::thread::sleep(duration);
drop(arc);
});
Self { owner: None, weak }
}
pub(crate) fn owner(&self) -> Option<&Arc<RoTxPtr>> {
self.owner.as_ref()
}
#[cfg(feature = "read-tx-timeouts")]
pub(crate) fn weak(&self) -> &Weak<RoTxPtr> {
&self.weak
}
#[cfg(feature = "read-tx-timeouts")]
pub(crate) fn try_upgrade(&mut self) -> MdbxResult<()> {
if self.owner.is_some() {
return Ok(());
}
if let Some(arc) = self.weak.upgrade() {
self.owner = Some(arc);
return Ok(());
}
Err(MdbxError::ReadTransactionTimeout.into())
}
}