pub struct Carrier<T> { /* private fields */ }
Expand description
A Carrier that manages the lifetime of an instance of type T
.
The carrier owns the instance (the target
). References to the target
can
be obtained by calling the create_ref
method. The
references returned by the method will be valid as long as the reference is
alive.
The carrier can be frozen, after which no new
references can be obtained. The carrier can also wait
for all references it gave out to be dropped. The ownership of target
will
be returned to the caller after the wait is complete. The caller can then
carry out clean-ups or any other type of work that requires an owned
instance of type T
.
use more_sync::Carrier;
// Create a carrier that holds a mutex.
let carrier = Carrier::new(std::sync::Mutex::new(7usize));
// Ask for a reference to the value held by the carrier.
let ref_one = carrier.create_ref().unwrap();
assert_eq!(*ref_one.lock().unwrap(), 7);
// Reference returned by Carrier can be sent to another thread.
std::thread::spawn(move || *ref_one.lock().unwrap() = 8usize);
// Close the carrier, no new references can be created.
carrier.freeze();
assert!(carrier.create_ref().is_none());
// Shutdown the carrier and wait for all references to be dropped.
// The value held by carrier is returned.
let mutex_value = carrier.wait();
// Destroy the mutex.
assert!(matches!(mutex_value.into_inner(), Ok(8usize)));
Implementations§
Source§impl<T> Carrier<T>
impl<T> Carrier<T>
Sourcepub fn create_ref(&self) -> Option<CarrierRef<T>>
pub fn create_ref(&self) -> Option<CarrierRef<T>>
Creates a reference to the owned instance. Returns None
if the carrier
has been frozen.
Sourcepub fn ref_count(&self) -> usize
pub fn ref_count(&self) -> usize
Returns the number of outstanding references created by this carrier.
The returned value is obsolete as soon as this method returns. The count can change at any time.
Sourcepub fn freeze(&self)
pub fn freeze(&self)
Closes this carrier.
No new references can be created after the carrier is frozen. A frozen carrier cannot be re-opened again.
Sourcepub fn is_frozen(&self) -> bool
pub fn is_frozen(&self) -> bool
Returns true
if the carrier has been frozen, false
otherwise.
For the same carrier, once this method returns true
it will never
return false
again.
Sourcepub fn wait(self) -> T
pub fn wait(self) -> T
Blocks the current thread until all references created by this carrier are dropped.
wait()
consumes the carrier and returns the owned
instance. It returns immediately if all references have been dropped.
Sourcepub fn wait_timeout(self, timeout: Duration) -> Result<T, Self>
pub fn wait_timeout(self, timeout: Duration) -> Result<T, Self>
Like wait()
, but waits for at most timeout
.
Returns Ok
and the owned instance if the wait was successful. Returns
Err(self)
if timed out. The reference count can change at any time. It
is not guaranteed that the number of references is greater than zero
when this method returns.
Sourcepub fn shutdown_timeout(self, timeout: Duration) -> Result<T, Self>
pub fn shutdown_timeout(self, timeout: Duration) -> Result<T, Self>
Like shutdown()
, but waits for at most
timeout
.
A freeze()
followed by a
wait_timeout()
. See the comments in those
two methods.