use std::sync::Arc;
use std::time::Duration;
use super::{
Monitor,
MonitorGuard,
WaitTimeoutResult,
WaitTimeoutStatus,
};
pub struct ArcMonitor<T> {
inner: Arc<Monitor<T>>,
}
impl<T> ArcMonitor<T> {
#[inline]
pub fn new(state: T) -> Self {
Self {
inner: Arc::new(Monitor::new(state)),
}
}
#[inline]
pub fn lock(&self) -> MonitorGuard<'_, T> {
self.inner.lock()
}
#[inline]
pub fn read<R, F>(&self, f: F) -> R
where
F: FnOnce(&T) -> R,
{
self.inner.read(f)
}
#[inline]
pub fn write<R, F>(&self, f: F) -> R
where
F: FnOnce(&mut T) -> R,
{
self.inner.write(f)
}
#[inline]
pub fn wait_notify(&self, timeout: Duration) -> WaitTimeoutStatus {
self.inner.wait_notify(timeout)
}
#[inline]
pub fn wait_while<R, P, F>(&self, waiting: P, f: F) -> R
where
P: FnMut(&T) -> bool,
F: FnOnce(&mut T) -> R,
{
self.inner.wait_while(waiting, f)
}
#[inline]
pub fn wait_until<R, P, F>(&self, ready: P, f: F) -> R
where
P: FnMut(&T) -> bool,
F: FnOnce(&mut T) -> R,
{
self.inner.wait_until(ready, f)
}
#[inline]
pub fn wait_timeout_while<R, P, F>(
&self,
timeout: Duration,
waiting: P,
f: F,
) -> WaitTimeoutResult<R>
where
P: FnMut(&T) -> bool,
F: FnOnce(&mut T) -> R,
{
self.inner.wait_timeout_while(timeout, waiting, f)
}
#[inline]
pub fn wait_timeout_until<R, P, F>(
&self,
timeout: Duration,
ready: P,
f: F,
) -> WaitTimeoutResult<R>
where
P: FnMut(&T) -> bool,
F: FnOnce(&mut T) -> R,
{
self.inner.wait_timeout_until(timeout, ready, f)
}
#[inline]
pub fn notify_one(&self) {
self.inner.notify_one();
}
#[inline]
pub fn notify_all(&self) {
self.inner.notify_all();
}
}
impl<T: Default> Default for ArcMonitor<T> {
#[inline]
fn default() -> Self {
Self::new(T::default())
}
}
impl<T> Clone for ArcMonitor<T> {
#[inline]
fn clone(&self) -> Self {
Self {
inner: self.inner.clone(),
}
}
}